原文地址:http://blog.csdn.net/yanghuiliu/article/details/7261808 在實現(xiàn)運動中,,我們常常需要實現(xiàn)一些加速度或者減速度的效果,,cocos2d-x引擎為我們提供了相應(yīng)的實現(xiàn)接口,這樣我們就不用再用原來的公式計算方法來實現(xiàn)加減速度的效果 Ease系列的方法改變了運動的速度,,但是并沒有改變總體時間,如果整個的action持續(xù)5秒鐘,那么整個的時間仍然會持續(xù)5秒鐘,。 這些action可以被分成3類: In Out InOut 第一個參數(shù)為要加減速度的動作,第二個為加減的速率 還有一些特殊的緩沖公式繼承了進來 1.指數(shù)緩沖 EaseExponentialIn EaseExponentialOut EaseExponentialInOut 2.賽因緩沖 EaseSineIn EaseSineOut EaseSineInOut 3.彈性緩沖 EaseElasticIn EaseElasticOut EaseElasticInOut 4.跳躍緩沖 EaseBounceIn EaseBounceOut EaseBounceInOut 5.回震緩沖 EaseBackIn EaseBackOut EaseBackInOut 另外還可以設(shè)置速度的倍數(shù) 通過把動作定義為CCSpeed并改變速度,,使用setSpeed將速度按參數(shù)的倍數(shù)變大或者縮小,這樣可以手動實現(xiàn)加減速度 尊重作者勞動,,轉(zhuǎn)載時請標明文章出處。 作者:Bugs Bunny 地址:http://www.cnblogs.com/cocos2d-x/archive/2012/03/13/2393898.html 本文函數(shù)圖像使用GeoGebra繪制,,感謝它才華橫溢的作者,。 為了方便用戶靈活地控制精靈運動,cocos2d-x提供了CCActionEase類系的動作,。它們擁有相似的名字——CCEaseXxxxIn,、CCEaseXxxxOut、CCEaseXxxxInOut,,同時也擁有相似的行為——速度由慢至快,、速度由快至慢、速度先由慢至快再由快至慢,。但是除了這些,,我們對CCActionEase一無所知。就算查閱參考手冊,,我們能得到的信息也不過是類似Ease Sine In的簡短說明,。它們究竟是什么模樣,我們該如何選擇,? 今天我們就來解決這個問題,。鑒于CCActionEase類系的龐大,文章可能會分成兩到三篇,。 1)CCEaseSineIn在《cocos2d-x動作系統(tǒng)淺析》一文中提到: 1 void CCEaseSineIn::update(ccTime time) 之前我們已經(jīng)知道CCActionEase類系的動作就是調(diào)整其他動作的速度,變換出新的效果,。這里的m_pOther就是那個被影響的動作,,而一切魔力的源頭就在它接受的參數(shù)上。CCEaseSineIn將傳入的百分比參數(shù)進行了一系列變換,,然后傳給了m_pOther,。 我們將這個變換公式提取出來,記作: 上圖中的黑色曲線就是f(x)的函數(shù)圖像,。它的定義域從0開始,到1結(jié)束,,值域也是這樣,。根據(jù)這條線的走勢,可以粗略看出速度是越變越快的,,但還是不夠形象,。 2)CCEaseSineOut我們再來看下CCEaseSineOut類。 1 void CCEaseSineOut::update(ccTime time) 同理得出: 同樣我們更關(guān)注那條紅色曲線,,它從最高點C出發(fā),,一路下降到達A點。這表明在CCEaseSineOut動作中,,速度是越來越慢的,,它的圖像也呈正弦變化,。 3)CCEaseSineInOut我們知道CCEaseXxxxInOut的速度變化是先由慢至快,,再由快至慢。如果我們將上面兩個圖像拼在一起,,然后在將橫軸比例縮小一倍,,那結(jié)果就是這條曲線的模樣了。 1 void CCEaseSineInOut::update(ccTime time) f(x)=-0.5*(cos(π*x)-1) x∈[0,1] 在CCEaseSineInOut中,,這兩段曲線正好是同一個函數(shù)(非分段函數(shù))的圖像。很巧妙是不是,? 小結(jié)CCEaseSineIn,、CCEaseSineOut、CCEaseSineInOut這三個動作同屬速度正弦變化,,變化的范圍是[0,π/2],。 4)CCEaseExponentialIn有了前面的經(jīng)驗,后面就容易多了,,先來看一下CCEaseExponentialIn的update函數(shù),。 1 void CCEaseExponentialIn::update(ccTime time) 大家可能已經(jīng)注意到,這里使用了一個條件運算符,,于是表達式變作了分段函數(shù),。 注意這條不是速度的曲線,。 現(xiàn)在我們開始在腦中想象一下精靈按照CCEaseExponentialIn動作移動的詳細步驟,。 簡單來說,總時間的前0.342%部分以及最終的那一瞬間的運動是不太正常的,。 但是為什么會這樣呢?是引擎的bug嗎,? 下面這段都是我自己的推測,,也就是猜到,大家看看就好了,。 大家都知道cocos2d-x多使用單精度浮點型數(shù)字,,以及寫0.0009765625f比較麻煩等諸多因素,最后這個公式就簡化成了現(xiàn)在的模樣。 我的猜想說完了,,我們接著來求導(dǎo): 按照最理想的那個公式繪制出圖像,,這里我們只看那條紅色的曲線。這條曲線從D點開始一路上升,,迅速到達C點,。如果你對它再次求導(dǎo),就能得出其加速度的變化規(guī)律,。從DC曲線上應(yīng)該可以看出其加速度也是越來越大的,。 CCEaseExponentialIn的速度由慢至快,,從0.006769上升至6.931472,,呈指數(shù)級變化。 5)CCEaseExponentialOut1 void CCEaseExponentialOut::update(ccTime time) CCEaseExponentialOut與CCEaseExponentialIn的實現(xiàn)是相似的,,唯一的不同是CCEaseExponentialOut在最后一瞬間會有短距離的跳躍(千分之一的誤差),,而CCEaseExponentialIn是舍棄部分。個人認為CCEaseExponentialOut的處理方式更合理些,。 這里沒有難點,,我直接讓工具生成的導(dǎo)函數(shù)圖像。 6)CCEaseExponentialInOut在《知易游戲開發(fā)教程cocos2d-x移植版003》中有一段CCEaseExponentialInOut的演示代碼,,測試運行時會發(fā)現(xiàn)精靈最后以極快的速度飛出了屏幕,是筆者使用不當,,還是別的什么原因,?當時由于時間、精力的問題沒有深入研究,,今天借此機會將問題分析一下,。 1 void CCEaseExponentialInOut::update(ccTime time) 呵呵,典型的分段函數(shù),。繪制函數(shù)圖像如下: 圖中這條藍色的曲線就是CCEaseExponentialInOut使用的分段函數(shù),。很明顯可以看到在A點處,曲線走向發(fā)生了90°的變化,,向著點(1,-511)延伸,。它沒有像前面說過的函數(shù)那樣逼近點C(1,1),,這就解釋了為什么精靈莫名其妙地飛出了屏幕。 這是一個bug,,我們希望曲線的后半段能像那條綠色的曲線AC那樣,。(我只在Win32平臺上測試的,不知其他平臺上是否也存在這個問題,,有興趣的朋友可以測試下,。) 我的修改如下: 1 void CCEaseExponentialInOut::update(ccTime time) 修正后,,動作的行為正常了,。 CCEaseExponentialIn,、CCEaseExponentialOut、CCEaseExponentialInOut這三個動作同屬速度指數(shù)級變化,,變化的范圍是[0.00677,6.93147],。 |
|
來自: 清輝花園 > 《cocos2dx》