我们知道,cocos支持大部分的动画,包括spine,plist,以及通过studio制作生成的csd动画,本文主要谈谈在C++代码中如何播放通过studio制作完成的csd动画。
1.studio中,动画的制作支持的比较完善,可以是帧动画,可以是骨骼动画,也可以是混合动画,这些作为前端程序来说,一般是不需要去关注的(后续我会写一些动画制作相关的文章)。我们需要知道的是,在studio中制作成的动画,发布后,会以后缀为csb的二进制文件形式进行读取。那么,我们的程序中首先要做的第一步就是去加载,代码如下:
// 播放csd生成的动画
// 参数1:播放csd生成的动画的节点;
// 参数2:csd文件路径;
// 参数3:添加到节点的位置,默认为0点
// 参数4:是否循环播放
void playCSDAnimation(Node* node, const std::string& key, Vec2 positon = Vec2::ZERO, bool isrepeat = false,float scale = 1.0f);
// 如果动画播放玩以后,需要下一步的逻辑处理,可以继承PlayAnimation类,对animationCompleteCallFunc进行重写
virtual void animationCompleteCallFunc(Node* node, const std::string& key);
void PlayAnimation::playCSDAnimation(Node* node, const std::string& key, Vec2 positon, bool isrepeat, float scale)
{
Node* aninode = nullptr;
if (key != "")
{
aninode = CSLoader::createNode(key);// 创建播放csd动画的node
}
if (aninode == nullptr)
{
LOG("AnimationConfig Loading %s error", key.c_str());
}
else
{
node->addChild(aninode);// 添加刚创建好的node
aninode->setScale(scale);
aninode->setPosition(positon);
aninode->setName(key);
cocostudio::timeline::ActionTimeline* action = CSLoader::createTimeline(key);
if (action != nullptr)
{
action->gotoFrameAndPlay(0, isrepeat);// node去播放动画
action->setLastFrameCallFunc(CC_CALLBACK_0(PlayAnimation::animationCompleteCallFunc, this, node, key));
aninode->runAction(action);
}
}
}
// 动画播放完以后的回调
void PlayAnimation::animationCompleteCallFunc(Node* node, const std::string& key)
{
if (node->getChildByName(key))
{
node->getChildByName(key)->setVisible(false);
node->removeChildByName(key);
}
}
2.上述是基本的创建播放流程,对于特殊一些的处理
action->setTag(SearchAni);// 动画Tag
action->play("seeking", true);//通过动画的名称来播放动画,参数二为是否循环播放
action->setTimeSpeed(0.4f);// 控制动画播放速度
3.如果你需要播放的动画本身就处于你所加载的csd中,那么,你可以不需要创建专门的节点去播放,如下:
timeline::ActionTimeline *action = CSLoader::createTimeline("animation");
if (action != nullptr)
{
this->runAction(action);// 直接通过this去播放
action->gotoFrameAndPlay(0, true);
}
4.当遇到相同的动画需要同时播放多次的时候,由于csd动画的播放都需要对应的节点去能播放(目前我发现的是这样的,
如果大神有好的处理或者新的发现,麻烦告知),所以我们需要创建多个节点去播放动画,这点要切记,不然会出现意想不到的
效果。如下,创建两个node,两个action,对应去播放
Node* node = CSLoader::createNode(“Animation”);
this->addChild(node);
cocostudio::timeline::ActionTimeline* action = CSLoader::createTimeline(“Animation”);
if (action != nullptr)
{
action->gotoFrameAndPlay(0, false);
node->runAction(action);
}
Node* node1 = CSLoader::createNode(“Animation”);
this->addChild(node1);
cocostudio::timeline::ActionTimeline* action1 = CSLoader::createTimeline(“Animation”);
if (action1 != nullptr)
{
action1->gotoFrameAndPlay(0, false);
node1->runAction(action1);
}