cocos2dx抖动动作

由于工作需要,所以自己写了一个抖动动作类

cocos2dx抖动动作

通过头文件可以知道,抖动类是继承于ActionInterval类,cocos2dx中很多动作类都是继承的这个类(比如:MoveBy等)。

下面我们接着看实现:

cocos2dx抖动动作

提供了两种创建方式的接口,在initWithDuration函数里面把m_strengthX和m_strengthY记录下来。

cocos2dx抖动动作

通过头文件我们可以知道,update、startWithTarget和stop都是重写的基类的虚函数。

当我们在外部调用这个动作的时候(比如:sp_fangkuai->runAction(Shake::create(1.0, 5));),就会执行到startWithTarget函数里面来,这个时候我们把初始坐标用m_initialPos记录下来。

当动作开始之后,每帧都会调用update函数,通过到基类里面去看update函数的注释可以知道参数dt的范围是0->1,0表示动作刚开始,0.5表示动作进行了一半,1表示动作结束。

当动作结束之后,会执行到stop函数,这个时候通过基类的getTarget()接口获取到执行这个动作的node,并且把node的坐标改成m_initialPos,这个时候节点node就还原了。

注意:当一个节点node正在执行抖动动作的时候,不能重复执行抖动动作。为什么?因为正在执行抖动动作的节点此时的坐标有可能不是原坐标,当你再次执行这个动作的时候,就会把当前坐标赋值给m_initialPos,等动作执行完之后,节点可能会还原不到初始位置。当然也可以外部记录好节点的初始坐标,等动作执行完之后通过setPosition手动还原。

总结:原理其实很简单,就是在持续时间内,并且在给定范围内随机一个坐标,并且把节点的位置改变到这个坐标上。在动作结束之后还原节点的位置。

能力有限,如有什么错误,欢迎大家一起交流。