zoukankan      html  css  js  c++  java
  • 动作之CCActionInterval(持续动作)家族

    持续动作,顾名思义,就是该动作的执行将持续一段时间。因此持续动作的静态生成函数,往往附带一个时间值Duration

    持续动作类名后缀:一般有两种后缀,一种是To,一种是ByTo表示最终达到的目标值,By表示增量值。如:

    1.                   CCMoveBy::actionWithDuration(0.5f,ccp(5,5));//表示花0.5秒,按向量(5,5)移动一段距离

    2.                   CCMoveTo::actionWithDuration(0.5f,ccp(5,5));//表示花0.5秒,移动到坐标(5,5)

    持续动作比立即动作的数量要多很多,所有的CCActionInterval子类动作有:

    CCAccelAmplitude

    CCAccelDeccelAmplitude

    CCActionCamera

    CCActionEase家族:补间动画

    CCActionTween

    CCAnimate:帧动画

    CCBezierBy:……贝兹移动 CCBezierTo:贝兹移动到

    CCBlink:闪耀

    CCCardinalSplineTo

    CCDeccelAmplitude

    CCDelayTime:延时

    CCFadeIn:从无到有,也叫淡入

    CCFadeOut:从有到无,也叫淡出、

    CCFadeTo: 改变不透明度到某个值

    CCGridAction家族:网格动画

    CCJumpBy:……跳跃   CCJumpTo:跳跃到

    CCMoveBy……移动 CCMoveTo:移动到

    CCProgressFromTo

    CCProgressTo

    CCRepeat (包装器):重复执行几次

    CCRepeatForever (包装器):永远执行

    CCReverseTime

    CCRotateBy:……旋转

    CCRotateTo:旋转到

    CCScaleTo: 缩放到、CCScaleBy:按……缩放

    CCSequence (包装器):按序列执行

    CCSkewTo:切变到、CCSkewBy:按……切变

    CCSpawn (包装器):同时执行

    CCTargetedAction

    CCTintBy……颜色渐变

    CCTintTo颜色渐变到

    CCBRotateTo

    CCBRotateXTo

    CCBRotateYTo

    第二部分:简单的持续动作

    这些动作都非常简单,和立即动作的区别只是增加了一个执行时间而已。但还有一些要注意的地方:

    1.旋转动作顺时针是正方向

    2.关于贝兹曲线

    贝兹曲线的描述结构体如下:

    1.                   /** @typedef bezier configuration structure

    2.                   */

    3.                   typedef struct _ccBezierConfig {

    4.                               //! end position of the bezier

    5.                               CCPoint endPosition;

    6.                               //! Bezier control point 1

    7.                               CCPoint controlPoint_1;

    8.                               //! Bezier control point 2

    9.                               CCPoint controlPoint_2;

    10.                } ccBezierConfig;

    如果执行节点是this的话,那么对应个点的位置如图。说明: http://img1.51cto.com/attachment/201201/211340207.png

    注意,当使用CCBezierTo时,ccBezierConfig的点都是绝对坐标点。但如果使用CCBezierByccBezierConfig的点都是相对坐标点。这点要谨记。

    第三部分:一些包装器

    这些动作单独无法起作用,需要包装其他动作类才行。他们的作用是对于动作的执行,增加一些变化。非常类似于装饰者模式。

    1.CCRepeat:用于重复执行几次动作,times表示执行次数

    使用举例:在我的炸弹人例子中,用到如下写法,我播放一个炸弹动画若干次,然后启动爆炸的相关代码。

    1.                   CCFiniteTimeAction *action=getAnimate();//获得炸弹播放动画,自己实现的函数                

    2.                   CCAction *sequneceAction = CCSequence::actions(

    3.                               CCRepeat::actionWithAction(action,5),

    4.                               CCCallFunc::actionWithTarget(this, callfunc_selector(Bomb::deadOnCallback)),

    5.                               NULL);

    6.                   sprite->runAction(sequneceAction);

    2.CCRepeatForever:永远执行一个动作

    使用举例:比如,一个精灵我只会改变他的位置,但是不需要改变他的动画,那么我就可以使用这个来保持这个动画一直运行,我在炸弹人的Monster类中使用了类似代码:

    1.                   CCActionInterval *action=getAnimate();//获得炸弹播放动画,自己实现的函数   

    2.                   spirte->runAction(CCRepeatForever::actionWithAction(action));

    3.CCSequence:按序列执行动作,这会让节点连续执行几个动作。

    使用举例:这个例子经常使用的时候,就是执行一个动作,然后回调。比如主角行走一个格子后,切换为站立状态。我在炸弹人的Hero类中使用了这种方法:

    1.                   CCAction *sequneceAction = CCSequence::actions(moveByAction,CCCallFunc::actionWithTarget(this, callfunc_selector(Hero::moveDoneCallback)),NULL);

    2.                               this->runAction(sequneceAction);

    注意最后要使用NULL结尾。表示传参结束。我不明白为什么非要强制加NULL,按道理说C++不定参数表,可以不用NULL的。看源代码才发现,里面用到了真值判断刷循环。我不知道这是为了和ObjectiveC语法保持一致还是为什么,我并不熟悉Objc

    1.                   CCFiniteTimeAction* CCSequence::actions(CCFiniteTimeAction *pAction1, …)

    2.                   {

    3.                               va_list params;

    4.                               va_start(params, pAction1);

    5.                  

    6.                               CCFiniteTimeAction *pNow;

    7.                               CCFiniteTimeAction *pPrev = pAction1;

    8.                               while (pAction1)

    9.                               {

    10.                                        pNow = va_arg(params, CCFiniteTimeAction*);

    11.                                        if (pNow)

    12.                                        {

    13.                                                    pPrev = actionOneTwo(pPrev, pNow);

    14.                                        }

    15.                                        else

    16.                                        {

    17.                                                    break;

    18.                                        }

    19.                            }

    20.               

    21.                            va_end(params);

    22.                            return pPrev;

    23.                }

    4.CCSpawn:同时执行几个动作,最终动作的持续时间,由时间最长的那个动作确定。

    使用举例:可以用CCSpacwn来做翻跟头的动画,只需要组合moveToRotateByTest中有这个代码:

    1.                   CCAction* action = CCSpawn::actions(

    2.                       CCJumpBy::actionWithDuration(2, CCPointMake(300,0), 50, 4),

    3.                       CCRotateBy::actionWithDuration( 2, 720),

    4.                       NULL);

    5.                   m_grossini->runAction(action);

    注意,从字面意思你就知道,不要在CCSequence中使用CCRepeatForever,两者是互相冲突的。

    第四部分:反动作

    反动作是使用一个接口实现的,该接口直接返回一个此动作的反动作。

    1.                   virtual CCFiniteTimeAction *    reverse (void)

    注意,并非所有动作都有反动作,xxxTo没有,xxxBy则有

    使用举例:反动作很容易造出一个动作循环来,在Test中有这个代码:

    1.                   CCActionInterval* jump = CCJumpBy::actionWithDuration(2, CCPointMake(300,0), 50, 4);

    2.                   CCFiniteTimeAction* action = CCSequence::actions( jump, jump->reverse(), NULL);

    3.                   m_grossini->runAction(action);

  • 相关阅读:
    【AS3代码】小游戏打飞机源代码
    【AS3代码】键盘的输入和输出
    PHP多维数组排序
    【AS3代码】一个完整的游戏框架
    【AS3代码】小画板升级版(带重绘回放和清空功能)
    Liunx命令工作总结(1)
    Java NIO基础 我们到底能走多远系列(17)
    ibatis 一对多 解决方案
    图片上传+预览+剪切解决方案我们到底能走多远系列(20)
    Liunx命令工作总结(2)
  • 原文地址:https://www.cnblogs.com/yssgyw/p/3430209.html
Copyright © 2011-2022 走看看