【Cocos2d入門教程五】Cocos2d-x動作篇


動作類(Action)是所有動作的基類,它創建的一個對象代表一個動作。動作作用於Node,包括繼承於之下的Layer、Sprite。因此每個動作 都需要由Node對象或者其繼承者執行。動作類(Action)作為基類,實際上是一個接口,動作類的大多數實現類都派生於有限時間動作類 (FiniteTimeAction)。其關系圖如下:



在實際開發中我們通常用到兩類動作-即時動作和持續動作,它們均繼承於有限時間動作類。

1. 即時動作

  放置Place

  隱藏 Hide

  顯示 Show

  可見切換ToggleVisibility

 

2.延時動作

  移動到MoveTo

  移動 MoveBy

  跳躍到JumpTo 

  跳躍JumpBy   

  貝塞爾BezierBy  

  放大到ScaleTo   設置放大倍數,是浮點型。

  放大ScaleBy

  旋轉到RotateTo

  旋轉RotateBy

  閃爍Blink   設定閃爍次數

  色調變化到TintTo

  色調變換TintBy

  變暗到FadeTo

  由無變亮FadeIn

  由亮變無FadeOut

 

3.組合動作

  序列 Sequence

  同步Spawn

  重復有線次數Repeate

  動作反向Reverse

  動畫Animation

  無限重復RepeatForever

 

4.速度變化

  EaseIn 由慢至快。

  EaseOut 由快至慢

  EaseInOut 由慢至快再由快至慢。

  EaseSineIn 由慢至快。

  EaseSineOut 由快至慢

  EaseSineInOut 由慢至快再由快至慢。

  EaseExponentialIn 由慢至極快。

  EaseExponentialOut 由極快至慢。

  EaseExponentialInOut由慢至極快再由極快至慢。

  Speed 人工設定速度,還可通過SetSpeed不斷調整

下面以幾個常用函數作為案例:

 

  1     Menu * menu =Menu::create();
  2     
  3     menu ->setPosition(Vec2::ZERO);
  4     
  5     addChild(menu);
  6     
  7     //-----------------------------------------------------------------------
  8     //Flip
  9     MenuItemFont * FlipItem =MenuItemFont::create("Filp",CC_CALLBACK_1(NewScene::bgFlip, this));
 10     
 11     FlipItem ->setPosition(60,350);
 12     
 13     menu->addChild(FlipItem);
 14     
 15     
 16     void NewScene::bgFlip(Ref * ref)
 17     {
 18         if (testSp ->isFlippedX())
 19         {
 20             
 21             FlipX * fx = FlipX ::create(false);
 22             
 23             testSp ->runAction(fx);
 24             
 25         }
 26         else
 27         {
 28             
 29             FlipX * fx = FlipX ::create(true);
 30             
 31             testSp ->runAction(fx);
 32         }
 33     }
 34     
 35     
 36     //-----------------------------------------------------------------------
 37     //MoveTo
 38     MenuItemFont * MoveItem =MenuItemFont::create("MoveTo",CC_CALLBACK_1(NewScene::bgMove, this));
 39     
 40     MoveItem ->setPosition(60,300);
 41     
 42     menu->addChild(MoveItem);
 43     
 44     
 45     void NewScene::bgMove(Ref* psend)
 46     {
 47         MoveTo * moveAct = MoveTo::create(0.5,Vec2(400, 400));
 48         
 49         testSp ->runAction(moveAct);
 50     }
 51     
 52     
 53     
 54     //-----------------------------------------------------------------------
 55     //RatateTo
 56     MenuItemFont * RotateItem =MenuItemFont::create("RotateTo",CC_CALLBACK_1(NewScene::bgRotate, this));
 57     
 58     RotateItem ->setPosition(60,250);
 59     
 60     menu->addChild(RotateItem);
 61     
 62     
 63     
 64     void NewScene::bgRotate(Ref * ref)
 65     {
 66         RotateTo * rotate =RotateTo::create(0.5, 100, 100);
 67         
 68         testSp ->runAction(rotate);
 69     }
 70     
 71     
 72     
 73     
 74     //-----------------------------------------------------------------------
 75     //ScaleTo
 76     MenuItemFont * ScaleItem =MenuItemFont::create("ScaleTo",CC_CALLBACK_1(NewScene::bgScale, this));
 77     
 78     ScaleItem ->setPosition(60,200);
 79     
 80     menu->addChild(ScaleItem);
 81     
 82     
 83     void NewScene::bgScale(Ref* psend)
 84     {
 85         ScaleTo * scale =ScaleTo::create(0.5, 2);
 86         
 87         testSp ->runAction(scale);
 88     }
 89     
 90     
 91     
 92     //-----------------------------------------------------------------------
 93     //Hide Show
 94     MenuItemToggle * toggleMenu =MenuItemToggle::createWithCallback(
 95                                                                     CC_CALLBACK_1(NewScene::bgToggle,this),
 96                                                                     MenuItemFont::create("Show"),
 97                                                                     MenuItemFont::create("Hide"),
 98                                                                     NULL);
 99     
