最近美术那边用CocoStudio给了个骨骼动画,正好学习下CCArmatureDataManager的简单使用方式。
参考代码【 TestCpp 工程 / ExtensionsTest / CocoStudioArmatureTest / ArmatureScene.cpp 】
CONTENTS
同步加载:
CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("armature/Dragon.png", "armature/Dragon.plist", "armature/Dragon.xml"); CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("armature/Cowboy.ExportJson");
代码简单分析:
void CCArmatureDataManager::addArmatureFileInfo(const char *configFilePath) { addRelativeData(configFilePath);//==>>查找之前已经加载过,如果没有,那么就新建一个节点用来存储本次加载的信息。 //==>>是否自动加载plist和png文件,这个变量主要用在【CCDataReaderHelper】类中被使用。 m_bAutoLoadSpriteFile = true; //==>>读取文件。首先判断是否已经读取过,如果没有才回继续读。 CCDataReaderHelper::sharedDataReaderHelper()->addDataFromFile(configFilePath); } void CCArmatureDataManager::addArmatureFileInfo(const char *imagePath, const char *plistPath, const char *configFilePath) { addRelativeData(configFilePath); m_bAutoLoadSpriteFile = false; CCDataReaderHelper::sharedDataReaderHelper()->addDataFromFile(configFilePath); //==>>如果m_bAutoLoadSpriteFile为false,那么CCDataReaderHelper不会自动加载对应的plist和png文件,因此这里需要手动的将两个文件放到缓存中。 addSpriteFrameFromFile(plistPath, imagePath, configFilePath); }
异步加载:
CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfoAsync("armature/Dragon.png", "armature/Dragon.plist", "armature/Dragon.xml", this, schedule_selector(TestAsynchronousLoading::dataLoaded)); CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfoAsync("armature/Cowboy.ExportJson", this, schedule_selector(TestAsynchronousLoading::dataLoaded)); void TestAsynchronousLoading::dataLoaded(float percent) { CCLabelTTF *label = (CCLabelTTF *)getChildByTag(10001); if (label) { char pszPercent[255]; sprintf(pszPercent, "%s %f", subtitle().c_str(), percent * 100); label->setString(pszPercent); } if (percent >= 1 && backItem && restartItem && nextItem) { backItem->setEnabled(true); restartItem->setEnabled(true); nextItem->setEnabled(true); } }
这里的percent计算方式:
percent = (总数 - 未完成数)/ 总数
具体的实现代码可以参考【 CCDataReaderHelper::addDataAsyncCallBack(float dt) 】这个函数,这里就不笔记了。
简单使用方法:
加载好之后,就可以使用:
cocos2d::extension::CCArmature *armature = cocos2d::extension::CCArmature::create("Dragon"); //==>>CCArmature继承自CCNode,因此可以直接调用action的相关方法。 armature->stopAllActions(); armature->runAction(CCSequence::create(actionToRight, CCCallFunc::create(this, callfunc_selector(TestAnimationEvent::callback1)), NULL)); //==>>如果要调用CCArmature内部的骨骼动画,简单的调用如下: armature->getAnimation()->play("Walk"); armature->getAnimation()->playByIndex(0);//==>>内部调用了play //==>>CCArmatureAnimation【armature->getAnimation()】类有很多方法,这里就不笔记了,随用随记吧。
如果一个CCArmature有两个骨骼动画【A】和【B】,如果想要【A】跑完之后直接跑【B】,可以设置一个回调函数来实现:
armature->getAnimation()->setMovementEventCallFunc(this, movementEvent_selector(TestAnimationEvent::animationEvent)); armature->getAnimation()->play("A"); void TestAnimationEvent::animationEvent(cocos2d::extension::CCArmature *armature, MovementEventType movementType, const char *movementID) { if (movementType == COMPLETE) { if (id.compare("A") == 0) { armature->getAnimation()->play("B"); armature->getAnimation()->setMovementEventCallFunc(NULL, NULL); } } }
备注:
【 CCArmatureAnimation 】类还是有很多东西的,后面有时间需要好好笔记下。这里就先这样吧~
发表评论