cocos2d中的动画在每一个游戏当中,都有很多各种各样的动画效果,比如街头霸王中的旋风腿,植物大战僵尸中豌豆的扭动、僵尸的走路、***动作等,虽然简单的移动动作也可以实现这些功能,但是这样看上去非常的笨拙和不真实。那么这些效果到底是如何实现的呢?其实很简单,我们只需要将一系列图片按照特定的顺序排列,然后在精灵对象上执行特定的动画动作就可以了。
1 cocos2d中动画相关的类
在cocos2d中实现动画,需要了解以下几个类。
q CCAnimate:该类为一种特殊的动作,也称为动画动作。
q CCAnimation:该类封装了一个精灵帧序列和各个精灵帧之间的延迟时间,作为精灵播放动画的参数。
q CCAnimationCache:该类是一个单例,作为一个缓存池来缓存CCAnimation动画。
2 简单动画效果
接下来我们通过示例演示在cocos2d中实现动画效果。在Xcdoe中使用cocos2d模板创建一个项目,命名为“AnimationTest”,加入准备好的图片资源,本例为8张植物大战僵尸中的僵尸图片,利用这些单独的图片创建动画,完成一个僵尸走路的动画效果。实现代码如下。

程序清单:codes/13/13.11/AnimationTest/AnimationTest/HelloWorldLayer.m

-(id) init

{

if( (self=[super init]) ) {

CGSize winSize = [[CCDirector sharedDirector] winSize];

CCSprite* bgSprite = [CCSprite spriteWithFile:@"gamebg.png"];

bgSprite.position = ccp(winSize.width/2,winSize.height/2);

[self addChild:bgSprite];

// 创建僵尸精灵,并设置坐标位置在屏幕之外

CCSprite* zSprite = [CCSprite spriteWithFile:@"z_00_01.png"];

zSprite.position = ccp(winSize.width+zSprite.contentSize.width/2,winSize.height/2);

[self addChild:zSprite];

// 创建CCAnimation动画,指定动画帧的内容

CCAnimation* anim = [CCAnimation animation];

[anim addSpriteFrameWithFilename:@"z_00_01.png"];

[anim addSpriteFrameWithFilename:@"z_00_02.png"];

[anim addSpriteFrameWithFilename:@"z_00_03.png"];

[anim addSpriteFrameWithFilename:@"z_00_04.png"];

[anim addSpriteFrameWithFilename:@"z_00_05.png"];

[anim addSpriteFrameWithFilename:@"z_00_06.png"];

[anim addSpriteFrameWithFilename:@"z_00_07.png"];

[anim addSpriteFrameWithFilename:@"z_00_08.png"];

// 创建animAction动画,restoreOriginalFrame:YES

// 可以让精灵对象在动画执行完后恢复到最初状态

id animAction = [CCAnimate actionWithDuration:1.5f animation:anim

restoreOriginalFrame:YES];

// 定义一个动作,重复执行CCAnimate动画

id repeatanimAction = [CCRepeatForever actionWithAction:animAction];

// 定义一个动作,让精灵对象移动到特定的位置

id moveTo = [CCMoveTo actionWithDuration:10.0f

position:ccp(-zSprite.contentSize.width/2,winSize.height/2)];

// 僵尸精灵重复执行动画动作和移动动作

[zSprite runAction:repeatanimAction];

[zSprite runAction:moveTo];

}

return self;

}

复制代码上面代码首先在屏幕中添加了一个背景精灵图片,然后创建了一个僵尸精灵,最后使用8张图片创建了一个简单的僵尸行走动画,并让僵尸精灵对象反复执行该动画并移动。这样就完成了一个僵尸从屏幕一边走到另一边的动画效果。单击“Run”按钮执行AnimationTest项目,模拟器显示如图13.48所示。




3 使用精灵表单实现动画效果
上一节实现了一个简单的动画效果,在实际开发工作当中,通常会使用更加高效的方式来完成动画,就是使用我们前面介绍过的精灵表单。上一节使用单独的精灵,每次都需要调用OpenGL ES的绘图命令,速度会大大降低;而如果使用精灵表单,无论纹理图集上有多少精灵,只需要调用一次绘图命令即可。所以使用精灵表单,可以大大提升游戏的性能。
首先按照13.9.6节制作精灵表单的步骤,将所有的图片制作成精灵表单。
① 加载图片。把所有的精灵图片拖动到Zwoptex的空白处,然后单击工具条上的“Layout”按钮,显示效果如图13.49所示。


