cocos2d笔记 (3)cocos2d里的各种动作
(本节学习自《知易cocos2d-iphone开发教程》)
通常调用某个动作的方法:
// 创建动作 id actionTo = [CCMoveTo actionWithDuration: 2 position:ccp(s.width-40, s.height-40)]; // 使用动作。(说明:tamara 是一个 CCSprite。) [tamara runAction: actionTo];
瞬时动作
顾名思义。瞬时动作就是不需要时间,马上就完成的动作。瞬时动作的共同基类是 InstantAction。
放置 – Place
效果类似于 node.Position = ccp(x, y)。之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。
示例:
- (void) OnPlaceMenue:(id) sender { CGSize s = [[CCDirector sharedDirector] winSize]; CGPoint p = ccp(CCRANDOM_0_1() * s.width, CCRANDOM_0_1() * s.height); [sprite runAction:[CCPlace actionWithPosition:p]]; }
隐藏 – Hide
效果类似于 [node setVisible:NO].
示例:
- (void) OnHideMenue:(id) sender { [sprite runAction:[CCHide action]]; }
显示 – Show
效果类似于 [node setVisible:YES].
示例:
- (void) OnShowMenue:(id) sender { [sprite runAction:[CCShow action]]; }
可见切换 – ToggleVisibility
代码如下:
- (void) OnToggleMenue:(id) sender { [sprite runAction:[CCToggleVisibility action]]; }
延时动作
延时动作就是动作的完成需要一定时间。因此,actionWithDuration 是延时动作执行时的第一个参数,延时动作的共同基类是 CCIntervalAction。
函数的命名规则:
***To: 意味着运动到指定的位置。
***By:意味着运动到按照指定癿 x、y 增量的位置。(x、y 可以是负值)
移动到 – CCMoveTo
移动– CCMoveBy
跳跃到 – CCJumpTo
设置终点位置和跳跃癿高度和次数。
跳跃 – CCJumpBy
设置终点位置和跳跃癿高度和次数。
贝塞尔 – CCBezierBy
支持 3 次贝塞尔曲线:P0-起点,P1-起点切线方向,P2-终点切线方向,P3-终点。
首先设置定 Bezier 参数,然后执行。
放大到 – CCScaleTo
设置放大倍数,是浮点型。
放大 – CCScaleBy
旋转到 – CCRotateTo
旋转 – CCRotateBy
闪烁 – CCBlink
设定闪烁次数
色调变化到 – CCTintTo
色调变换 – CCTintBy
变暗到 – CCFadeTo
由无变亮 – CCFadeIn
由亮变无 – CCFadeOut
组合动作
按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作。组合动作包括以 下几类:
序列 – CCSequence
主要作用就是线序排列若干个动作,然后按先后次序逐个执行。
- (void) OnSequence:(id) sender { CGSize s = [[CCDirector sharedDirector] winSize]; CGPoint p = ccp(s.width/2, 50); // 创建5个动作 id ac0 = [sprite runAction:[CCPlace actionWithPosition:p]]; id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)]; id ac2 = [CCJumpTo actionWithDuration:2 position:ccp(150, 50) height:30 jumps:5]; id ac3 = [CCBlink actionWithDuration:2 blinks:3]; id ac4 = [CCTintBy actionWithDuration:0.5 red:0 green:255 blue:255]; //将 5 个动作组合为一个序列,注意不要忘了用 nil 结尾。 [sprite runAction:[CCSequence actions:ac0, ac1, ac2, ac3, ac4, ac0, nil]]; }
同步 – Spawn Spawn
作用就是同时并列执行若干个动作,但要求动作都必须是可以同时执行的。比如:移动式翻转、变色、变大小等。
需要特别注意的是,同步执行最后的完成时间由基本动作中用时最大者决定。
- (void) OnSpawn:(id) sender { CGSize s = [[CCDirector sharedDirector] winSize]; CGPoint p = ccp(s.width/2, 50); sprite.rotation = 0; [sprite setPosition:p]; // 创建 4 个需要并行的动作,确保动作用时可组合。2 – 2 - (1+1) id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)]; id ac2 = [CCRotateTo actionWithDuration:2 angle:180]; id ac3 = [CCScaleTo actionWithDuration:1 scale:4]; id ac4 = [CCScaleBy actionWithDuration:1 scale:0.5]; id seq = [CCSequence actions:ac3, ac4, nil]; // 同步动作和组合动作以形成一个连续的新动作。 [sprite runAction:[CCSpawn actions:ac1, ac2, seq, nil]]; }
重复有限次数 – Repeate
重复有限的次数的动作示例代码如下:
- (void) OnRepeat:(id) sender { CGSize s = [[CCDirector sharedDirector] winSize]; CGPoint p = ccp(s.width/2, 50); sprite.rotation = 0; [sprite setPosition:p]; // 创建动作序列 id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)]; id ac2 = [CCJumpBy actionWithDuration:2 position:ccp(-400, -200) height:30 jumps:5]; id ac3 = [CCJumpBy actionWithDuration:2 position:ccp(s.width/2, 0) height:20 jumps:3]; id seq = [CCSequence actions:ac1, ac2, ac3, nil]; //重复运行上述劢作序列 3 次。 [sprite runAction:[CCRepeat actionWithAction:seq times:3]]; }
反动作 – Reverse
反动作就是反向(逆向)执行某个动作,支持针对动作序列的反动作序列。反动作不是一个专门的类,而是 CCFiniteAction 引入的一个接口。不是所有的类都支持反动作,XxxxTo 类通常不支持反动作,XxxxBy 类通常支持。示例如下:
- (void) OnReverse:(id) sender { CGSize s = [[CCDirector sharedDirector] winSize]; CGPoint p = ccp(s.width/2, 50); sprite.rotation = 0; [sprite setPosition:p]; id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(190, 220)]; // 创建某个劢作癿反劢作。 id ac2 = [ac1 reverse]; [sprite runAction:[CCRepeat actionWithAction:[CCSequence actions:ac1, ac2,nil] times:2]]; }
动画 – Animation
动画就是让精灵自身的连续执行一段影像,形成模拟运动的效果:行走时动精灵状态、打斗时的状态等。
- (void) OnAnimation:(id) sender { CCAnimation *animation = [AtlasAnimation animationWithName:@"flight" delay:0.2f]; // 每帧的内容定义。 for(int i=0;i<3;i++) { int x= i % 3; [animation addFrameWithRect: CGRectMake(x*32, 0, 31,30) ]; } // 执行劢画效果 id action = [CCAnimate actionWithAnimation: animation]; [sprite runAction:[CCRepeat actionWithAction:action times:10]]; }
无限重复 – RepeatForever
RepeatForever 是从 Action 类直接派生的,因此无法参于序列和同步;自身也无法反向执行。该类的作用就是无限期执行某个动作或动作序列,直到被停止。
- (void) OnRepeatForever:(id) sender { CGSize s = [[Director sharedDirector] winSize]; CGPoint p = ccp(100, 50); // 飞行喷火模拟劢画 CCAnimation *animation = [CCAnimation animationWithName:@"flight" delay:0.1f]; for(int i=0;i<3;i++) { int x= i % 3; [animation addFrameWithRect: CGRectMake(x*32, 0, 31,30) ]; } id action = [CCAnimate actionWithAnimation: animation]; // 将该动画作为精灵的本征动画,一直运行。 [sprite runAction:[RepeatForever actionWithAction:action]]; // 在创建第二个连续无限期动作序列。叠加二者形成完整效果。 ccBezierConfig bezier; sprite.rotation = 0; [sprite setPosition:p]; bezier.startPosition = ccp(0,0); bezier.controlPoint_1 = ccp(0, s.height/2); bezier.controlPoint_2 = ccp(300, -s.height/2); bezier.endPosition = ccp(300,100); id ac10 = [CCBezierBy actionWithDuration:3 bezier:bezier]; id ac11 = [CCTintBy actionWithDuration:0.5 red:0 green:255 blue:255]; id ac1 = [CCSpawn actions:ac10, [Repeat actionWithAction:ac11 times:4], nil]; id ac2 = [CCSpawn actions:[ac10 reverse], [CCRepeat actionWithAction:ac11 times:4], nil]; // 第二个无限期连续运劢。 [sprite runAction:[CCRepeatForever actionWithAction:[CCSequence actions:ac1, ac2,nil]]]; }
速度变化
基本动作和组合动作实现了针对精灵的各种运动、动画效果的改变,但这样的改变的速度是不变的,通过 CCEaseAction 为基类的类系和 CCSpeed 类我们可以很方便的修改精灵执行动作的速度:由快至慢还是由慢至快
EaseIn 由慢至快。
EaseOut 由快至慢
EaseInOut 由慢至快再由快至慢。
EaseSineIn 由慢至快
EaseSineOut 由快至慢
EaseSineInOut 由慢至快再由快至慢。
EaseExponentialIn 由慢至极快。
EaseExponentialOut 由极快至慢。
EaseExponentialInOut 由慢至极快再由极快至慢。
Speed 人工设定速度,还可通过 SetSpeed 不断调整。
扩展动作
我们已经掌握了执行各种各样的动作,也可以按照不同的快慢修改动作执行的时间, Cocos2D-iPhone 还提供了针对现有动作的扩展,以实现各种灵活的效果。
延时动作 – Delay
在动作序列中增加一个时间间歇:
- (void) OnDelay:(id) sender { id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)]; id ac2 = [ac1 reverse]; // 实现一个等待间歇 [spriterunAction:[Sequenceactions:ac1,[DelayTime actionWithDuration:1], ac2, nil]]; }
函数调用 函数
在动作序列中间或者结束调用某个函数,执行任何需要执行的任务:动作、状态修改等。代码如下:
- (void) OnCallFunc:(id) sender { id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)]; id ac2 = [ac1 reverse]; id acf = [CCCallFunc actionWithTarget:self selector:@selector(CallBack1)]; [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]]; }
对应的函数为:(再做一个动作,这就实现了动作、动作序列的任意扩展和连接)
- (void) CallBack1 { [sprite runAction:[CCTintBy actionWithDuration:0.5 red:255 green:0 blue:255]]; }
带对象参数 调用自定义函数时,传递当前对象。
- (void) OnCallFuncN:(id) sender { id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)]; id ac2 = [ac1 reverse]; id acf = [CallFuncN actionWithTarget:self selector:@selector(CallBack2:)]; [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]]; }
对应的自定义函数:(这里,我们直接使用了该对象)
- (void) CallBack2:(id)sender { [sender runAction:[CCTintBy actionWithDuration:1 red:255 green:0 blue:255]]; }
带对象、数据参数调用自定义函数时,传递当前对象和一个常量(也可以是指针)。
- (void) OnCallFuncND:(id) sender { id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)]; id ac2 = [ac1 reverse]; id acf = [CCCallFuncND actionWithTarget:self selector:@selector(CallBack3:data:) data:(void*)2]; [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]]; }
对应的自定义函数,我们使用了传递的对象和数据:
-(void) CallBack3:(id)sender data:(void*)data { [sender runAction:[CCTintBy actionWithDuration:(NSInteger)data red:255 green:0 blue:255]]; }