動作類(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的動作就分享至此。不對的地方還望指出互相探討學習