iOS_31_cocos2d_CCAction

来源:互联网 发布:淘宝代运营服务商 编辑:程序博客网 时间:2024/05/21 22:45

CCAction的反转reverse方法,仅适合By结尾的动作



不同于CCActionSequence的one after another

CCActionSpawn是同时运行多个Action,in parallel


CCAction【动作】就是行为

在特定时间内完成移动、缩放、旋转等操作的行为,

CCNode可以通过runAction方法【执行动作】来实现动画效果,

动作的每个子类都封装了不同的动作效果。

CCAction的继承结构图

另外两个非常重要的子类是:

瞬时动作(CCActionInstant)和间隔动作(CCActionInterval),

它们又包含了非常多的子类,每一个子类都对应该着一种具体的动作【也可看也是运动、动画】

注意CCAction和CCFiniteTimeAction是抽象类

只定义了一些基本属性和方法,

实际使用时,要创建其子类动作,

然后调用CCNode的runAction方法,执行需要的动作、动画、运动。


间隔动作、又称耗时动作,指动作的完成要消耗一定的时间片

需要经过一段时间才能完成的一些动作,

所有的间隔动作都继承自CCActionInterval。

比如CCActionRotateBy、CCActionRotateTo、CCActionMoveBy、CCActionMoveTo,可以在指定时间内旋转指定的角度

注意:By是相对量,To是绝对量




<span style="font-size:18px;">// 1秒内顺时针旋转360°CCActionRotateBy *rotate = [CCActionRotateBy actionWithDuration:1 angle:360];[sprite runAction:rotate];</span>




间隔动作的继承结构图:(cocos2d  V3版类名已经全改为CCAction开头)










常见的CCActionInterval的子类:

1.CCActionBlink

闪烁效果

<span style="font-size:18px;">// 5秒内闪烁20次CCActionBlink *blink = [CCActionBlink actionWithDuration:5 blinks:20];[sprite runAction:blink];</span>


2.CCActionMoveBy和CCActionMoveTo

CCActionMoveBy是移动一段固定的距离(相对的距离),

CCActionMoveTo是移动到指定的位置(绝对目标位置)

<span style="font-size:18px;">// 在1秒内,向右移动100单位,同时向上移动80单位CCActionMoveBy *moveBy = [CCActionMoveBy actionWithDuration:1 position:ccp(100, 80)];</span>

<span style="font-size:18px;">// 在1秒内,从节点的当前位置移动到笛卡尔坐标系中(100, 80)这个位置CCActionMoveTo *moveTo = [CCActionMoveTo actionWithDuration:1 position:CGPointMake(100, 80)];</span>

3.CCActionRotateBy和CCActionRotateTo

CCActionRotateBy是在当前旋转角度的基础上再旋转固定的角度,

CCActionRotateTo是从当前旋转角度旋转到指定的角度

假设精灵在初始化的时候已经CW clockwise顺时针旋转了45° degree

<span style="font-size:18px;">sprite.rotation = 45;</span>


如果使用了CCActionRotateBy

<span style="font-size:18px;">CCActionRotateBy *rotateBy = [CCActionRotateBy actionWithDuration:1 angle:90];[sprite runAction:rotateBy];// 在1秒内,顺时针旋转90°,那么sprite的最终旋转角度是45° + 90° = 135°</span>

如果使用了CCActionRotateTo
<span style="font-size:18px;">CCActionRotateTo *rotateTo = [CCActionRotateTo actionWithDuration:1 angle:90];[sprite runAction:rotateTo];// 在1秒内,顺时针只要旋转45</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">°,就可以转</span><span style="font-size: 18px;">到90°了,因为指定了sprite的最终旋转角度就是90°</span>

4.CCActionScaleBy和CCActionScaleTo

CCActionScaleBy是在当前缩放比例的基础上再缩放一定的比例,

CCActionScaleTo是从当前缩放比例缩放到指定的比例 (相对于原始大小)

假设精灵在初始化的时候的缩放比例为0.8

<span style="font-size:18px;">sprite.scale = 0.8;</span>

