Cocos2dx遊戲教程(十):“見縫插針”,動作篇Action

一個成功的遊戲如果只是一堆靜態圖片,那麼和一幅畫有什麼區別呢?所以動靜結合纔是王道~~
動作體系對於一款遊戲的成功與否是有着非常重要的影響的。在這一節中將會帶大家簡單的認識動作體系。

常見的動作

我們在上節中發現場景的切換方式還可以採用runAction的方式使用

//跳轉場景
this->runAction(Sequence::create(
	DelayTime::create(2.5f),
	CallFunc::create(CC_CALLBACK_0(WelcomeScene::replace2MenuScene, this)),
	NULL));

我們先可以看一下動作類的關係圖
在這裏插入圖片描述
Action是動作的基類,主要使用FiniteTimeAction有限次動作執行,就是按時間順序執行一系列動作,執行完後動作結束;
FiniteTimeAction又分爲ActionInstanse(瞬時動作的基類)和ActionInterval(延時動作的基類)。ActionInstanse:沒什麼特別,跟ActionInterval主要區別是沒有執行過程,動作瞬間就執行完成了;ActionInterval:執行需要一定的時間(或者說一個過程)。我們用的最多的就是延時動作、
ActionMessage是管理所有Action的單例,一般情況下並不直接使用這個單例,而是使用Node的接口,但是假如你想操作的目標不是Node的子類或者你想暫停/恢復行動就要使用到ActionMessager

大家可以通過查看源代碼可以看到Cocos2dx已經爲我們提供了很多基本的動作表示
詳情可以查看CCActionInterval.h
網上有很多關於動作的使用方式,在這不一一介紹
可以參考大神的博文,對常見的動作描述的很詳細
https://blog.csdn.net/w00w12l/article/details/13996497?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

