1. 程式人生 > >cocos2d-x 動作的分類與使用

cocos2d-x 動作的分類與使用

       原本計劃是把動作的概念理清,並分類介紹如何使用,但是網上看到幾篇寫得比較詳細,而且都有例項,在此就轉載一下,並表示一下感謝。

//////////////////這一段轉自Cocos2d-x官方中文文件 v3.x////////////////////////////

動作類(Action)是所有動作的基類,它建立的一個物件代表一個動作。動作作用於Node,因此每個動作都需要由Node物件執行。動作類(Action)作為基類,實際上是一個介面,動作類的大多數實現類都派生於有限時間動作類(FiniteTimeAction)。

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

即時動作

即時動作只能夠立刻完成的動作,這類動作是在下一幀立刻完成的動作,如設定位置、設定縮放等。把它們包裝成動作後,可以與其他動作類組合為複雜動作。

下面介紹一些常用即時動作

Place

該動作用於將節點放置到某個指定位置,其作用與修改節點的position屬性相同。例如,將節點放到螢幕座標(10, 10)處的程式碼如下:

auto placeAction =Place::create(Point(10,10));

FlipX和FlipY

這兩個動作分別用於將精力沿X軸和Y軸反向顯示,其作用與設定精靈的FlipX和FlipY屬性相同,將其包裝成動作是為了便於與其他動作進行組合。

下面程式碼將一個精靈移動到一端後反向顯示再進行移回原點的動作:

auto flipxAction =FlipX::create(true
);auto moveTo =MoveTo::create(0.4f,Point(0,0));auto action =Sequence::create(moveTo, flipxAction, moveTo->reverse(), NULL);

其中Sequence是動作序列,後面將詳細介紹,reverse的作用是獲得原動作的逆動作。

Show和Hide

這兩個動作分別用於顯示和隱藏節點,其作用與設定節點的visible屬性作用一樣。例如,為了使精靈完成移動後隱藏起來,可以用如下程式碼:

auto hideAction =Hide::create();auto moveTo 
=MoveTo::create(0.4f,Point(0,0));auto action =Sequence::create(moveTo, hideAction, NULL);

CallFunc

CallFunc系列動作包括CallFunc、CallFuncN兩個動作,用來在動作中進行方法呼叫。在遊戲中為了節約記憶體資源,我們可以在動作完成後呼叫相應函式清理記憶體,如下程式碼:

auto actionMoveDone =CallFuncN::create([&](Ref* sender){
        log("Clear memory");});auto moveTo =MoveTo::create(0.4f,Point(0,0));auto action =Sequence::create(moveTo, actionMoveDone, NULL);

持續動作

屬性變化動作

屬性變化動作通過屬性值的逐漸變化來實現動畫效果。需要注意的是XXTo和XXBy的區別在於XXTo是表示最終值,而XXBy則表示向量-改變值。

MoveTo和MoveBy

用於使節點做直線運動,設定了動作時間和終點位置,在規定時間內會移動到終點,它們的初始化方法如下:

MoveTo::create(float duration,constPoint& position);MoveBy::create(float duration,constPoint& position);

MoveTo的position值表示最後位置,而MoveBy的position則表示移動的位置。

JumpTo和JumpBy

使節點以一定的軌跡跳躍到指定位置,它們的初始化方法如下:

JumpTo::create(float duration,constPoint& position,float height,int jumps);JumpBy::create(float duration,constPoint& position,float height,int jumps);

BezierTo和BezierBy

使節點進行曲線運動,運動的軌跡由貝塞爾曲線描述。

每條貝塞爾曲線都包含一個起點和一個終點。在一條曲線中,起點和終點各自包含一個控制點,而控制點到端點的連線稱作控制線。控制點決定了曲線的形狀,包含角度和長度兩個引數。如下圖:

bezier

使用時,我們要先建立ccBezierConfig結構體,設定好終點endPosition以及兩個兩個控制點controlPoint_1和controlPoint_2後,再把結構體傳入BezierTo或BezierBy的初始化方法中:

    ccBezierConfig bezier;
    bezier.controlPoint_1 =Point(0,0);
    bezier.controlPoint_2 =Point(100,100);
    bezier.endPosition =Point(50,100);auto bezierAction =BezierTo::create(0.5f, bezier);

ScaleTo和ScaleBy

產生縮放效果,使節點的縮放係數隨時間線性變化,對應初始化方法為:

ScaleTo::create(float duration,float s);ScaleBy::create(float duration,float s);

RotateTo和RotateBy

產生旋轉效果,對應初始化方法為:

RotateTo::create(float duration,float deltaAngle);RotateBy::create(float duration,float deltaAngle);

