在現實生活中有很多情況下,物體的運動都是帶有加速度的運動。如果只是憑藉cocos2d-x(wp)裡的CCActionInstanse(瞬時動作的基類)和CCActionInterval(延時動作的基類)是無法達到“逼真”的現實運動效果的。
所以在cocos2d-x 裡,有一個Ease系列
在Ease的方法裡改變了運動的速度,但是並沒有改變總體時間。如果整個的action持續5秒鐘,那麼整個的時間仍然會持續5秒鐘。
這些action可以被分成3類:
In actions: action開始的時候加速
Out actions: action結束的時候加速
InOut actions: action開始,結束的時候加速
在Ease系列裡的第一個參數為要加減速度的動作,第二個為加減的速率。
下面是個簡單的例子:(m_grossini、m_tamara、m_kathia均為精靈)
CCActionInterval actionBy = CCJumpBy.actionWithDuration(2, new CCPoint(300, 100), 50, 4);m_grossini.runAction(CCEaseIn.actionWithAction(actionBy, 2f));
還有一些特殊的緩衝:
1.指數緩衝(效果:如同指數函數一樣,在開頭或者結尾或者中間突然獲得指數型的加速度)
CCEaseExponentialIn
CCEaseExponentialOut
CCEaseExponentialInOut
CCActionInterval move = CCMoveBy.actionWithDuration(3, new CCPoint(350, 0)); CCActionInterval move_back = move.reverse() as CCActionInterval; CCActionInterval move_ease_in = CCEaseExponentialIn.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_in_back = move_ease_in.reverse() as CCActionInterval; CCActionInterval move_ease_out = CCEaseExponentialOut.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_out_back = move_ease_out.reverse() as CCActionInterval; CCFiniteTimeAction seq1 = CCSequence.actions(move, move_back); CCFiniteTimeAction seq2 = CCSequence.actions(move_ease_in, move_ease_in_back); CCFiniteTimeAction seq3 = CCSequence.actions(move_ease_out, move_ease_out_back); m_grossini.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq1)); m_tamara.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq2)); m_kathia.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq3));
2.賽因緩衝(效果:可以理解為頭尾較為平緩、中間為加速度恒定的勻變速運動)
CCEaseSineIn
CCEaseSineOut
CCEaseSineInOut
CCActionInterval move = CCMoveBy.actionWithDuration(3, new CCPoint(350, 0)); CCActionInterval move_back = move.reverse() as CCActionInterval; CCActionInterval move_ease_in = CCEaseSineIn.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_in_back = move_ease_in.reverse() as CCActionInterval; CCActionInterval move_ease_out = CCEaseSineOut.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_out_back = move_ease_out.reverse() as CCActionInterval; CCFiniteTimeAction seq1 = CCSequence.actions(move, move_back); CCFiniteTimeAction seq2 = CCSequence.actions(move_ease_in, move_ease_in_back); CCFiniteTimeAction seq3 = CCSequence.actions(move_ease_out, move_ease_out_back); m_grossini.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq1)); m_tamara.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq2)); m_kathia.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq3));
3.彈性緩衝(效果:類似於彈了一下一根繃緊的橡皮筋。其實這個效果看名字就知道了)
CCEaseElasticIn
CCEaseElasticOut
CCEaseElasticInOut
CCActionInterval move = CCMoveBy.actionWithDuration(3, new CCPoint(350, 0)); CCActionInterval move_back = move.reverse() as CCActionInterval; CCActionInterval move_ease_in = CCEaseElasticIn.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_in_back = move_ease_in.reverse() as CCActionInterval; CCActionInterval move_ease_out = CCEaseElasticOut.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_out_back = move_ease_out.reverse() as CCActionInterval; CCFiniteTimeAction seq1 = CCSequence.actions(move, move_back); CCFiniteTimeAction seq2 = CCSequence.actions(move_ease_in, move_ease_in_back); CCFiniteTimeAction seq3 = CCSequence.actions(move_ease_out, move_ease_out_back); m_grossini.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq1)); m_tamara.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq2)); m_kathia.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq3));
4.跳躍緩衝(效果:可以理解為一個球從空中落地之後在地上彈跳的情況)
CCEaseBounceIn
CCEaseBounceOut
CCEaseBounceInOut
CCActionInterval move = CCMoveBy.actionWithDuration(3, new CCPoint(350, 0)); CCActionInterval move_back = move.reverse() as CCActionInterval; CCActionInterval move_ease_in = CCEaseBounceIn.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_in_back = move_ease_in.reverse() as CCActionInterval; CCActionInterval move_ease_out = CCEaseBounceOut.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_out_back = move_ease_out.reverse() as CCActionInterval; CCFiniteTimeAction seq1 = CCSequence.actions(move, move_back); CCFiniteTimeAction seq2 = CCSequence.actions(move_ease_in, move_ease_in_back); CCFiniteTimeAction seq3 = CCSequence.actions(move_ease_out, move_ease_out_back); m_grossini.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq1)); m_tamara.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq2)); m_kathia.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq3));
5.回震緩衝(效果:跟跳躍緩衝差不多,不過回震可以看成類似完全彈性碰撞的結果)
CCEaseBackIn
CCEaseBackOut
CCEaseBackInOut
CCActionInterval move = CCMoveBy.actionWithDuration(3, new CCPoint(350, 0)); CCActionInterval move_back = move.reverse() as CCActionInterval; CCActionInterval move_ease_in = CCEaseBackIn.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_in_back = move_ease_in.reverse() as CCActionInterval; CCActionInterval move_ease_out = CCEaseBackOut.actionWithAction((CCActionInterval)(move.copy())); CCActionInterval move_ease_out_back = move_ease_out.reverse() as CCActionInterval; CCFiniteTimeAction seq1 = CCSequence.actions(move, move_back); CCFiniteTimeAction seq2 = CCSequence.actions(move_ease_in, move_ease_in_back); CCFiniteTimeAction seq3 = CCSequence.actions(move_ease_out, move_ease_out_back); m_grossini.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq1)); m_tamara.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq2)); m_kathia.runAction(CCRepeatForever.actionWithAction((CCActionInterval)seq3));