为了满足开发者需求,静态的精灵是无法表达出什么的,很多游戏中的角色都有自己的帧动画来表达不同状况的下该表现出的动作表现,这个时候就需要用到Cocos2dx中实现帧动画的一种策略,就是换帧精灵。
所谓换帧精灵是指每一个精灵不是仅含又一副贴图,而是含有一系列的贴图,这一系列画面连续播放就可以产生帧动画效果。
想要开发出由多个动画帧组成的换帧精灵,首先要明白代表精灵帧的类SpriteFrame。每个SpriteFrame代表了一个精灵动画帧。
SpriteFrame类的一些方法:
①创建、初始化SpriteFrame
static SpriteFrame* create(const std::string& filename,const Rect& rect) //创建一个精灵帧对象,参数一是图片路径,参数二是确定矩形区域并从图片中剪出来作为精灵帧显示的内容。
static SpriteFrame* create(const std::string& filename,const Rect& rect,bool rotated,const Point& oferrset,const Size& originalSize) //创建一个精灵帧对象,参数一是图片路径,参数二是确定矩形区域并从图片中剪出来作为精灵帧显示的内容,参数三是是否旋转,参数四是精灵帧偏移量,参数无表示修剪前的原始像素尺寸。
static SpriteFrame* createWithTexture(Texture2D* pobTexture,const Rect& rect) //创建一个精灵帧对象,参数一是纹理图缓存,参数二是确定矩形区域并从图片中剪出来作为精灵帧显示的内容。
static SpriteFrame* createWithTexture(Texture2D* pobTexture,const Rect& rect,bool rotated,const Point& oferrset,const Size& originalSize)//创建一个精灵帧对象,参数一是纹理图缓存,参数二是确定矩形区域并从图片中剪出来作为精灵帧显示的内容,参数三是是否旋转,参数四是精灵帧偏移量,参数无表示修剪前的原始像素尺寸。
bool initWithTexture(Texture2D* pobTexture,const Rect& rect) //初始化一个精灵对象,参数一是纹理图缓存,参数二是确定矩形区域并从图片中剪出来作为精灵帧显示的内容。
bool initWithTexture(Texture2D* pobTexture,const Rect& rect,bool rotated,const Point& oferrset,const Size& originalSize)初始化一个精灵对象,参数一是纹理图缓存,参数二是确定矩形区域并从图片中剪出来作为精灵帧显示的内容,参数三是是否旋转,参数四是精灵帧偏移量,参数无表示修剪前的原始像素尺寸。
bool initWithTextureFilename(const std::string& filename,const Rect& rect,bool rotated,const Point& oferrset,const Size& originalSize)初始化一个精灵对象,参数一是图片路径,参数二是确定矩形区域并从图片中剪出来作为精灵帧显示的内容,参数三是是否旋转,参数四是精灵帧偏移量,参数无表示修剪前的原始像素尺寸。
②功能方法
const Rect& getRect() //获取剪裁矩形区域。
void setRect(const Rect& rect) //设置剪裁区域。
cosnt Point& getOffsetInPixels(void) //获取以像素为单位的精灵帧位置偏移量。
void setOffsetInPixels(const Point& offsetInPixels) //设置以像素为单位的精灵帧偏移量。
const Size& getOriginalSizeInPixels(void) //获取精灵帧原始像素。
void setOriginalSizeInPixels(const Size& sizeInPixels) //设置精灵帧在修剪之前的原始尺寸,参数一是要设置的目标尺寸。
bool isRotated(void) //获取精灵帧是否旋转并将结果返回。
void setRotated(bool rotated) //设置精灵帧是否旋转,参数一是true时旋转。
Texture2D * getTextrue() //获取精灵帧对应的纹理图。
void setTexture(Texture2D* pobTexture) //获取精灵帧对应的纹理图,参数一是纹理图缓存。
对精灵帧的封装,动画帧AnimationFrame,通过其可以对每一帧动画进行更细致的控制,有需要的时候可以用,无必要可以直接使用精灵帧
AnimationFrame基本方法:
static AnimationFrame* create(SpriteFrame* spriteFrame,float delayUnits,const ValueMap& userInfo) //创建一个动画帧对象,参数一是精灵帧指针,参数二是动画帧时间间隔,参数三是用户数据。
SpriteFrame* getSpriteFrame() //获取包含的精灵帧对象。
void setSpriteFrame(SpriteFrame* frame) //设置包含的精灵类帧对象。
但精灵帧不过只是一个画面,要将一系列的帧组装成动画,Animation类绝不可少。
Animation中常用的方法
static Animation* createWithSpriteFrames(const Vector<SpriteFrame*>& arrayOfSpriteFrameNames,float delay=0.0f,unsigned int loops=1) //创建一个精灵帧动画对象,参数一是存放多个精灵帧的容器,第二参数表示精灵帧之间的时间间隔,参数三是循环次数。
static Animation* create(const Vector<AnimationFrame*>& arrayOfSpriteFrameNames,float delayPerUnit,unsigned int loops=1) //创建一个精灵帧动画对象,参数一是存放多个精灵帧的容器,第二参数表示各单元的时间间隔,参数三是循环次数。
void addSpriteFrame(SpriteFrame * frame) //向动画中添加一个精灵帧。
void addSpriteFrameWithFile(const std::string& filename) //向动画添加一个精灵帧,参数为文件路径。
void addSpriteFrameWithTexture(Texture2D* pobTexture,const Rect& rect) //想动画添加精灵帧,参数一是纹理图缓存,参数二是裁剪区域。
void setDelayPerUnit(float delayPerUnit) //设置每个单元间间隔。
float getDelayPerUnit() //获取每个单元间间隔。
bool getRestoreOriginalFrame() //判断在动画结束时是否恢复原始帧。
void setRestoreOriginalFrame(bool restoreOriginalFrame) //设置在动画结束识是否恢复原始帧,参数ture时恢复。
将各个SpriteFrame组装成Animation后,需要一个动作类去包装运行Animation。而这个类就是Animate。
Animate是ActionInterval的子类,属于有变化过程动作,其相关方法如下。
static Animate* create(Animation* animation) //创建一个动画动作对象,参数是Animation类指针。
void setAnimation(Animation* animation) //设置该动作要播放的帧动画。
Animation* getAnimation() //获取播放的帧动画。
如何播放精灵帧动画实例:
Sprite* sprite = Sprite::create("a.png");//创建精灵实例
SpriteFrame* frame1 = SpriteFrame::create("a.png");//创建动画帧1
SpriteFrame* frame2 = SpriteFrame::create("b.png");//创建动画帧1
Vector<SpriteFrame*> frameGroup;//创建一个存放精灵帧的容器
frameGroup->push(frame1);
frameGroup->push(frame2);
Animation* animation = Animation::create(frameGroup,0.1f,5);//创建一个以容器frameGroup内的精灵帧做的动画,每帧间隔0.1秒,循环5次。
sprite->runAction(Animate::create(animation)); //运行播放动画动作,播放帧动画。