1.9 添加动作到精灵
在前面的动画制作中,我们已经学习了一些有关Actions的内容。除此之外,Cocos2d中还有更多动作供你使用。并且,你也可以把多种动作组成一个动作序列,集中应用到目标对象上。
1.9.1 准备工作
首先,让我们一起看一个简单的动作,它用来把hero沿着x轴移动屏幕宽度的一半,并沿y轴方向从中心向下移动屏幕高度的四分之一。
1.9.2 操作步骤
在把hero添加到MainScene之后,在MainScene.m文件中添加如下代码:
CGPointfinalPos = CGPointMake(center.x + winSize.width/4, center.y -
winSize.height/4);
CCActionFiniteTime* actionMove = [CCActionMoveToactionWithDuration
:1.0position:finalPos];
[herorunAction:actionMove];
为了方便起见,我创建了一个CGPoint,命名为finalPos,用来存储最终位置。然后,创建一个CCActionFiniteTime类型的变量actionMove,调用CCMoveTo函数,指定动作的持续时间为1.0秒,并且给出想把hero移动到的目的位置。最后,调用hero的runAction函数,传入创建好的动作。
1.9.3 工作原理
当你运行项目时,hero起初位于黄色渲染精灵的左侧,而后慢慢开始向右下角移动,(注:原文中if the render sprite is over a period of 1second一句,建议删除,因为并未对render精灵施加动作,它是一直存在的)经过1秒之后,hero到达目标位置,移动动作停止,hero将再次静止不动,如图1-25所示。
1.9.4 更多内容
接下来,让我们创建更多动作,然后把这些动作放入一个动作序列中,依次执行这些动作。为此,我们将添加如下代码,替换掉之前的动作代码:
//Actions
CGPointinitPos = hero.position;
CGPointfinalPos = CGPointMake(center.x + winSize.width/4, center.y -
winSize.height/4);
CCActionFiniteTime* actionMove = [CCActionMoveToactionWithDuration:
1.0position:finalPos];
CCAction *rotateBy = [CCActionRotateByactionWithDuration:2.0 angle:
180];
CCAction *tintTo= [CCActionTintToactionWithDuration:1.0
color:[CCColorcolorWithRed:0.0fgreen:1.0blue:0.0]];
CCAction *delay = [CCActionDelayactionWithDuration:1.0];
CCAction *moveToInit = [CCActionMoveToactionWithDuration:
1.0position:initPos];
CCAction *rotateBack = [CCActionRotateByactionWithDuration:2.0 angle:
180];
CCAction *tintBlue= [CCActionTintToactionWithDuration:1.0
color:[CCColorcolorWithRed:0.0fgreen:0.0blue:1.0]];
CCAction *sequence = [CCActionSequenceactions:actionMove,
rotateBy,tintTo, moveToInit, delay, rotateBack, tintBlue, nil];
[herorunAction:sequence];
在上面代码中,在把最终位置保存到finalPos变量之后,我又把hero的初始位置保存到名称为initPos的CGPoint类型变量中,后面我们会用到它。
第一个动作是moveTo动作,用来把角色移动到指定的位置。
接着,我们将使用rotateBy动作,对角色进行旋转,并指定持续时间与旋转角度。
随后,我们会使用tintTo动作,它用来改变角色对象的颜色,并再次给出持续时间与想改变的颜色。本示例中,我们把角色的颜色更改为绿色。
然后,我们调用延时动作,用来在执行下一个动作之前暂停一段时间。在示例中,我们把延时时间设置为1秒。
接下来,我们要把角色对象移动到最初位置,改变对象颜色为蓝色,再次把对象旋转180度。
然后,创建CCSequence动作,把所有动作放入其中,以便依次播放这些动作。动作添加完之后,再添加一个nil,表示动作列表结束。
最后,我们调用hero的runAction函数,执行动作序列。
现在,人物角色将从起始位置开始执行一系列动作,当他返回起始位置时,将变为蓝色。
代码产生的效果如图1-26所示。