Cocos2d-x动作Action
Cocos2d中Action类图
主要可以分为两种类型的Action
ActionInstant 及时动作,当设置后可以立即执行完毕,没有动画类似。
ActionInterval 延时动作,设置后动作执行需要一定的时间,会有一定动画。
所有的动作都可以通过Action*Action:: reverse()获取动作的逆向动作,例如MoveTo动作调用reverse,则可以获得一个往回移动的动作。
ActionInstant及时动作
Place ,移动位置,相当于调用Node::setPosition
FlipX和FlipY,沿节点的中间的X/Y轴翻转,内部调用的是Sprite::setFlippedX/setFlippedY
Show和Hide,显示和隐藏相当于调用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;
类图如下: