ActionManager 是一个管理所有动作的单例,多数情况下会通过node 中的接口来调用而不直接调用ActionManager;那么ActionManager内部封装了哪些内容?首先看看他的数据结构:
ActionManager 用一个结构体用来放一个Node所对应的Action信息:
- Action信息包括: 该Node要执行的action数组(ccArray ),Node当前正在执行的Action 以及在数组中的索引
- UT_hash_handle 哈希结构决定了tHashElement可以储存一个target或者多个taget(链式连接)的信息。
typedef struct _hashElement
{
struct _ccArray *actions;
Node *target;
int actionIndex;
Action *currentAction;
bool currentActionSalvaged;
bool paused;
UT_hash_handle hh;
} tHashElement;
那么一个node如何执行action的呢?如下图所示;
在Director的init()中设置每帧会调用update, 在mainLoop的调度优先级是PRIORITY_SYSTEM; 关于update:
-
在update 中对遍历到每个node的每个action;调用step()方法;
step() : 计算出当前帧的动作执行进度,即一个百分比updateDt;在调用update做出当前帧的更新; -
update中会对执行完毕的action和target 进行移除;使用到两个标记变量;_currentTargetSalvaged=false是用来告诉系统,当前target正在执行动作,不能进行移除target;_currentTargetSalvaged为true时执行deleteHashElement;
currentActionSalvaged则用来暂时保留action而不被release; 动作执行完毕后removeAction再对action执行release