Cocos2d - Action学习总结

来源:互联网 发布:剃刀数据 编辑:程序博客网 时间:2024/06/07 15:18

Action使用注意事项

Action 分为瞬时动作和延时动作,瞬时动作就是没有时间间隔的动作,延时动作是在一定时间内完整指定动作。

 

Sequence:此为连续动作,即可以添加多个动作,使之连续执行,Sequence 是采用嵌套的方式实现动作的连续,即一个Sequence动作只管理两个Action,该Action可能也是一个Sequence,在Sequence计算duration时是计算所有管理的动作的总duration,在动作的step的时候会对动作的已执行时间进行归一化,即已执行时间比上持续时间,然后传给update函数,在update中使用归一化的时间跟一个Action的duration跟总的duration比值来确定Action的执行进度。

Spawn:同上只是在update的时候他是同时执行他管理的两个Action。

RepeatForever,该动作不能放在Sequence和Spawn中,因为RepeatForever是重写了step函数实现的无限循环,动作的执行顺序是先执行step再执行update,而Sequence和Spawn是通过更新子动作的update函数实现的连续或同步,此时RepeatForever的update为父类的空函数,并且RepeatForever的duration是0,也导致RepeatForever动作无法分配到时间片。

 

setSpeed():ActionManager通过Action的step(dt)分发时间片即上一帧游戏帧与本次游戏帧的时间间隔,而游戏帧间隔理论上是相等的,一个游戏帧间隔也称为一个时间片,Action根据时间片来计算Action的已执行时间。设置速度就是在本是一个时间片的更新中,乘以大于1的speed值形成一个假的游戏帧,这会导致Action的执行时间的增加步伐加快,结果Action加快,当speed小于1则减慢,speed>0;设置了speed的Action不可以添加到Sequence或Spawn中,因为speed的实现是step函数,Sequence 和 Spawn 只更新管理的Action的update。

 

Animate:创建时接受一个Animation,利用Animation的总的持续时间乘以循环次数来设置Animate的是duration,当Animation的loops小于0时loops会被设置为变量的最大值来实现一个伪无限循环,而此时的Animate最好不要添加到Sequence和Spawn中,因为无限循环导致Animate 的duration无限大,所以他将导致Sequence或Spawn分得大量的时间片无法结束,并且Sequence时Animate之后的动作很长时间都不会执行;播放该动作的只能是可以显示图片的节点。

 

分为By型和To型的Action,如MoveBy表示在现有的point的基础上加上给定的point,指定持续时间,MoveTo表示直接的在给定的持续时间内移动到指定的point;By型存在reverse取反操作,To型不存在。

 

ActionManager:动作管理器,可以增删,暂停,恢复节点对应的动作,在update中可以获得到游戏帧间隔,所以在这里分发管理的动作,只管理注册的动作,Sequence和Spawn不管理他们包含的动作,当动作执行完成时会自动移除动作,在这里不管Action的duration值分发所有的Action,判断一个动作是否可以分发是Action处理,之后调用Action的isDone判断是否结束。

 

动作是否能加入到Sequence和Spawn主要看他的实现功能的地方,在step中实现的不能,在update中实现的可以,因为添加到Sequence和Spawn的Action不会被调用step,直接调用的是update。

 

Node节点对ActionManager进行了封装,提供runAction接收一个Action参数,该Action就与node绑定,stopAction接收一个Action类型参数,移除指定Action,pause和resume是暂停Node和恢复Node,这里暂停和恢复的包括:与节点绑定的事件,定时器,动作,还可以根据标签操作Action ,stopAllActionsByTag(int tag);移除发现的第一个Action removeAllActionsByTag(inttag)移除所有tag的Action。   Action* getActionByTag(inttag);获取第一个与指定tag相同的Action。stopAllActions()移除与该节点绑定的所有Action。

 

0 0