动作
Cocos2d-x的动作大致分为持续性动作和瞬时性动作。
区别也如字面所属,持续性动作可以设置时长,而瞬时性动作将在一帧内完成。
同时,上述动作也可以通过并行或序列的方式进行叠加。
如,并行:车轮在自身转动的同时也将向前方移动;串行:物体先进行A动作,再进行B动作,最后进行C动作。
在源码实现细节上,Sequence和Spawn组合动作类,并没有采用动态维护一个可变长的动作列表,而是仅定义了m_pOne和m_pTwo两个动作成员变量。其中,m_pTwo代表的是末尾动作,而m_pOne代表的是除末尾动作以外的动作或动作序列。
也就是说,cocos2d-x采用的是递归的方式处理动作列表的,例如存在一个动作序列[A,B,C,D]
那么[A,D] = [A,C](m_pOne1) + [D](m_pTwo1)
= [A,B](m_pOne2) + [C](m_pTwo2) + [D](m_pTwo1)
采用递归的这种方式,而非使用容器,减少了维护的复杂性,同时虽然牺牲了一部分效率,但可以换来代码的简洁,所有的动作组合只需要考虑两个动作的组合即可。
一个栗子:
当一艘船从A驶向B的过程中,若仅让船体以贝塞尔曲线的形式运动,而不时刻调整船头方向明显是不合理的。
在编程中,一个简单而行之有效的办法是通过微分法,以极短的时间内的位移,计算出tan值,再通过arc(tan)算出转动角度,从而模拟船沿运动轨迹的切线运动。