cocosstudio3.0版本以上动画在C++中使用浅析

来源:互联网 发布:用ps淘宝详情页怎么做 编辑:程序博客网 时间:2024/03/29 13:56

我们知道,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(node
1);
cocostudio::timeline::ActionTimeline* action
1 = CSLoader::createTimeline(“Animation”);
if (action
1 != nullptr)
{
action
1->gotoFrameAndPlay(0, false);
node
1->runAction(action1);
}

阅读全文
1 0
原创粉丝点击