cocos2d开发之动作(Actions)

cocos2d开发之动作(Actions),第1张

概述动作是用于在节点上运行某些“动作”的轻量级类。你可以通过动作让节点移动,旋转,缩放,着色,淡进淡出和干很多其它的事情。因为动作可以用于任何节点,你可以在精灵,标签,甚至菜单或者整个场景中使用它们!这让它们非常有用。 因为大多数动作都是在一段时间内发生的,比如旋转三秒钟,所以通常需要写一个更新方法,还要添加用于储存中间状态的变量。动作(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的话,你就可以让节点慢慢启动,然后加速向目标移动,或者反过来(快速启动,慢慢减速到达目标)。或者你也可以让节点移动到超过目的地一些,然后再反d回来。“舒缓动作”可以帮助你创造出通常很费时间才能做出来的动画。以下代码演示了如何应用舒缓动作来改变一个普通动作的行为。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类:

CCEaseBackIn,CCEaseBackInOut,CCEaseBackOut

CCEaseBounceIn,CCEaseBounceInOut,CCEaseBounceOut

CCEaseElasticIn,CCEaseElasticInOut,CCEaseElasticOut

CCEaseExponentialin,CCEaseExponentialinOut,CCEaseExponentialOut

CCEaseIn,CCEaseInOut,CCEaSEOut

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,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,funcN,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必须是一个CCSpriteCCSprite* sprite = (CCSprite*)data;cclOG(@"end of sequence! sender: %@ - data: %@",sender,sprite);}


注:从Learn IPhone and iPad Cocos2d Game Delevopment》书中转载 总结

以上是内存溢出为你收集整理的cocos2d开发之动作(Actions)全部内容,希望文章能够帮你解决cocos2d开发之动作(Actions)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1090771.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存