100     toggleMenu ->setPosition(60,150);
101     
102     menu ->addChild(toggleMenu);
103     
104     
105     void NewScene::bgToggle(Ref * ref)
106     {
107         if(testSp->isVisible())
108         {
109             Hide * hide =Hide::create();
110             testSp ->runAction(hide);
111             ShowTag =0;
112         }
113         else
114         {
115             Show * show =Show ::create();
116             testSp ->runAction(show);
117             ShowTag =1;
118         }
119         
120     }
121     
122     
123     
124     //-----------------------------------------------------------------------
125     //FadeIn FadeOut
126     MenuItemToggle * FadeToggle =MenuItemToggle::createWithCallback(
127                                                                     CC_CALLBACK_1(NewScene::FadeToggle,this),
128                                                                     MenuItemFont::create("FadeIN"),
129                                                                     MenuItemFont::create("FadeOut"),
130                                                                     NULL);
131     
132     FadeToggle ->setPosition(60,100);
133     
134     menu ->addChild(FadeToggle);
135     
136     
137     void NewScene::FadeToggle(Ref * ref)
138     {
139         if(FadeTag == 1)
140         {
141             FadeOut *  FadeOut = FadeOut ::create(1);
142             
143             testSp ->runAction(FadeOut);
144             
145             FadeTag = 0;
146         }
147         else if (FadeTag == 0)
148         {
149             FadeIn * FadeIn = FadeIn ::create(1);
150             
151             testSp ->runAction(FadeIn);
152             
153             FadeTag = 1 ;
154         }
155         
156     }
157     
158     
159     //-----------------------------------------------------------------------
160     //曲線運動
161     MenuItemFont * Cardin =MenuItemFont::create("Cardin",CC_CALLBACK_1(NewScene::CardIn, this));
162     
163     Cardin ->setPosition(60,50);
164     
165     menu->addChild(Cardin);
166     
167     
168     void NewScene::CardIn(Ref * ref)
169     {
170         PointArray  * array = PointArray ::create(20);
171         
172         array ->addControlPoint(Point(100,100));
173         
174         array ->addControlPoint(Point(200,400));
175         
176         array ->addControlPoint(Point(300,500));
177         
178         CardinalSplineTo * CardIn = CardinalSplineTo::create(1, array, 5);
179         
180         testSp ->runAction(CardIn);
181     }

 

注意:這里需要注意To跟By的不同,To的話在坐標系中是以絕對位置,By的話在坐標系中是以node對象的相對位置進行執行動作。

如果你想搭配reverse()一起用的話用To是無效的,必須用By.


Ok.關於Cocos2d-x的動作就分享至此。不對的地方還望指出互相探討學習

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM