動畫是遊戲中最重要的表現部分,本篇只是初步學習大部分動畫的使用方法,沒有什麼原理性的東西,但是例子有很多,如果有不熟的地方要練一下。 特別是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個角。
- //4個精靈在中⼼位置先後移動到屏幕的4個⾓
- void SecondaryJump:: FourSprites (cocos2d :: Ref * ref )
- {
- auto act = Sequence :: create( MoveTo ::create (1, Point(10, 10)), CallFuncN ::create ([=]( Node * node ){
- sp5 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (10, 630)), CallFuncN :: create([=]( Node * node ){
- sp6 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (950, 630)), CallFuncN :: create([=]( Node * node ){
- sp7 ->runAction ( Sequence:: create (MoveTo :: create(1, Point (950, 10)), nullptr ));
- }), nullptr ));
- }), nullptr ));
- }), nullptr );
- sp4-> runAction (act );
- }
動畫回調加音效
- //動畫回調
- auto callFunc = CallFuncN :: create([=]( Node * node )
- {
- node ->setVisible ( false);
- });
- auto act = Sequence :: create( Spawn ::create ( RotateTo:: create (2, 720), MoveBy :: create(2, Point (100, 0)), nullptr ), \
- MoveBy ::create (1, Point(100, 0)), JumpBy ::create (0.2f, Point(0, 0), 100, 1), callFunc ,\
- CallFuncN ::create ([=]( Node * node ){ \
- CocosDenshion :: SimpleAudioEngine:: sharedEngine ()->playBackgroundMusic ( "music/game_music.wav", true ); }),
- nullptr );
- sp2-> runAction (act );
其他動畫
循環動畫
Repeat、RpeatForever
//實現一個菜單按鈕的抖動。 像那種輸入賬號密碼錯誤後,輸入框抖動報錯。
在MenuItem的回調函數中這樣寫,其實就是 左下 左上 右上 右下快速重複移動六次:
- void SecondaryJump:: Jump (cocos2d :: Ref * ref )
- {
- MenuItemFont * item = (MenuItemFont *) ref;
- 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);
- item-> runAction (repeatAct );
- }
幀動畫Animate
貝塞爾曲線
- void FrameAnimation:: Morning_0623 (cocos2d :: Ref * ref )
- {
- auto animation = Animation :: create();
- for ( int i = 2; i <= 6; i ++)
- {
- String fileName = StringUtils:: format ("coc/characters_lowres/%d.0.png" , i);
- animation ->addSpriteFrameWithFileName ( fileName. getCString ());
- }
- animation-> setDelayPerUnit (0.05f);
- animation-> setLoops (-1);
- auto animate = Animate :: create( animation );
- auto pArr = PointArray :: create(5);
- pArr-> addControlPoint (Point (100, 0));
- pArr-> addControlPoint (Point (100, 200));
- pArr-> addControlPoint (Point (300,200));
- pArr-> addControlPoint (Point (300, 400));
- auto move = CardinalSplineBy :: create(5, pArr , 1);
- auto act = Spawn :: create( animate , move , nullptr);
- ccBezierConfig bezierCon ;
- bezierCon. controlPoint_1 =CCPointMake (200, 150); //控制點1
- bezierCon. controlPoint_2 =CCPointMake (200, 160); //控制點2
- bezierCon. endPosition =CCPointMake (540, 100); // 結束位置
- sp-> runAction (Spawn :: create( act , BezierBy :: create(3, bezierCon ), nullptr ));
- }
eg:
屏幕上有10個精靈隨機移動,精靈有相應的隨機血量,相碰後血量少的精靈消失,最後只剩下最後一個精靈。(考慮精靈封裝成Enemy類)
屏幕上有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