精灵动画(Animation)
目前位置,我们使用的精灵都是静态的单帧图片,有的时候,我们需要拥有一个动态的精灵。那么我们需要创建一个动画帧组成的序列动画,cocos2d-x
提供了一个Animation
类描述一个动画
获得序列图片
大多数时候,我们拥有的多为gif素材,cocos2d-x本身是不支持gif素材的,我们需要先拆分素材成单帧序列图片
通过PS软件拆分gif动画
首先将我们的gif动画拖入ps中 (补充:其实ps也能用相同的方法导入部分支持的视频文件)
选择文件>导出>渲染视频 (这里的渲染视频不一定指渲染视频,也可以利用此功能渲染单帧序列图)
结果如图所示
获得plist
文件
我们使用的软件为TexturePackerGUI
官网下载链接
该软件官方有免费的普通版,目前我们只需要基础功能,所以不需要pro版本
点击发布精灵表后,你应该得到两个文件
在cocos
中创建精灵帧动画
一个精灵来播放动画需要三部分,首先,精灵播放的类为Animate
,该类可以被精灵播放,而创建Animate
类需要有Animation
动画信息,Animation
中保存着各种帧的信息,而创建Animation
类,我们需要一个精灵帧缓冲来导入创建每一帧
精灵帧缓冲
//通过精灵帧动画来显示gif动图
//使用SpriteFrameCache(精灵帧缓冲)从文件中读取指定的精灵帧,创建精灵对象
//SpriteFrameCache *frameCache = SpriteFrameCache::getInstance();
//frameCache->addSpriteFramesWithFile("gif1/1.plist", "gif1/1.png");
//1.png里集合了分解成帧的小图
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Animation/sprite.plist", "Animation/sprite.png");
创建帧动画序列
//Animation类,是用来保存每一个帧信息的动画类
Animation* animation = Animation::create();
char frame_name[20];//每帧图片的名称,注意图片名符号个数
int i; //索引
for (i = 0; i < 112; i++) {//图片个数
sprintf(frame_name, "dp%03d.png", i); //使用sprintf写入每一帧的名称至字符串中
//由于我们的图片中,不足三位帧的名称为dp001,所以需要用%03d来补充前导零,表示不足3位,则高位补零
SpriteFrame* spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frame_name);
animation->addSpriteFrame(spriteFrame);
}
animation->setLoops(-1);//设置循环次数,-1永远循环
animation->setDelayPerUnit(0.05f);//设置帧与帧之间的时间间隔
创建帧动画
//根据精灵帧动画序列创建帧动画
Sprite* animeSprite = Sprite::create();
Animate* animate = Animate::create(animation);
animeSprite->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height * 4 / 5));//精灵的位置
animeSprite->setScale(1.5);//精灵缩放
this->addChild(animeSprite, 2);//添加到层
animeSprite->runAction(animate);//精灵执行帧动画
现在,就获得了一个动态的精灵了