如果使用了CCActionScaleBy
<span style="font-size:18px;">CCActionScaleBy *scaleBy = [CCActionScaleBy actionWithDuration:1 scale:0.5];[sprite runAction:scaleBy];// 在1秒内,宽度和高度再缩小50%,那么相对于原始大小,sprite最终缩放比例是0.8 * 0.5 = 0.4</span>

如果使用了CCActionScaleTo

<span style="font-size:18px;">CCActionScaleTo *scaleTo = [CCActionScaleTo actionWithDuration:1 scale:0.5];[sprite runAction:scaleTo];// 在1秒内,宽度和高度缩小为0.5倍,那么sprite最终缩放比例是就0.5</span>

5.CCActionFadeIn和CCActionFadeOut和CCActionFadeTo

CCActionFadeIn是淡入,即由暗转亮,从没有到有;

CCActionFadeOut是淡出,即由亮转暗,从有到没有;

CCActionFadeTo用来修改Node的opacity不透明度  


opacity  255为完全不透明,即完全可见

<span style="font-size:18px;">// 在2秒内,从没有到有CCActionFadeIn *fadeIn = [CCActionFadeIn actionWithDuration:2];// 在2s内,从有到没有CCActionFadeOut *fadeOut = [CCActionFadeOut actionWithDuration:2];// 在2s内,不透明度变为120,即变为半透明 (不透明度opacity取值范围是0-255)CCActionFadeTo *fadeTo = [CCActionFadeTo actionWithDuration:2 opacity:120];</span>



6.CCActionRepeat

重复执行某个动作,可以指定重复的次数

<span style="font-size:18px;">// 1秒中顺时针旋转360°CCActionRotateBy *rotateBy = [CCActionRotateBy actionWithDuration:1 angle:360];// 重复执行2次旋转动画CCActionRepeat *repeat = [CCActionRepeat actionWithAction:rotateBy times:2];[sprite runAction:repeat];</span>


6、CCActionRepeatForever

CCActionRepeatForever直接继承自CCAction,

可以不停地运行某个间隔动作(CCActionInterval)

如果你想让精灵不停地旋转,可以这样写:

// 1秒内顺时针旋转360°CCActionRotateBy *rotate = [CCActionRotateBy actionWithDuration:1 angle:360];// 使用CCActionRepeatForever重复CCActionRotateBy动作CCActionRepeatForever *repeat = [CCActionRepeatForever actionWithAction:rotate];[sprite runAction:repeat];

也能够利用CCActionRepeatForever重复一个动作序列(CCActionSequence)

// 变为红色CCActionTintTo *tintTo1 = [CCActionTintTo actionWithDuration:1 red:255 green:0 blue:0];// 变为绿色CCActionTintTo *tintTo2 = [CCActionTintTo actionWithDuration:1 red:0 green:255 blue:0];// 变为蓝色CCActionTintTo *tintTo3 = [CCActionTintTo actionWithDuration:1 red:0 green:0 blue:255];CCActionSequence *sequence = [CCActionSequence actions:tintTo1, tintTo2, tintTo3, nil];CCActionRepeatForever *repeat = [CCActionRepeatForever actionWithAction:sequence];[sprite runAction:repeat];

你会发现精灵的颜色状态是:红 -> 绿 -> 蓝 -> 红 -> 绿 -> 蓝 -> 红 ...,

一直在红绿蓝3种颜色之间按顺序切换








7、CCActionSpeed

CCActionSpeed也是直接继承自CCAction,

可以影响间隔动作(继承自CCActionInterval的动作)的运行速度

<span style="font-size: 18px;">// 1秒内顺时针旋转360°CCActionRotateBy *rotate = [CCActionRotateBy actionWithDuration:1 angle:360];// 速度变为原来的一半CCActionSpeed *speed = [CCActionSpeed actionWithAction:rotate speed:0.5];[sprite runAction:speed];</span>

本来1秒就完成旋转的,设置speed为0.5后,就需要2秒才能完成旋转




8.CCActionSequence

