cocos2d开发之动作(Actions)

动作是用于在节点上运行某些“动作”的轻量级类。你可以通过动作让节点移动,旋转,缩放,着色,淡进淡出和干很多其它的事情。因为动作可以用于任何节点,你可以在精灵,标签,甚至菜单或者整个场景中使用它们!这让它们非常有用。

因为大多数动作都是在一段时间内发生的,比如旋转三秒钟,所以通常需要写一个更新方法,还要添加用于储存中间状态的变量。动作(Actions)把这些逻辑都包装了起来,用参数化的方法来应用动作:

// 以下代码会让myNode在3秒钟内从当前位置移动到(100,200)坐标点
CCMoveTo* move = [CCMoveTo actionWithDuration:3 position:CGPointMake(100, 200)];[myNode runAction:move];

cocos2d的动作可以分为两种类型。一种是“即时动作”,它的效果和设定节点属性一样,例如设定visible或flipX属性。另一种是“时间间隔动作”,这种动作在一段时间之内发生,例如上述代码的移动动作。你不需要在这两种动作完成以后将它们从内存里清理出去,cocos2d会自动释放动作所占用的内存。 

重复动作

你可以让动作或者一系列动作重复运行到永远。你可以通过这个特性生成循环动画。以下代码会让一个节点永远旋转下去,就像一个永远旋转的轮子:

CCRotateBy* rotateBy = [CCRotateBy actionWithDuration:2 angle:360];
CCRepeatForever* repeat = [CCRepeatForever actionWithAction:rotateBy];
[myNode runAction:repeat]; 

舒缓动作

CCEaseAction类让cocos2d的动作更加有用。“舒缓动作”允许你改变在一段时间内发生的动作效果。例如,如果你在节点上应用CCMoveTo动作,此节点在整个移动过程中将会保持同一个速度。而如果你使用CCEaseAction的话,你就可以让节点慢慢启动,然后加速向目标移动,或者反过来(快速启动,慢慢减速到达目标)。或者你也可以让节点移动到超过目的地一些,然后再反弹回来。“舒缓动作”可以帮助你创造出通常很费时间才能做出来的动画。以下代码演示了如何应用舒缓动作来改变一个普通动作的行为。rate参数是用来决定舒缓动作的明显程度。此参数只有在大于1的情况下才能看到舒缓动作的效果:

// 我想让myNode在3秒钟之内移动到100,200坐标点
CCMoveTo* move = [CCMoveTo actionWithDuration:3 position:CGPointMake(100, 200)];// 节点应该慢慢启动,然后在移动过程中减速
CCEaseInOut* ease = [CCEaseInOut actionWithAction:move rate:4];
[myNode runAction:ease]; 

cocos2d实现了以下CCEaseAction类:

  1. CCEaseBackIn, CCEaseBackInOut, CCEaseBackOut

  2. CCEaseBounceIn, CCEaseBounceInOut, CCEaseBounceOut

  3. CCEaseElasticIn, CCEaseElasticInOut, CCEaseElasticOut

  4. CCEaseExponentialIn, CCEaseExponentialInOut, CCEaseExponentialOut

  5. CCEaseIn, CCEaseInOut, CCEaseOut

  6. CCEaseSineIn, CCEaseSineInOut, CCEaseSineOut 

动作序列

通常情况下,当你给一个节点添加多个动作时,它们会在同一时间运行。例如,你可以通过添加动作让物体在旋转的同时淡出消失。但是如果你想要一个动作一个动作的运行呢?

有时候,一个动作一个动作的运行会更有用。我们可以使用CCSequence来达到这个目的。在一个动作序列中,你可以使用任意数量和类型的动作。例如,你可以让一个节点先移动到目标位置,然后在节点到达目标之后让其旋转,最后淡出消失。动作一个跟着一个的运行,直到完成整个动作序列。

以下代码演示了如何让一个标签的颜色从红色变为蓝色,最后变为绿色:

CCTintTo* tint1 = [CCTintTo actionWithDuration:4 red:255 green:0 blue:0]; CCTintTo* tint2 = [CCTintTo actionWithDuration:4 red:0 green:0 blue:255]; CCTintTo* tint3 = [CCTintTo actionWithDuration:4 red:0 green:255 blue:0]; CCSequence* sequence = [CCSequence actions:tint1, tint2, tint3, nil]; [label runAction:sequence];

你也可以将动作序列与CCRepeatForever动作结合使用:

CCSequence* sequence = [CCSequence actions:tint1, tint2, tint3, nil];CCRepeatForever* repeat = [CCRepeatForever actionWithAction:sequence];[label runAction:repeat]; 

即时动作

你可能会奇怪为什么有基于CCInstantAction的即时动作存在,通过改变节点的属性不是可以达到一样的目的吗?比如那些用来翻转节点,把节点放置的指定的地方,还有用于开关节点的可视性属性的即时动作。

即时动作的存在是为动作序列服务的。有时候在一个动作序列里你必须改变某些节点的属性,像可视性或者位置,改变完成以后会继续当前的动作序列。即时动作让这样的应用变得可能。其中用的最多的可能是CCCallFunc动作。

当你使用一个动作序列时,你可能需要在某个时间得到通知。比如当一个动作序列完成运行以后,你想知道这个动作序列已经完成,得到通知以后,你就可以接着继续另一个动作序列。以下代码重写了之前的颜色改变动作序列的例子,它会在每次完成一个CCTintTo动作以后调用三个CCCallFunc动作中的一个来发送信息: 

CCCallFunc* func = [CCCallFunc actionWithTarget:self selector:@selector(onCallFunc)]; CCCallFuncN* funcN = [CCCallFuncN actionWithTarget:self selector:@selector(onCallFuncN:)];
CCCallFuncND* funcND = [CCCallFuncND actionWithTarget:self selector:@selector(onCallFuncND:data:) data:(void*)self];
CCSequence* seq = [CCSequence actions:tint1, func, tint2, funcN, tint3, funcND, nil]; [label runAction:seq];

上述动作序列将调用以下代码来发送信息。sender这个参数继承自CCNode;这是运行动作的节点。data参数可以是任何值,结构或者指针。只是你必须正确地转换data指针的类型。

-(void) onCallFunc
{
CCLOG(@"end of tint1!");
}
-(void) onCallFuncN:(id)sender {
CCLOG(@"end of tint2! sender: %@", sender); }
-(void) onCallFuncND:(id)sender data:(void*)data {
// 如下转换指针的方式要求data必须是一个CCSprite
CCSprite* sprite = (CCSprite*)data;
CCLOG(@"end of sequence! sender: %@ - data: %@", sender, sprite);
}


注:从Learn IPhone and iPad Cocos2d Game Delevopment》书中转载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值