CCActionEase的实现原理

案例

在一段时间(duration)内将Sprite移动到B点,可以使用CCMoveTo来实现。CCMoveTo是实现匀速运动,如果要实现非匀速运动,可以用CCActionEase对CCMoveTo进行装饰(Decorator)(真正使用的是其子类,子类实现了具体的非匀速运动方式)。

问题

能够将匀速变为非匀速的实现原理是什么?或者更进一步,改变CCActionInterval(CCMoveTo是ActionInterval中的一种)的行为是怎样实现的?

原理

其原理是将自然时间(也就是我们的时钟上的时间)与实际运动时间进行了一个映射,也就是说,CCActionEase是在总的运动时间不变的情况下,改变了时间的快慢。这样的映射很多,具体可以参考:http://hosted.zeh.com.br/tweener/docs/en-us/misc/transitions.html,在http://www.robertpenner.com/easing/easing_demo.html中还可以观看一些演示效果。

当调用CCSprite::runAction时,此action被加到CCActionManager中进行管理。当需要更新一帧,CCDirector会调用CCActionManager::update(deltaTime)。此就去会让它所管理的没有超时的action更行更新update。在此之前所使用的时间都还是自然时间。从action::update开始,便开始使用实际运动时间。具体过程可以用下图来表示:

以CCEaseIn为例,它在update方法中,将实际运动时间变为pow(ratioOfTimeElapsed, rate),其中rate为松弛(Ease)系数,典型的如2,3。


你可能感兴趣的:(cocos2d,原理,action,ease,松驰)