這兒摘錄下大神的動作列表,大家可以看一下相關使用方式

	Sprite * sp= Sprite::create("Icon.png");
    sp->setPosition(Vec2(150, 150));
    addChild(sp,0,922);
    
    //    Action動作
    
    // MoveBy  創建一個移動的動作   參數1:移動到目標座標所需的時間 參數2:目標座標    支持reverse 可以獲取其反向動作
    //     MoveTo  一樣的
    ActionInterval * moveBy = MoveBy::create(5,Vec2(300, 100));
    ActionInterval * actionmoveback= moveBy->reverse();
    sp->runAction(actionmoveback);
    
    //     ScaleTo   作用:創建一個縮放的動作
    //    參數1:達到縮放大小所需的時間
    //    參數2 :縮放的比例
    ActionInterval * scaleto = ScaleTo ::create(2, 2);
    sp->runAction(scaleto);
    
    //     ScaleBy  作用:創建一個縮放的動作
    //    參數1:達到縮放大小的所需時間  參數2:縮放比例
    ActionInterval * scaleby = ScaleBy::create(2, 2);
    ActionInterval * actionbyback = scaleby->reverse();
    sp->runAction(actionbyback);
    
    //     RotateTo
    //    作用創建一個旋轉的動作
    //    參數1:旋轉的時間  參數2:旋轉餓角度  0 - 360
    ActionInterval * rotateto = RotateTo::create(2, 90);
    sp->runAction(rotateto);
    
    //   SkewTo
    //   作用創建一個傾斜的動作
    //    參數1:傾斜到特定角度所需的時間
    //    參數2:x軸的傾斜角度
    //    參數3:y軸的傾斜角度
    ActionInterval * skewto = SkewTo::create(2, 10, 10);
    sp->runAction(skewto);
    
    //     JumpTo
    //    作用:創建一個跳的動作
    //    參數1:跳到目標動作位子的所需時間
    //    參數2:目標位置
    //    參數3:跳的高度
    //    參數4跳到目標位置的次數
    ActionInterval* jumpto = JumpTo ::create(2, Vec2(300, 200), 50, 4 );
    sp->runAction(jumpto);
    
    //     JumpBy
    //    作用:創建一個跳的動作
    //    參數1:跳到目標動作位子的所需時間
    //    參數2:目標位置
    //    參數3:跳的高度
    //    參數4跳到目標位置的次數
    //    這個支持方向動作reverse
    ActionInterval * jumpby = JumpBy ::create(3, Vec2(300, 200), 50, 4);
    ActionInterval * ac= jumpby->reverse();
    sp->runAction(ac);



    //         Bezier
    //     BezierConfig結構體
     BezierConfig bezierCon;
    bezierCon.controlPoint_1=Vec2(200, 150);//控制點1
    bezierCon.controlPoint_2=Vec2(200, 160);//控制點2
    bezierCon.endPosition =Vec2(340, 100);// 結束位置
    //BezierTo
    //        創建一個貝塞爾曲線運動的動作
    //        參數1:貝塞爾曲線運動的時間
    //        參數2 : BezierConfig結構體
    ActionInterval * action = BezierTo::create(2, bezierCon);
    ActionInterval * action1 = BezierBy::create(3, bezierCon);//支持反向
    ActionInterval * action2 = action->reverse();
    sp->runAction(action1);
    
    
    //FadeIn
    //作用:創建一個漸變出現的動作
    //參數是時間
    ActionInterval * fadein = FadeIn::create(2);
    sp->runAction(fadein);
    
    
    //     FadeOut
    //    作用:創建一個漸變消失的動作
    //    參數是時間
    ActionInterval * fadeout = FadeOut::create(2);
    sp->runAction(fadeout);
    
    
    // TintTo
    //    作用:創建一個色彩變化的消失動作
    //    參數1:色彩變化的動作
    //    參數2 :紅色分量
    //    參數3:藍色分量
    ActionInterval * tinto = TintTo ::create(3, 255, 255, 0);
    sp->runAction(tinto);
    
    
    //     TintBy
    //    作用:創建一個色彩變化的出現動作
    //    參數1:色彩變化的動作
    //    參數2 :紅色分量
    //    參數3:藍色分量   但是家了reverse就是 反向的
    ActionInterval * tintby = TintBy::create(3, 0, 255, 255);
    ActionInterval * tintby1 = tintby->reverse();
    sp->runAction(tintby1);
    
    //     Blink
    //    作用 :創建一額閃爍的動作
    //    參數1:閃爍完成的時間
    //    參數2:閃爍的次數
    
    ActionInterval * blink = Blink ::create(3, 10);
    sp->runAction(blink);
    
    
    
    //     DelayTime
    //    創建一個延遲的動作
    //    參數  延遲的時間
    ActionInterval * delaytime = DelayTime::create(3);
    sp->runAction(delaytime);
    
    //     OrbitCamera
    //    作用:創建一個球面座標軌跡進行旋轉的動作
    //    參數1 : 旋轉軌跡的時間
    //    參數2 :起始半徑
    //    參數3:半徑差
    //    參數4:起始z角
    //    參數5:旋轉z角的差
    //    參數6:起始x角
    //    參數7:旋轉x角的差
    ActionInterval * orbitcameraa = OrbitCamera::create(3, 10, 0, 45, 180, 90, 0);
    sp->runAction(orbitcameraa);
    
    
    //     CardinalSpline
    //    作用:創建數組  點的數組
    PointArray * array = PointArray::create(20);
    array->addControlPoint(Vec2(0,0));
    array->addControlPoint(Vec2(210,0));
    array->addControlPoint(Vec2(210,240));
    array->addControlPoint(Vec2(0,160));
    array->addControlPoint(Vec2(0,0));
    //    CardinalSplineTo
    //    作用:創建一個樣條曲線軌跡的動作
    //    參數1:完成軌跡所需的時間
    //    參數2:控制點的座標數組
    //    擬合度  其值= 0 路徑最柔和
    ActionInterval  * CardinalSplineTo=CardinalSplineTo::create(3, array, 0);
    sp->runAction(CardinalSplineTo);
    
    
    //    CardinalSplineBy
    //    作用:創建一個樣條曲線軌跡的動作
    //    參數1:完成軌跡所需的時間
    //    參數2:控制點的座標數組
    //    擬合度  其值= 0 路徑最柔和
    ActionInterval * CardinalSplineBy = CardinalSplineBy::create(3, array, 0);
    sp->runAction(CardinalSplineBy);
    
    //    CatmullRomTo   CatmullRomBY
    //    作用:創建一個樣條插值軌跡
    //    參數1:完成軌跡的時間
    //    參數2:控制點的數組座標
    ActionInterval * catmullRomTo = CatmullRomTo::create(3, array);
    sp->runAction(catmullRomTo);
    
    //    Follow
    //    作用:創建一個跟隨動作
    //    參數1:跟隨的目標對象
    //    跟隨範圍,離開範圍就不再跟隨
    //創建一個參照物spT
    Sprite * spt = Sprite::create("Icon.png");
    spt->setPosition(Vec2(420,40));
    addChild(spt);
    sp->runAction(MoveTo::create(3, Vec2(940,sp->getPositionY())));
    
    Follow * follow = Follow::create(sp,Rect(0, 0, 960, 320));
    this-> runAction(follow);
    
    //     EaseBounceIn
    //    目標動作
    ActionInterval* move = MoveTo::create(3, Vec2(300, sp->getPositionY()));
    ////    讓目標動作緩慢開始
    ////    參數:目標動作
    ActionInterval * EaseBounceIn = EaseBounceIn::create(move);
    sp->runAction(EaseBounceIn);
    
    //    EaseBounceOut
    //    作用:讓目標動作賦予反彈力,且以目標動作結束位子開始反彈
    //    參數目標動作
    ActionInterval * easeBounceOut = EaseBounceOut ::create(move);
    sp->runAction(easeBounceOut);
    
    //    EaseBounceInOut
    //    作用:讓目標動作賦予反彈力,且以目標動作起始與結束位子開始反彈
    ActionInterval * easeBounceInOut= EaseBounceInOut::create(move);
    sp->runAction(easeBounceInOut);
    
    //   EaseBackIn
    //    作用:讓目標動作賦予回力 , 且以目標動作起點位置作爲回力點
    //    參數:目標動作
    ActionInterval * easeBackIn = EaseBackIn::create(move);
    sp->runAction(easeBackIn);
    
    //    EaseBackOut
    //    作用:讓目標動作賦予回力 , 且以目標動作終點位置作爲回力點
    //    參數:目標動作
    ActionInterval *easeBackOut = EaseBackOut::create(move);
    sp->runAction(easeBackOut);
    
    //     EaseBackInOut
    //    作用:讓目標動作賦予回力 , 且以目標動作起點和終點位置作爲回力點
    //    參數:目標動作
     ActionInterval * easeBackInOut =  EaseBackInOut::create(move);
    sp->runAction(easeBackInOut);
    
    //     EaseElasticIn
    //    作用:讓目標動作賦予彈性 ,且以目標動作起點位子賦予彈性
    //     參數:目標動作
     ActionInterval * easeElasticIn=  EaseElasticIn::create(move);
    sp->runAction(easeElasticIn);
    
    //      EaseElasticOut
    //    作用:讓目標動作賦予彈性 ,且以目標動作終點位子賦予彈性
    //     參數:目標動作
     ActionInterval *easeElasticOut =  EaseElasticOut::create(move);
    sp->runAction(easeElasticOut);
    
    //     EaseElasticInOut
    //    作用:讓目標動作賦予彈性 ,且以目標動作起點和終點位子賦予彈性
    //     參數:目標動作
     ActionInterval *easeElasticInOut =  EaseElasticOut::create(move);
    sp->runAction(easeElasticInOut);
    
    
    //     EaseExponentialIn
    //    讓目標動作緩慢開始
    //    參數:目標動作
     ActionInterval * easeExponentialIn=  EaseExponentialIn::create(move);
    sp->runAction(easeExponentialIn);
    
    //     EaseExponentialOut
    //    讓目標動作緩慢中止
    //    參數:目標動作
    ActionInterval * easeExponentialInt=  EaseExponentialOut::create(move);
    sp->runAction(easeExponentialInt);
    
    //     EaseExponentialInOut
    //    讓目標動作緩慢開始和中止
    //    參數:目標動作
     ActionInterval * easeExponentialInOut=  EaseExponentialInOut::create(move);
    sp->runAction(easeExponentialInOut);
    
    //     EaseRateAction
    //    作用 : 讓目標動作設置速率
    //    參數1:目標動作
    //    參數2:速率
     ActionInterval * moveto =  MoveTo::create(5,  p(300,sp->getPositionY()));
     ActionInterval * easeRateAction =  EaseRateAction::create(move, 3);
    sp->runAction(easeRateAction);
    
    //     EaseSineIn
    //    作用:動作由慢到快
    //      參數:目標動作
     ActionInterval * easeSineIn =  EaseSineIn::create(move);
    sp->runAction(easeSineIn);
    
    //     EaseSineOut
    //    作用:動作由快到慢
    //      參數:目標動作
     ActionInterval * easeSineOut =  EaseSineOut::create(move);
    sp->runAction(easeSineOut);
    
    //     EaseSineInOut
    //    作用:動作由慢到快再快到慢
    //      參數:目標動作
     ActionInterval * easeSineInOut =  EaseSineInOut::create(move);
    sp->runAction(easeSineInOut);