② 单击工具条上的“publish Settings”按钮,在Texture下的“Save To File”处设置生成的PNG文件名和路径,在Coordinates下的“Save To File”处设置生成的plist文件名和路径,完成后单击“Done”按钮保存设置。
③ 单击上方左侧的“Publist”按钮生成所需要的plist文件和PNG文件。
接下来我们使用精灵表单来实现动画效果。在Xcdoe中使用cocos2d模板创建一个项目,命名为“AnimationCacheTest”,加入准备好的plist文件和图片资源。实现代码如下。
程序清单:codes/13/13.11/AnimationCacheTest/AnimationCacheTest/HelloWorldLayer.m

-(id) init

{

if( (self=[super init]) ) {

CGSize winSize = [[CCDirector sharedDirector] winSize];

// ①读取plist文件将精灵帧纹理添加到精灵帧缓存当中

[[CCSpriteFrameCache sharedSpriteFrameCache]

addSpriteFramesWithFile:@"animation.plist"];

// ②创建一个精灵表单

CCSpriteBatchNode* batchNode = [CCSpriteBatchNode

batchNodeWithFile:@"animation.png"];

// ③将精灵表单作为层的子节点添加到层当中

[self addChild:batchNode];

// ④创建背景精灵添加到精灵表单中

CCSprite* bgSprite = [CCSprite spriteWithSpriteFrameName:@"gamebg.png"];

bgSprite.position = ccp(winSize.width/2,winSize.height/2);

[batchNode addChild:bgSprite];

// ⑤创建僵尸精灵,设置坐标位置在屏幕之外

CCSprite* zSprite = [CCSprite spriteWithSpriteFrameName:@"z_00_01.png"];

zSprite.position = ccp(winSize.width+zSprite.contentSize.width,winSize.height/2);

// ⑥创建一个数组用来保存动画

NSMutableArray* array = [NSMutableArray array];

// 遍历所有图片,然后从精灵帧缓存中获取与图片名称相对应的精灵帧保存到数组当中

for(int i = 1;i<=8;i++){

NSString* fileName = [NSString stringWithFormat:@"z_00_0%i.png",i];

CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache]

spriteFrameByName:fileName];

[array addObject:frame];

}

// ⑦创建一个动画并设计成重复动作

id animation = [CCAnimation animationWithSpriteFrames:array delay:0.1f];

id animate = [CCAnimate actionWithAnimation:animation];

id repeate = [CCRepeatForever actionWithAction:animate];

// ⑧创建一个CCMoveTo让精灵移动到特定的位置

id moveTo = [CCMoveTo actionWithDuration:10.0f

position:ccp(-zSprite.contentSize.width/2,winSize.height/2)];

// ⑨让僵尸精灵运行动画和移动动作

[zSprite runAction:repeate];

[zSprite runAction:moveTo];

// ⑩将僵尸精灵添加到精灵表单中

[bgSprite addChild:zSprite];

}

return self;

}

复制代码
上面程序中,编号①代码读取animation.plist文件将精灵帧纹理添加到精灵帧缓存当中。编号②代码根据animation.png文件创建一个精灵表单。编号③代码将精灵表单作为层的子节点添加到层当中。编号④代码创建背景精灵添加到精灵表单中。编号⑤代码创建僵尸精灵,并设置坐标位置。
编号⑥代码创建一个数组,并遍历所有图片,然后从精灵帧缓存中获取与图片名称相对应的精灵帧保存到数组当中。编号⑦代码创建动画对象并传入精灵图片帧数组,同时指定动画的播放速度,然后将动画设计成一个重复的动作。编号⑧代码创建一个CCMoveTo让精灵移动到特定的位置。

编号⑨代码让僵尸精灵执行动画和移动的动作。编号⑩代码将僵尸精灵添加到精灵表单中。

通过以上步骤,我们就完成了通过精灵表单创建cocos2d动画效果的过程。单击“Run”按钮执行AnimationCacheTest项目,模拟器显示和直接使用图片帧创建动画的效果一样。使用精灵表单可以大大提升游戏的性能,在实际的项目开发当中应该更多地采用精灵表单的方式加载所有的精灵对象。