精灵动画(Animation)

目前位置,我们使用的精灵都是静态的单帧图片,有的时候,我们需要拥有一个动态的精灵。那么我们需要创建一个动画帧组成的序列动画,cocos2d-x提供了一个Animation类描述一个动画

获得序列图片

大多数时候,我们拥有的多为gif素材,cocos2d-x本身是不支持gif素材的,我们需要先拆分素材成单帧序列图片

通过PS软件拆分gif动画
image.png
首先将我们的gif动画拖入ps中 (补充:其实ps也能用相同的方法导入部分支持的视频文件)

image.png
选择文件>导出>渲染视频 (这里的渲染视频不一定指渲染视频,也可以利用此功能渲染单帧序列图)
image.png
结果如图所示
image.png

获得plist文件

我们使用的软件为TexturePackerGUI 官网下载链接

该软件官方有免费的普通版,目前我们只需要基础功能,所以不需要pro版本
image.png
点击发布精灵表后,你应该得到两个文件
image.png

cocos中创建精灵帧动画

一个精灵来播放动画需要三部分,首先,精灵播放的类为Animate,该类可以被精灵播放,而创建Animate类需要有Animation动画信息,Animation中保存着各种帧的信息,而创建Animation类,我们需要一个精灵帧缓冲来导入创建每一帧

精灵帧缓冲

  1. //通过精灵帧动画来显示gif动图
  2. //使用SpriteFrameCache(精灵帧缓冲)从文件中读取指定的精灵帧,创建精灵对象
  3. //SpriteFrameCache *frameCache = SpriteFrameCache::getInstance();
  4. //frameCache->addSpriteFramesWithFile("gif1/1.plist", "gif1/1.png");
  5. //1.png里集合了分解成帧的小图
  6. SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Animation/sprite.plist", "Animation/sprite.png");

创建帧动画序列

  1. //Animation类,是用来保存每一个帧信息的动画类
  2. Animation* animation = Animation::create();
  3. char frame_name[20];//每帧图片的名称,注意图片名符号个数
  4. int i; //索引
  5. for (i = 0; i < 112; i++) {//图片个数
  6. sprintf(frame_name, "dp%03d.png", i); //使用sprintf写入每一帧的名称至字符串中
  7. //由于我们的图片中,不足三位帧的名称为dp001,所以需要用%03d来补充前导零,表示不足3位,则高位补零
  8. SpriteFrame* spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frame_name);
  9. animation->addSpriteFrame(spriteFrame);
  10. }
  11. animation->setLoops(-1);//设置循环次数,-1永远循环
  12. animation->setDelayPerUnit(0.05f);//设置帧与帧之间的时间间隔

创建帧动画

  1. //根据精灵帧动画序列创建帧动画
  2. Sprite* animeSprite = Sprite::create();
  3. Animate* animate = Animate::create(animation);
  4. animeSprite->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height * 4 / 5));//精灵的位置
  5. animeSprite->setScale(1.5);//精灵缩放
  6. this->addChild(animeSprite, 2);//添加到层
  7. animeSprite->runAction(animate);//精灵执行帧动画

现在,就获得了一个动态的精灵了
image.pngimage.png