//     Speed
    //    作用:讓目標動作運行速度加倍
    //    參數1:目標動作
    //    參數2:倍速
     ActionInterval * move =  MoveTo::create(10,  p(300,sp->getPositionY()));
     Speed * speed = Speed::create(move, 100);
    sp->runAction(speed);
    
    //     Spawn
    //  作用:讓多個動作同時執行
    //    參數:目標動作的可變參數
     ActionInterval * move1 =  MoveTo::create(10,  p(300,sp->getPositionY()));
     ActionInterval * scale =  ScaleTo::create(2, 3);
     ActionInterval * rotate =  RotateTo::create(4, 190);
     FiniteTimeAction * spawn = Spawn::create(move1,scale,rotate,NULL);
    sp->runAction(spawn);
    
    //     Sequence
    //    作用:讓多個動作按照前後順序逐一執行
    //    參數:目標動作的可變參數
     ActionInterval * move2 =  MoveTo::create(2,  p(300, sp->getPositionY()));
     ActionInterval * scalet =  ScaleTo::create(2, 3);
     FiniteTimeAction * seq=  Sequence::create(move2,scalet,NULL);
    sp->runAction(seq);


        //    擴展如果要對目標動作全部進行方向運動,可以使用如下形式操作
     FiniteTimeAction *seqe= Sequence::create(moveby,scaleby,...NULL);
     FiniteTimeAction * reverseseq =  Sequence::create(seqe,seq->reverse(),NULL)