一般情况下,如果给节点同时添加几个动作时,它们会同时运行

比如下面的代码效果是一边旋转一边缩放

<span style="font-size: 18px;">CCActionRotateBy *rotateBy = [CCActionRotateBy actionWithDuration:1 angle:360];CCActionScaleBy *scaleBy = [CCActionScaleBy actionWithDuration:1 scale:2];[sprite runAction:rotateBy];[sprite runAction:scaleBy];</span>


但是,有时候我们想执行链式运动(one after another)

即让一个动作接着另一个运行完成后再运行,

那么就要用到CCActionSequence

下面演示的效果是,让精灵先变为红色,再从红色变为绿色,再从绿色变为蓝色

<span style="font-size: 18px;">CCActionTintTo *tintTo1 = [CCActionTintTo actionWithDuration:1 red:255 green:0 blue:0];CCActionTintTo *tintTo2 = [CCActionTintTo actionWithDuration:1 red:0 green:255 blue:0];CCActionTintTo *tintTo3 = [CCActionTintTo actionWithDuration:1 red:0 green:0 blue:255];// CCActionTintTo也是CCActionInterval的子类,可以用于更改精灵的颜色。CCActionSequence *sequence = [CCActionSequence actions:tintTo1, tintTo2, tintTo3, nil];[sprite runAction:sequence];</span>

CCActionSequence会按顺序执行参数中传入的所有动作,
one after another




9.CCActionEase

当对节点使用CCActionMoveTo动作时,它会匀速移动到目的地,

如果使用CCActionEase就可以使节点由慢到快或者由快到慢地移向目的地。

因此CCActionEase是用来改变动作的运行时速度的。

CCActionEase是个非常强大的类,子类非常多,这里只说明其中的几个:

CCActionEaseIn:由慢到快

CCActionEaseOut:由快到慢

CCActionEaseInOut:先由慢到快,再由快到慢


例如:

<span style="font-size: 18px;">CCActionMoveTo *moveTo = [CCActionMoveTo actionWithDuration:4 position:ccp(300, 200)];CCActionEaseInOut *easeInOut = [CCActionEaseInOut actionWithAction:moveTo rate:5];[sprite runAction:easeInOut];</span>

将会看到精灵先由慢到快,再由快到慢

rate参数决定了速率变化的明显程度,当它大于1时才有效








12、瞬时动作(前面全是interval耗时动作)

瞬时动作(CCActionInstant)是指能够瞬间完成的动作,

可用于改变节点位置、翻转节点形成镜像、设置节点的可视性等。

下面大致看下瞬时动作的继承结构图:


设置节点的visible属性可代替使用

CCActionShow、CCActionHide、CCActionToggleVisibility

修改节点的position属性可代替使用CCActionPlace

实际上,只有当它们常常与CCActionSequence结合使用

比如,想先让节点运行CCActionMoveTo移动到某个位置,

移动完毕后再隐藏节点

这时候我们就可以将CCActionMoveTo、CCActionHide两个动作

按顺序放进CCActionSequence中达到想要的效果

<span style="font-size: 18px;">// 移动到(300, 200)CCActionMoveTo *moveTo = [CCActionMoveTo actionWithDuration:2 position:ccp(300, 200)];// 隐藏节点CCActionHide *hide = [CCActionHide action];CCActionSequence *sequence = [CCActionSequence actions:moveTo, hide, nil];[sprite runAction:sequence];</span>

有时候,在一个动作序列(CCActionSequence)里面,

需要在一个动作运行完毕后,

先调用某个方法执行一些操作,

然后再执行下一个动作。

那就可以结合CCActionCallBlock、CCActionCallFuncCCActionSequence完成这个功能。

比如,让精灵先变为红色,再从红色变为绿色,再从绿色变为蓝色,

而且在每次变换颜色后都调用某个方法执行一些操作:

<span style="font-size: 18px;">// 变为红色CCActionTintTo *tintTo1 = [CCActionTintTo actionWithDuration:2 red:255 green:0 blue:0];// 变为红色后调用self的turnRed方法CCActionCallFunc *fn1 = [CCActionCallFunc actionWithTarget:self selector:@selector(turnRed)];// 变为绿色CCActionTintTo *tintTo2 = [CCActionTintTo actionWithDuration:2 red:0 green:255 blue:0];// 变为绿色后调用self的turnGreen:方法,参数是运行当前动作的节点CCActionCallFunc *fn2 = [CCActionCallFunc actionWithTarget:self selector:@selector(turnGreen:)];// 变为蓝色CCActionTintTo *tintTo3 = [CCActionTintTo actionWithDuration:2 red:0 green:0 blue:255];// 变为蓝色后调用self的turnBlue:方法,参数是运行当前动作的节点CCActionCallFunc *fn3 = [CCActionCallFunc actionWithTarget:self selector:@selector(turnBlue:) ];// 最后调用turnDone:方法CCActionCallFunc *fn4 = [CCActionCallFunc actionWithTarget:self selector:@selector(turnDone:) ];CCActionSequence *sequence = [CCActionSequence actions:tintTo1, fn1, tintTo2, fn2, tintTo3, fn3, fn4, nil];[sprite runAction:sequence];</span>
下面是回调方法的实现:

<span style="font-size: 18px;">- (void)turnRed {    NSLog(@"变为红色");}// node是运行当前动作的节点- (void)turnGreen:(id)node {    NSLog(@"变为绿色:%@", node);}// node是运行当前动作的节点- (void)turnBlue:(id)node  {    NSLog(@"变为蓝色,%@", node);}- (void)turnDone:(id)node {    NSLog(@"变换完毕:%@", node);}</span>

你会发现,精灵变为红色后就会调用turnRed方法,

变为绿色后会调用turnGreen:方法,

变为蓝色后会先调用turnBlue:方法,

最后调用turnDone:方法











13、CCActionAnimate

按顺序地播放图片,可以实现帧动画。

例如有下面10张图片:





果从1.png 到 10.png按顺序显示图片的话会形成一个GIF动画

下面CCActionAnimate实现动画效果


<span style="font-size:18px;">    // 创建精灵,并居中【千万要记得addChild】    _sprite = [CCSprite spriteWithImageNamed:@"1.png"];    _sprite.position  = ccp(self.contentSize.width/2,self.contentSize.height/2);    // 用来存放所有的帧    NSMutableArray *frames = [NSMutableArray array];    // 加载所有的图片    for (int i = 1; i<= 10; i++) {        // 1、拼接图片名        NSString *name = [NSString stringWithFormat:@"%i.png", i];        // 2、根据图片名(或全路径)生成纹理,一个图片对应一个纹理对象        CCTexture *texture = [CCTexture textureWithFile:name];        CGRect retct = CGRectMake(0, 0, texture.contentSize.width, texture.contentSize.height);        // 3、根据纹理创建一个精灵帧        CCSpriteFrame *frame = [[CCSpriteFrame alloc]initWithTexture:texture rectInPixels:retct rotated:NO offset:ccp(0, 0) originalSize:retct.size];        // 4、添加精灵帧 到 精灵帧数组中        [frames addObject:frame];    }    // 根据【精灵帧数组】创建CCAnimation,参数:每隔0.1秒播放下一张图片    CCAnimation *animation = [CCAnimation animationWithSpriteFrames:frames delay:0.1];        // 根据CCAnimation对象 创建 动作    CCActionAnimate *animate = [CCActionAnimate actionWithAnimation:animation];    CCActionRepeatForever *forever = [CCActionRepeatForever actionWithAction:animate];    [_sprite runAction:forever];    // 重要~~~必须成为场景的子Node    [self addChild:_sprite];</span>


动画效果如下:




里是将10帧分为10张不同的png图片。

为了性能着想,其实最好将10帧打包成一个图片,

到时根据plist文件中的坐标参数,从这张图片上面切割每一帧需要的图片,

这种图片我们可以称为"纹理相册",

可以用TexturePacker软件制作纹理相册











1 0
原创粉丝点击