cocos2dx 3.1從零學習(五)——動畫

 動畫是遊戲中最重要的表現部分,本篇只是初步學習大部分動畫的使用方法,沒有什麼原理性的東西,但是例子有很多,如果有不熟的地方要練一下。 特別是Spawn和Sequence的組合使用,什麼時候使用Spawn,什麼使用使用Sequence,怎麼在它們之間相互嵌套對方。用光你的腦細胞盡力的去折磨這幾個函數吧!做出儘可能多的絢麗的組合!

動畫方法

動畫的方法都在Node中,它的子類包括Layer、Sprite、MenuItem等。
runAction 啓動動畫
stopAction 停止動畫
stopActionByTag 根據tag停止動畫
……

動畫原理

創建好動作animation,在需要執行動作的地方執行runAction來對其添加動畫。
動畫原理暫不做深入研究,後面做項目完善。

常用動畫

Fade(In, Out)
Move(To,By)
Jump(To,By)

eg:
使某個精靈隨機移動到屏幕上的某個點(注意均速運動)
遊戲中有二級跳,如何實現

Blink 閃爍
Sequence 組合序列,動作依次執行,注意參數以NULL結尾。
DelayTime 延時執行

eg:
設計一動畫序列,平移200後,延時1秒後再分4次跳回。

Rotate(To,By)圍繞錨點(AnchorPoint)旋轉
Scale(To,By)縮放動畫,s爲放大縮小比例
Spawn組合並行動畫,動作同時執行,注意參數以NULL結尾

eg:
設計一動畫,使背景旋轉放大後充滿屏幕
設計一動畫序列,向前旋轉移動300像素後,平移100,然後再跳躍100.

動畫回調

CallFunc  與sequence組合使用
CallFuncN

eg:
4個精靈在中心位置先後移動到屏幕的4個角。
  1. //4個精靈在中⼼位置先後移動到屏幕的4個⾓  
  2. void SecondaryJump:: FourSprites (cocos2d :: Ref * ref )  
  3. {  
  4.     auto act = Sequence :: create( MoveTo ::create (1, Point(10, 10)), CallFuncN ::create ([=]( Node * node ){  
  5.         sp5 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (10, 630)), CallFuncN :: create([=]( Node * node ){  
  6.             sp6 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (950, 630)), CallFuncN :: create([=]( Node * node ){  
  7.                 sp7 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (950, 10)), nullptr ));  
  8.             }), nullptr ));  
  9.         }), nullptr ));  
  10.     }), nullptr );  
  11.     sp4-> runAction (act );  
  12. }  


動畫回調加音效
  1.  //動畫回調  
  2. auto callFunc = CallFuncN :: create([=]( Node * node )  
  3. {  
  4.     node ->setVisible ( false);  
  5. });  
  6.   
  7. auto act = Sequence :: create( Spawn ::create ( RotateTo:: create (2, 720), MoveBy :: create(2, Point (100, 0)), nullptr ), \  
  8.     MoveBy ::create (1, Point(100, 0)), JumpBy ::create (0.2f, Point(0, 0), 100, 1),  callFunc ,\  
  9.     CallFuncN ::create ([=]( Node * node ){   \  
  10.            CocosDenshion :: SimpleAudioEngine:: sharedEngine ()->playBackgroundMusic ( "music/game_music.wav"true );   }),  
  11.     nullptr );  
  12.   
  13. sp2-> runAction (act );  


其他動畫

循環動畫

Repeat、RpeatForever
//實現一個菜單按鈕的抖動。 像那種輸入賬號密碼錯誤後,輸入框抖動報錯。
在MenuItem的回調函數中這樣寫,其實就是  左下 左上 右上 右下快速重複移動六次:
  1. void SecondaryJump:: Jump (cocos2d :: Ref * ref )  
  2. {  
  3.     MenuItemFont * item = (MenuItemFont *) ref;  
  4.     auto repeatAct = Repeat :: create( Sequence ::create ( MoveBy:: create (0.01f, Point (3, 3)), MoveBy ::create (0.01f, Point(-3, -3)), MoveBy ::create (0.01f, Point(3, -3)), MoveBy ::create (0.01f, Point(-3, 3)), nullptr ), 6);  
  5.     item-> runAction (repeatAct );  
  6. }  

幀動畫Animate

貝塞爾曲線

  1. void FrameAnimation:: Morning_0623 (cocos2d :: Ref * ref )  
  2. {  
  3.     auto animation = Animation :: create();  
  4.     for ( int i = 2; i <= 6; i ++)  
  5.     {  
  6.         String fileName = StringUtils:: format ("coc/characters_lowres/%d.0.png" , i);  
  7.         animation ->addSpriteFrameWithFileName ( fileName. getCString ());  
  8.   
  9.     }  
  10.     animation-> setDelayPerUnit (0.05f);  
  11.     animation-> setLoops (-1);  
  12.     auto animate = Animate :: create( animation );  
  13.   
  14.     auto pArr = PointArray :: create(5);  
  15.     pArr-> addControlPoint (Point (100, 0));  
  16.     pArr-> addControlPoint (Point (100, 200));  
  17.     pArr-> addControlPoint (Point (300,200));  
  18.     pArr-> addControlPoint (Point (300, 400));  
  19.     auto move = CardinalSplineBy :: create(5, pArr , 1);  
  20.     auto act = Spawn :: create( animate , move , nullptr);  
  21.   
  22.     ccBezierConfig bezierCon ;  
  23.     bezierCon. controlPoint_1 =CCPointMake (200, 150); //控制點1  
  24.     bezierCon. controlPoint_2 =CCPointMake (200, 160); //控制點2  
  25.     bezierCon. endPosition =CCPointMake (540, 100); // 結束位置  
  26.     sp-> runAction (Spawn :: create( act , BezierBy :: create(3, bezierCon ), nullptr ));  
  27. }  

eg:
      屏幕上有10個精靈隨機移動,精靈有相應的隨機血量,相碰後血量少的精靈消失,最後只剩下最後一個精靈。(考慮精靈封裝成Enemy類)
      代碼分析:我的代碼中SpriteHW、SpriteHWT、AnimationHW這三個類。這道題的難度在於精靈碰撞檢測後的刪除。具體的可以參考AnimationHW的update。 使用C++自身的vector,沒有在遍歷的時候進行刪除,而是標記刪除。在檢測碰撞完畢後再遍歷一次vector對標記刪除的元素進行刪除。
      關於精靈隨機位置的問題,使用rand會有每次運行隨機數都一樣的問題,這裏給它添加一個隨機種子,只要在init()裏面添加一句srand((unsigned)time(NULL));即可每次隨機不一樣的數字。





現在cocos2dx還沒支持中文,我還沒有找到好的unicode等轉碼的好的開源代碼,能力有限不想自己寫搞得代碼很亂,囧。


代碼SVN同步地址(如果哪天沒有了,見諒,可能不續費了):https://www.svnchina.com/svn/lanou
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章