创建帧动画
SpriteFrameCache 精灵缓冲池
第一种是读取plist文件到精灵缓冲池,获得每一帧的精灵帧,添加到Animation动画中,设置setDelayPerUnit 每一帧的时间,然后获得Animate 动作,最后播放动作
备注:怎么样才能获取plist文件里面的数量?通过判断获取到的是NULL对象来判断吗?
第二种是通过AnimationCache 管理动画的单例; 它用于缓存的动画,读取到的plist文件必须是带有animation这个key的;通过getAnimation获得指定的动画
读取骨骼动画
通过ArmatureDataManager,同步或者异步加载骨骼动画到ArmatureData里面,然后通过Armature进行创建动画,播放
cocostudio::ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("DemoPlayer0.png","DemoPlayer0.plist","DemoPlayer.ExportJson");
auto spritecache = SpriteFrameCache::getInstance();
spritecache->addSpriteFramesWithFile("grossini.plist");
auto animation3 = Animation::create();
Vector<SpriteFrame* >vectorSprite;
for (int i = 1; i <= 14; i++) {
SpriteFrame *temp = spritecache->spriteFrameByName(StringUtils::format("grossini_dance_%02d.png",i));
animation3->addSpriteFrame(temp);
}
animation3->setDelayPerUnit(1);
Animate *animatetest = Animate::create(animation3);
CCLOG("%d",spritecache->getReferenceCount());
auto cache = AnimationCache::getInstance();
cache->addAnimationsWithFile("animations-2.plist");
auto lunzi = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
lunzi->setPosition(Point(300, 300));
auto animation2 = cache->getAnimation("dance_1");
auto animate2 = Animate::create(animation2);
lunzi->runAction(RepeatForever::create(animatetest));
cocostudio::ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("DemoPlayer0.png","DemoPlayer0.plist","DemoPlayer.ExportJson");
cocostudio::Armature* armature = cocostudio::Armature::create("DemoPlayer");
armature->getAnimation()->playByIndex(0);
armature->setPosition(Point(400, 400));
this->addChild(lunzi);
this->addChild(armature);
骨骼动画的帧事件,通过动画制作的时候绑定到骨骼动画帧中,currentFrameIndex为第几帧触发,evt输出的是骨骼动画事件的名字
cocostudio::ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("chongwu.png", "chongwu.plist", "miaomiao.xml");
cocostudio::Armature* armature2 = cocostudio::Armature::create("miaomiao");
armature2->getAnimation()->playByIndex(1);
armature2->setPosition(Point(500, 500));
(armature2->getAnimation())->setFrameEventCallFunc(this,cocostudio::SEL_FrameEventCallFunc(&HelloWorld::onFrameEvent));
void HelloWorld::onFrameEvent(cocostudio::Bone * bone, const std::string & evt, int originFrameIndex, int currentFrameIndex)
{
auto bonedata =bone->getBoneData();
CCLOG("bone x=%f,y=%f", bonedata->x, bonedata->y);
CCLOG("evt =%s", evt.c_str());
CCLOG("originFrameIndex=%d", originFrameIndex);
CCLOG("currentFrameIndex=%d", currentFrameIndex);
}