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);

  • 相关阅读:
    使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示
    ABP .Net Core 日志组件集成使用NLog
    ABP .Net Core Entity Framework迁移使用MySql数据库
    ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Visual Studio 2019 Window Form 本地打包发布猫腻
    VS Code + NWJS(Node-Webkit)0.14.7 + SQLite3 + Angular6 构建跨平台桌面应用
    ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed
    ABP .Net Core To Json序列化配置
    .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”
  • 原文地址:https://www.cnblogs.com/yssgyw/p/3430209.html
Copyright © 2011-2022 走看看