//注意 Sequence中的所有動作都必須支持reverse函數,否則會出現異常
     ActionInterval * move =  MoveBy::create(2,  p(300, sp->getPositionY()));
     ActionInterval * scale =  ScaleBy::create(2, 3);
     FiniteTimeAction * seq=  Sequence::create(move,scale,NULL);
     FiniteTimeAction * reveseseq =  Sequence::create(seq,seq->reverse(),NULL);
    sp->runAction(reveseseq);



    
    //     Repeat
    //    作用:對目標動作進行重複運動(目標動作可以是 Sequence , Spawn)
    //    參數1:目標動作
    //    參數2:重複次數
     ActionInterval * move =  MoveTo::create(2,  p(300, sp->getPositionY()));
     ActionInterval * move2 =  MoveTo::create(2,  p(100,100));
     FiniteTimeAction*seq = Sequence::create(move,move2,NULL);
     FiniteTimeAction *repeat =  Repeat::create(seq, 3);
    sp->runAction(repeat);


    //     RepeatForever
    //    作用:對目標動作進行永久性的重複運動(目標動作可以是 Sequence , Spawn)
    //    參數:目標動作
     ActionInterval * move =  MoveTo::create(1,  p(300, sp->getPositionY()));
     ActionInterval * move1 =  MoveTo::create(1,  p(100,100));
     FiniteTimeAction* seq =  Sequence::create(move,move1,NULL);
     ActionInterval * repeatForever = RepeatForever::create(( ActionInterval* )seq);
    sp->runAction(repeatForever);
    
    //     CallFunc
    //    作用:創建一個回調動作(調用不帶參數的回調方法);
    //    參數1:目標動作
    //    參數2:目標回調函數
     ActionInterval * move =  MoveTo::create(1,  p(300, sp->getPositionY()));
     CallFunc * funcall=  CallFunc::create(this, callfunc_selector(HelloWorld::callbackC));
     FiniteTimeAction * seq =  Sequence::create(move,funcall,NULL);
    sp->runAction(seq);
    
    //     CallFuncN
    //    作用:創建一個回調動作(調用 帶一個參數的回調方法);
    //    參數1:目標動作
    //    參數2:目標回調函數
     ActionInterval * move =  MoveTo::create(1,  p(300, sp->getPositionY()));
     CallFuncN * funcall=  CallFuncN::create(this, callfuncN_selector(HelloWorld::callbackN));
     FiniteTimeAction * seq =  Sequence::create(move,funcall,NULL);
    sp->runAction(seq);
    
    //     CallFuncND
    //    作用:創建一個回調動作(調用 帶兩個參數的回調方法);
    //    參數1:目標動作
    //    參數2:目標回調函數
     ActionInterval * move =  MoveTo::create(1,  p(300, sp->getPositionY()));
     CallFuncND * funcall=  CallFuncND::create(this, callfuncND_selector(HelloWorld::callbackND)  ,(void*)0xbebabeba);
     FiniteTimeAction * seq =  Sequence::create(move,funcall,NULL);
    sp->runAction(seq);

在下一節中我們將會結合主場景實現結合來給大家介紹下相關的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章