守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 634|回复: 0

[技术资料] 从AS到cocos2d-Action

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51788
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-15 14:54:35 | 显示全部楼层 |阅读模式
    本帖最后由 破晓 于 2015-1-15 14:56 编辑

    我之前是一个ASer,去年开始搞oc,今年接触cocos2d,学习的过程中有些体会,回顾一下,分享出来,也为更多从flash开发想转到cocos2d的同学做一个汇报和参考。学习cocos2d是一个愉快的过程,因为从starling转换过来觉得无比方便,就像当年从PureMVC转到Robotlegs,相见恨晚的感觉。

    这篇文章记录学习cocos2d中Action的一点小结。

    cocos2d的Action,类似flash中的动作补间动画,但它更为强大。

    Flash中,你可以用动作补间做的所有事情,包括位置、旋转、缩放、颜色、不透明度,Cocos2D里的Action都可以做。
    而我们在Flash的开发中,仅仅依靠位置、旋转、缩放、颜色、不透明度的变化是不够做出一款有趣的游戏的——这些仅仅是动画,更全面的动作,是令各项数值产生变化,且分为瞬间变化和随时间变化两种。

    Flash中,我一般使用GTween来控制各项数值的变化。有个例子来阐述:比如做星际争霸中资源量显示的文本,当你消耗或采集到一些资源后,资源量显示文字不会直接变化,而是随时间跳动。那么我通常会创建一个自定义的TextField,实现一对getter和setter,GTween来更改他们的值,加入缓动效果。很多效果都可以透过这样来实现。甚至按照一定规则缓动换贴图。

    好,那回到cocos2d,cocos2d中的Action,可以用来让节点执行**位置、旋转、缩放、变色、消失**等很多动作,而且由于它是施加在所有节点CCNode上,因此对精灵、标签、菜单甚至场景施加动作。这是一大灵活的特点。
    我上面说了,真正的动作,分瞬间变化和随时间变化两种。cocos2d中的CCFiniteTimeAction就是分为CCActionInstant和CCActionInterval,CCFiniteTimeAction之外还有无限重复动作、跟随动作、调速动作。


    CCActionInterval 间隔动作

    间隔动作,其效果就是随时间变化的动作。通途最为广泛,子类数量很多。它的子类中,像CCMoveTo、CCMoveBy,CCScaleTo、CCScaleBy,CCFadeIn、CCFadeOut等等的都是顾名思义的位置、旋转、淡入淡出之类的常规功能。

    其中有2类特殊常用的:
    1. CCEase 缓动动作,许多子类实现
    2. CCSequence 动作序列


    CCEase 缓动动作

    最初我使用了动作来做动画补间时想加缓动,在flash中,通常我用GTween(TweenLite、TweenMax同样)都是传入一个缓动函数来对一个补间。而到cocos2d里,其实缓动本身也是一个间隔动作。
    比如我在三消的游戏中,需要让玩家因为消除产生加分的时候,分数提示文字从大到小缩放一下,形成一个冲击,而且加分越多,变化的比例越大,从大到小缩放的动画中加入一个反弹缓入缓出效果:

    1. <font color="rgb(34, 34, 34)"><font face="Helvetica, Arial, sans-serif">-(void) curScoreChangeTo:(int)score from:(int)oscore
    2. {
    3.     int delta = score - oscore;
    4.     CGFloat prepareScale = 1.0f;
    5.     if(delta>0)
    6.     {
    7.         //delta 是300~8100
    8.         prepareScale = delta / 300 + 1.0f;
    9.         if(prepareScale>10) prepareScale = 10;
    10.     }
    11.     [curScoreLabel stopAllActions];
    12.     [curScoreLabel setScale:prepareScale];
    13.    
    14.     [curScoreLabel setString:[NSString stringWithFormat:@"%d",score]];
    15.     [curScoreLabel runAction:[CCEaseBackInOut actionWithAction:[CCScaleTo actionWithDuration:0.5 scale:1.0f]]];
    16. }</font></font>
    复制代码
    缓动的使用关键就是[curScoreLabel runAction:[CCEaseBackInOut actionWithAction:[CCScaleTo actionWithDuration:0.5 scale:1.0f]]];

    CCSequence 动作序列
    1. CCSequence *actionB = [CCSequence actions:
    2.                        [CCScaleTo actionWithDuration:0.4 scale:0.6],
    3.                        [CCScaleTo actionWithDuration:0.4 scale:1.0],nil];
    4. [gemB runAction:actionB];
    复制代码
    这个代码片段展示了0.4秒内先缩放到60%,再0.4秒缩放到100%。


    CCActionInstant


    瞬时动作,用来翻转、移动、设置可见性等,不过最被广泛用于动作序列执行到一定时机回调。
    1. CCScaleTo *scale = [CCScaleTo actionWithDuration:REMOVE_GEM_SCALE_DURATION scale:2.0];
    2. CCFadeOut *fadeOut = [CCFadeOut actionWithDuration:REMOVE_GEM_DURATION];
    3. [gem runAction:[CCSequence actions:
    4.                         [CCEaseOut actionWithAction:scale rate:4],fadeOut,
    5.                         [CCCallBlock actionWithBlock:^(void) {[self removeChild:gem cleanup:YES];}], nil]];
    复制代码
    这个代码片段展示了缓动+回调+动作序列。
    按顺序执行,先缓出播放一个缩放的动作,然后淡出,然后回调



    CCRepeatForever

    无限重复动作会一直执行一个动作。要知道动作可以多次叠加动作,还可以按顺序执行,这样加上重复之后能实现很多效果,这个通常用得比较多。

    CCFollow

    跟随动作是让节点跟随另一个节点。

    CCSpeed


    可以调整一个动作的更新频率,其效果看起来就是在运行速度上加了个系数。



    本文来自:http://www.flashj.cn/wp/as-to-cocos2d-action.html





    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-18 17:36 , Processed in 0.040796 second(s), 33 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表