Cocos2d-x动作Action

Cocos2d-x动作Action

Cocos2dAction类图

主要可以分为两种类型的Action

ActionInstant 及时动作,当设置后可以立即执行完毕,没有动画类似。

ActionInterval 延时动作,设置后动作执行需要一定的时间,会有一定动画。

 

所有的动作都可以通过Action*Action:: reverse()获取动作的逆向动作,例如MoveTo动作调用reverse,则可以获得一个往回移动的动作。

ActionInstant及时动作

Place ,移动位置,相当于调用Node::setPosition

FlipXFlipY,沿节点的中间的X/Y轴翻转,内部调用的是Sprite::setFlippedX/setFlippedY

ShowHide,显示和隐藏相当于调用Node::setVisible

CallFunc ,执行一个函数

RemoveSelf ,将节点自己删除,内部调用的是Node::removeFromParentAndCleanup

 

ActionInterval延时动作

MoveTo/MoveBy ,移动到定点处/移动相对的位置

JumpTo/JumpBy ,跳跃到定点处/跳跃相对的位置

BezierTo/BezierBy ,沿着塞贝尔曲线移动到定点/相对位置

ScaleTo/ScaleBy ,缩放到指定大小/相对大小

RotateTo/RotateBy ,旋转到指定角度/相对的角度

FadeIn/FadeOut/FateTo ,淡入/淡出

Blink ,闪烁

 

复合动作

Repeat ,重复一个动作指定的次数

RepeatForever ,一直重复一个动作

Spawn ,同时执行多个动作(节点也可以多次调用runaction,设置多个动作同时运行)

Sequence ,按顺序执行一系列的动作

Speed ,改变动作执行的速度

ActionEase ,改动动作执行的加速度。

 

Action代码分析

Cocos2d中所有的动作都是有导演Director类中的变量ActionManager*_actionManager管理。actionManager在函数Director::init中初始化,初始化完成后会加入到ScheduleUpdate中,这样在每帧绘制前都会调用ActionManager::update函数。Director::init代码如下:

    _actionManager=new (std::nothrow)ActionManager();

_scheduler->scheduleUpdate(_actionManager,Scheduler::PRIORITY_SYSTEM,false);

 

 

ActionManager类中有一个Action的列表_targets,调用Node::runAction时会向_targets列表中添加一个Action

在每帧绘制前都会调用ActionManager::update更新所有的动作,ActionManager::update会遍历_targets列表,调用每一个动作的Action::step虚函数,setp函数内部会调用Action::update函数更新动作。

每个Action节点Node*_target,代表当前正在运行动作的节点。所以每个Actoin对象只能有一个节点运行。如果另个节点需要相同的动作,可以调用Action*Action ::clone函数,克隆一个动作。

ActionManager类的_targets列表中,会为每个Node节点分配一个结构体,每个结构体中会有一个Action数组,存放该Node节点上的动作。所以一个节点可以同时运行多个动作。结构体代码如下:

typedefstruct_hashElement

{

    struct_ccArray    *actions;//动作数组

    Node               *target;//节点

    int                actionIndex;

    Action             *currentAction;

    bool               currentActionSalvaged;

    bool               paused;

    UT_hash_handle     hh;

} tHashElement;

类图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值