基本的工具类分析和实现
由于我们的游戏内容和属性决定我们游戏中的主角和游戏中怪物会有各种动作,这些动作的创建我这里采用帧动画的形式,因此对于众多的动作,有一个专门的动画创建器是必须而且有利于减少代码的重复的,下面是关于帧动画(Frame By Frame),其基本的解释是
在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。
比如下面主角跑动作的动画帧:
需要注意的是这些动画帧的命名规律。
关于帧动画:
这里的帧缓存是指我们将游戏的图片帧资源进行打包预加载进入游戏缓存,这部分会在后面的课程中详细讲解,这里不详细赘述。
下面就是动画创建器的一些关键部分的代码:
头文件:
Cpp文件
#include "ActionRool.h"
Animate* ActionTool::animationWithFrameName(const char *each_name, int iloops, float delay)
{
SpriteFrame* frame = NULL;
Animation* animation= Animation::create();
int index = 1;
do
{
String *name = String::createWithFormat("%s%d",each_name,index++);
frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(name->getCString());
if(frame == NULL)
{
break;
}
animation->addSpriteFrame(frame);
}while(true);
animation->setDelayPerUnit(delay);//帧时间间隔
animation->setRestoreOriginalFrame(true);//是否播放完毕后返回到原始的一帧
//@param restoreOriginalFrame Whether to restore the original frame when animation finishes.
Animate* animate = Animate::create(animation);
return animate;
}
Animate* ActionTool::animationWithFrameAndNum(const char *frameName, int framecount, float delay)
{
SpriteFrame* frame = NULL;
Animation* animation= Animation::create();
for(int index = 1; index <= framecount; index++)
{
String *name = String::createWithFormat("%s%d",frameName,index++);
frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(name->getCString());
animation->addSpriteFrame(frame);
}
animation->setDelayPerUnit(delay);
animation->setRestoreOriginalFrame(true);
Animate* animate = Animate::create(animation);
return animate;
}