注意:使用骨骼动画最好使用NDKr10d,使用r9d在android5.0以上手机运行不了,使用r10d编译可能会报以下错误:
requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC
解决方法:在Application.mk中,将前面两句改为: APP_STL := gnustl_static
NDK_TOOLCHAIN_VERSION=4.8
一、加入Dragonbones支持
二、加载文件
DBCCFactory::getInstance()->loadDragonBonesData("fileName/skeleton.xml", "fileName");
DBCCFactory::getInstance()->loadTextureAtlas("fileName/texture.xml", "fileName");
三、调用动画
DBCCArmatureNode * _armatureNode = nullptr;
this->setOpacity(0);//原来的设置不可见
if(this->getChildByName(ARMATURENODE)){
dynamic_cast<DBCCArmatureNode*>(this->getChildByName(ARMATURENODE))->getAnimation()->gotoAndPlay("动作名称");
}else {
_armatureNode = DBCCFactory::getInstance()->buildArmatureNode("fla_tianshu");
_armatureNode->setName(ARMATURENODE);
_armatureNode->setScale(0.5);
_armatureNode->setPosition(_VEC2(33, 42));//设置位置
this->addChild(_armatureNode);
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
}
if(_armatureNode){
_armatureNode->getCCEventDispatcher()->addCustomEventListener(EventData::COMPLETE, CC_CALLBACK_1(eventHandler, this));//非循环动作结束监听
_armatureNode->getCCEventDispatcher()->addCustomEventListener(EventData::LOOP_COMPLETE, CC_CALLBACK_1(eventHandler, this));//循环动作结束监听
}
this->setOpacity(0);//原来的设置不可见
if(this->getChildByName(ARMATURENODE)){
dynamic_cast<DBCCArmatureNode*>(this->getChildByName(ARMATURENODE))->getAnimation()->gotoAndPlay("动作名称");
}else {
_armatureNode = DBCCFactory::getInstance()->buildArmatureNode("fla_tianshu");
_armatureNode->setName(ARMATURENODE);
_armatureNode->setScale(0.5);
_armatureNode->setPosition(_VEC2(33, 42));//设置位置
this->addChild(_armatureNode);
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
}
if(_armatureNode){
_armatureNode->getCCEventDispatcher()->addCustomEventListener(EventData::COMPLETE, CC_CALLBACK_1(eventHandler, this));//非循环动作结束监听
_armatureNode->getCCEventDispatcher()->addCustomEventListener(EventData::LOOP_COMPLETE, CC_CALLBACK_1(eventHandler, this));//循环动作结束监听
}
四、监听动作结束
void eventHandler(EventCustom *event)
{
char *stands[] = {"z_stand", "z_stand_b"};
EventData *eventData = (EventData*)(event->getUserData());
if (eventData){
DBCCArmatureNode * _armatureNode = dynamic_cast<DBCCArmatureNode*>(this->getChildByName(ARMATURENODE));
if(!_armatureNode){
CCASSERT(_armatureNode != nullptr, "_armatureNode is null");
return ;
}
switch(eventData->getType()){
case EventData::EventType::COMPLETE:{
if(this->getEnemyType()==EnemyType8){
if(eventData->animationState->name.compare("z_walk") == 0){
if(this->gethandState()==HandTypeLeft){
_armatureNode->getAnimation()->gotoAndPlay("z_skill_z");
}else if(this->gethandState()==HandTypeRight){
_armatureNode->getAnimation()->gotoAndPlay("z_skill_y");
}else{
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
}
}else if(eventData->animationState->name.compare("z_skill_z") == 0||eventData->animationState->name.compare("z_skill_y") == 0||eventData->animationState->name.compare("z_dizzy_over")==0){
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
}
}else{
if(eventData->animationState->name.compare("z_walk") == 0||eventData->animationState->name.compare("z_dizzy_over")==0){
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
}
if(eventData->animationState->name.compare("z_stand_e_z") == 0||eventData->animationState->name.compare("z_stand_e_y") == 0||eventData->animationState->name.compare("z_stand_e_ting_y") == 0||eventData->animationState->name.compare("z_stand_e_ting_z") == 0){
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
this->setchattingState(ChatType0);//修改聊天状态
}
if(eventData->animationState->name.compare("z_skill_start_b")==0){
_armatureNode->getAnimation()->gotoAndPlay("z_skill_start_c");
}
}
}break;
case EventData::EventType::LOOP_COMPLETE:{
if(eventData->animationState->name.compare("z_stand_c")==0){
NotificationCenter::getInstance()->postNotification(Enemy_FALL_WATER, this);
}else if(this->getEnemyState() != EnemyState2&&eventData->animationState->name.compare("z_target") != 0){
int index = rand()%10;
if(index==1){
_armatureNode->getAnimation()->gotoAndPlay(stands[index]);
}else{
_armatureNode->getAnimation()->gotoAndPlay(stands[0]);
}
}
if(eventData->animationState->name.compare("z_skill_start_c")==0){
_armatureNode->getAnimation()->gotoAndPlay("z_skill_start_c");
}
}break;
}
}
}
{
char *stands[] = {"z_stand", "z_stand_b"};
EventData *eventData = (EventData*)(event->getUserData());
if (eventData){
DBCCArmatureNode * _armatureNode = dynamic_cast<DBCCArmatureNode*>(this->getChildByName(ARMATURENODE));
if(!_armatureNode){
CCASSERT(_armatureNode != nullptr, "_armatureNode is null");
return ;
}
switch(eventData->getType()){
case EventData::EventType::COMPLETE:{
if(this->getEnemyType()==EnemyType8){
if(eventData->animationState->name.compare("z_walk") == 0){
if(this->gethandState()==HandTypeLeft){
_armatureNode->getAnimation()->gotoAndPlay("z_skill_z");
}else if(this->gethandState()==HandTypeRight){
_armatureNode->getAnimation()->gotoAndPlay("z_skill_y");
}else{
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
}
}else if(eventData->animationState->name.compare("z_skill_z") == 0||eventData->animationState->name.compare("z_skill_y") == 0||eventData->animationState->name.compare("z_dizzy_over")==0){
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
}
}else{
if(eventData->animationState->name.compare("z_walk") == 0||eventData->animationState->name.compare("z_dizzy_over")==0){
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
}
if(eventData->animationState->name.compare("z_stand_e_z") == 0||eventData->animationState->name.compare("z_stand_e_y") == 0||eventData->animationState->name.compare("z_stand_e_ting_y") == 0||eventData->animationState->name.compare("z_stand_e_ting_z") == 0){
_armatureNode->getAnimation()->gotoAndPlay("z_stand");
this->setchattingState(ChatType0);//修改聊天状态
}
if(eventData->animationState->name.compare("z_skill_start_b")==0){
_armatureNode->getAnimation()->gotoAndPlay("z_skill_start_c");
}
}
}break;
case EventData::EventType::LOOP_COMPLETE:{
if(eventData->animationState->name.compare("z_stand_c")==0){
NotificationCenter::getInstance()->postNotification(Enemy_FALL_WATER, this);
}else if(this->getEnemyState() != EnemyState2&&eventData->animationState->name.compare("z_target") != 0){
int index = rand()%10;
if(index==1){
_armatureNode->getAnimation()->gotoAndPlay(stands[index]);
}else{
_armatureNode->getAnimation()->gotoAndPlay(stands[0]);
}
}
if(eventData->animationState->name.compare("z_skill_start_c")==0){
_armatureNode->getAnimation()->gotoAndPlay("z_skill_start_c");
}
}break;
}
}
}