視覺特效動作

該類用來實現特殊視覺效果

FadeIn, FadeOut和FateTo

產生淡入淡出效果,和透明變化效果,對應的初始化方法為:

FadeIn::create(float d);淡入FadeOut::create(float d);淡出FadeTo::create(float duration,GLubyte opacity);一定時間內透明度變化

TintTo和TintBy

設定色調變化,這個動作較少使用,初始化方法為:

TintTo::create(float duration,GLubyte red,GLubyte green,GLubyte blue);TintBy::create(float duration,GLubyte red,GLubyte green,GLubyte blue);

red, green, blue的取值範圍為0~255

Blink

使節點閃爍,其初始化方法為:

Blink::create(float duration,int blinks);

其中blinks為閃爍次數

Animation

以幀動畫形式實現動畫效果,以下程式碼用兩種方法實現精靈幀動畫效果:

//手動建立動畫auto animation =Animation::create();for(int i=1;i<15;i++){char szName[100]={0};
        sprintf(szName,"sprite_%02d.png", i);
        animation->addSpriteFrameWithFile(szName);}

    animation->setDelayPerUnit(2.8f/14.0f);
    animation->setRestoreOriginalFrame(true);auto action =Animate::create(animation);
    sprite->runAction(Sequence::create(action, action->reverse(), NULL));//檔案建立動畫auto cache =AnimationCache::getInstance();
    cache->addAnimationsWithFile("animation.plist");auto animation2 = cache->getAnimation("dance_1");auto action2 =Animate::create(animation2);
    sprite->runAction(Sequence::create(action2, action2->reverse(), NULL));

動畫建立後需要一個動畫播放器來播放這些動畫,這個播放器就是Animate。

複合動作

通常在開發中我們需要將各種動作組合起來再讓節點執行,複合動作的作用就是將各種動作組合在一起。而且,複合動作本身也是動作。因此可以作為一個普通動作嵌入到其他動作中。

注意:Sequence動作不能嵌入其他複合動作內使用,DelayTime不屬於複合動作,但是隻能在複合動作內使用。

DelayTime

延時動作其實什麼都不做,提供一段空白期,它只有一個初始化方法:

DelayTime::create(float d);

d表示需要延時的時間。

Repeat/RepeatForever

反覆執行某個動作,通常我們用Repeat和RepeatForever這兩個方法執行:

Repeat::create(FiniteTimeAction*action,unsignedint times);RepeatForever::create(ActionInterval*action);

Spawn

使一批動作同時執行,他的兩個初始化方法:

Spawn::create(FiniteTimeAction*action1,...);Spawn::create(constVector<FiniteTimeAction*>& arrayOfActions);

Sequence

讓各種動作有序執行,以下為它的兩個初始化方法:

Sequence::create(FiniteTimeAction*action1,...);Sequence::create(constVector<FiniteTimeAction*>& arrayOfActions);

變速動作

變速動作和符合動作類似,也是一種特殊的動作,它可以把任何動作按照改變後的速度執行。

Speed

用於線性的改變某個動作的速度,為了改變一個動作的速度,首先需要將目標動作包裝到Speed動作中:

auto repeat =RepeatForever::create(animation);auto speed =Speed::create(repeat,0.5f);
    sprite->run(speed);

第二個引數為變速比例,設定為0.5f則速度為原來一半。

ActionEase

Speed雖然能改變動作的速度,但是隻能按比例改變速度,ActionEase可以實現動作的速度由快到慢、速度隨時間改變的勻速運動。該類包含5類運動,指數緩衝、Sine緩衝、彈性緩衝、跳躍緩衝和回震緩衝。每類運動都包含3個不同時期的變換:In、Out和InOut。

以下以InSine為例:

auto sineIn =EaseSineIn::create(action);
    sprite->runAction(sineIn);

*****************這一段轉自ArmyShen的http://www.cnblogs.com/ArmyShen/p/3239677.html**************

1、動作基本概念

CCAction是動作的基類,所有的動作都派生自此類。CCAction的一個物件就是一個動作,動作或動畫只能由CCNode來執行

CCSprite* sp = CCSprite::create("Icon.png");//建立一個精靈
sp->setPosition( ccp(20, 20) );//設定精靈初始位置
this->addChild(sp, 0);//新增精靈到場景中
CCAction *action = CCMoveTo::create(1.0f, ccp(0,0));//建立一個CCMoveTo動作,1s之內移動到ccp(0, 0)位置
sp->runAction(action);//執行動作

同一時間段內,一個動作只能由一個CCNode來執行,如果想N個CCNode同時執行一個動作,要使用copy複製動作:

CCAction *action = CCMoveTo::cre