cstriker1407的笔记本

好记性不如铅笔头

C && C++, cocos2dx, 编程

cocos2dx学习笔记:CCArmatureDataManager代码的简单使用和简单分析

最近美术那边用CocoStudio给了个骨骼动画,正好学习下CCArmatureDataManager的简单使用方式。

参考代码【 TestCpp 工程 / ExtensionsTest / CocoStudioArmatureTest / ArmatureScene.cpp 】

同步加载:

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 】类还是有很多东西的,后面有时间需要好好笔记下。这里就先这样吧~

Leave a Reply

4 + 9 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Theme by Anders Norén

苏ICP备16032087号