cocos2d-x for wp之EaseActions——運動加速效果

來源:互聯網
上載者:User

在現實生活中有很多情況下,物體的運動都是帶有加速度的運動。如果只是憑藉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));

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.