利用SpriteFrameCache手动构造动画创建器
在刚开始接触c2d的时候,很多小伙伴并不知道如何让一个精灵逐帧播放而形成一个动作。
这篇博客就是来简单介绍如何利用帧缓存手动创建一个动画创建器。
(一)首先把所用到的景精灵帧利用TexturePacket等工具制成大图以及plist文件;
plist文件里面包含着每一帧精灵纹理的名字,坐标以及宽高,只要把plist文件加载到精灵帧缓存里,cocos就会自动帮你把大图重新分割成数张精灵帧,以供我们在之后的开发中调用。具体操作如下:
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("xxxx.plist");
// plist文件应该存放在Resource文件夹中,否则寻址路径要改变
(二)创建动画创建器ActionTool的.h和.cpp文件
这个两个文件主要用来存放我们的动画创建器这个类,类里面封装着手动创建精灵帧动画的方法。
ActionTool.h:
其中frameName是精灵帧的名字,例如有精灵奔跑帧run1到run11,那么frameName就是指run。
iloops是指有多少帧,如果知道数目则填上帧的数目,若否则填-1让系统自己判断下一帧是否为空。
delay是这个帧动画的播放时长。
#ifndef ActionTool_H__ // 避免重定义
#define ActionTool_H__
#include "cocos2d.h" // 引入cocos2d的头文件
USING_NS_CC; // cocos的名称空间
class ActionTool { // 动画创建器类
public:
static Animate* animationWithFrameName(const char *frameName, int iloops, float delay);
// 动画创建方法
};
ActionTool.cpp
首先科普一下:
(1)Animation:用于存储动画相关的信息。其中包含用于动画的所有动画帧信息,单位帧的时间间隔,总帧数,动画重复次数等等信息。
(2)Animate :用于创建动画的Action动作,需要Animation作为创建的参数。
PS:Animation 只是存放了动画需要的数据信息。而执行动画还是需要 Animate。
所以实现动画构造函数:首先创建一个动作Animation*的变量,和一个空的精灵帧。在iloops等于-1的情况下,我们就从第一帧开始在帧缓存里面循环遍历,若存在该帧,则加载进animation中,若已经没有了,则结束循环。至于iloops为具体数目时,只要从1循环到iloop,然后同样把帧存放进animation就可以了。
然后,只要设置一些animation的基本属性,接着利用它create一个动画类Animate*并返回就可以了。之后我们只需要调用你所选中的精灵的runAction()方法,并把利用ActionTool得到的Animate*类型的返回值作为参数放进runAction(Animate*)就可以看到效果了。具体代码如下:
Animate* ActionTool::animationWithFrameName(const char *frameName, int iloops, float delay)
{
SpriteFrame* frame = NULL;
// 定义一个空的帧
Animation* animation = Animation::create();
// 定义一个空的动作
int index = 1;
// 遍历具有frameName特征的图片帧,从第一张开始
if (iloops == -1)
{
do
{
String * name = String::createWithFormat("%s%d.png", frameName, index++);
// 当前是第index帧
frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(name->getCString());
//帧缓存存储一个帧到frame里面
if (frame == NULL)
{
break;
}
animation->addSpriteFrame(frame);
//把一个帧存进去动画里
} while (true);
}
else
{
do
{
String * name = String::createWithFormat("%s%d.png", frameName, index++);
// 当前是第index帧
frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(name->getCString());
//帧缓存存储一个帧到frame里面
if (frame == NULL)
{
break;
}
animation->addSpriteFrame(frame);
//把一个帧存进去动画里
} while (true);
}
// 设置Animation的一些基本属性
animation->setDelayPerUnit(delay);
//帧的时间间隔
animation->setRestoreOriginalFrame(true);
//动画结束的时候是否返回原始的一帧
Animate* animate = Animate::create(animation);
// 返回一个Animate动画
return animate;
}