Cocos2d-x 動作之瞬時動作

瞬時動作是指能立刻完成的動作,是CCFiniteTimeAction中動作持續時間爲0的特例。更準確地說,這類動作是在下一幀會立刻執行並完成的動作,如設定位置、設定縮放等。這些動作原本可以通過簡單地對CCNode賦值完成,但是把它們包裝爲動作後,可以方便地與其他動作類組合爲複雜動作。

下面介紹一些常用的瞬時動作。

1. CCPlace

該動作用於將節點放置到某個指定位置,其作用與修改節點的Position屬性相同。例如,將魚放置到屏幕座標(100, 100)處,再執行曲線運動curveMove的代碼如下:

CCFiniteTimeAction* placeAction = CCPlace::create(ccp(100, 100));
CCAction* action = CCSequence::create(placeAction, curveMove, NULL);

其中CCSequence又稱爲動作序列,是一種複合動作,它在初始化時,會接受多個動作,當它被執行時,這些動作會按順序逐個執行,形成有序的一列動作。在4.4節中,我們將詳細介紹複合動作。

2. CCFlipXCCFlipY

這兩個動作分別用於將精靈沿XY軸反向顯示,其作用與設置精靈的FlipXFlipY屬性相同。將其包裝爲動作類也是爲了便於與其他動作進行組合。例如,我們想使魚從屏幕的一端遊動到另一端,然後按原路返回。爲了更自然一點(雖然仍然不是很自然),我們設置一個序列,魚先執行移動的動作,在魚到達另一端時反向顯示,然後再執行移動回起點的動作,相關代碼如下:

CCFiniteTimeAction* flipXAction = CCFlipX::create(true);
CCAction* action = CCSequence::create(curveMove, flipXAction, curveMove->reverse(), NULL);

其中reverse的作用是取得原動作的逆動作。在這個例子中,魚沿X軸翻轉後將會沿原路返回起點。

3. CCShowCCHide

這兩個動作分別用於顯示和隱藏節點,其作用與設置節點的Visible屬性的作用一樣。例如,爲了使魚完成遊動之後隱藏起來,我們使用如下代碼:

CCFiniteTimeAction* hideAction = CCHide::create();
CCAction* action = CCSequence::create(curveMove, hideAction, NULL);

4. CCCallFunc

CCCallFunc系列動作包括CCCallFuncCCCallFuncNCCCallFuncND,以及CCCallFuncO四個動作,用來在動作中進行方法的調用(之所以不是函數調用,是因爲它們只能調用某個類中的實例方法,而不能調用普通的C函數)。當某個對象執行CCCallFunc系列動作時,就會調用一個先前被設置好的方法,以完成某些特別的功能。後面我們將舉例說明它的用途。

CCCallFunc系列動作的4個類中,CCCallFunc調用的方法不包含參數,CCCallFuncN調用的方法包含一個CCNode*類型的參數,表示執行動作的對象。CCCallFuncND調用的方法包含兩個參數,不僅有一個節點參數,還有一個自定義參數(CCNode*void*)。CCCallFuncO調用的方法則只包含一個CCObject*類型的參數。

實際上,CCCallFunc系列動作的後綴“N”表示Node參數,指的是執行動作的對象,“D”表示Data參數,指的是用戶自定義的數據,“O”表示對象,指的是一個用戶自定義的CCObject參數。在不同的情況下,我們可以根據不同的需求來選擇不同的CCCallFunc動作。考慮一種情況,我們創建了許多會在屏幕中移動的精靈,希望精靈在移動結束之後就從遊戲中刪除。爲了實現這個效果,我們可以創建一系列動作:首先讓精靈移動,然後調用一個removeSelf(CCNode* nodeToRemove)方法來刪除nodeToRemove對象。在removeSelf方法中需要訪問執行此動作的精靈,因此我們就採用CCCallFuncN來調用removeSelf方法。

在《捕魚達人》中,當魚遊動到屏幕外之後,我們有必要將其從屏幕中除去。否則,魚會在我們看不到的屏幕之外一直存在,導致內存上的浪費。我們一般會在其完成指定動作後,調用相應函數將其清除,相關代碼如下:

CCFiniteTimeAction* actionMoveDone = CCCallFuncN::create(this,
    callfuncN_selector(GameScene::moveActionEnd));
CCAction* action = CCSequence::create(curveMove, actionMoveDone, NULL);

這樣,我們就指定了一個動作序列,當執行了curveMove這個動作之後,再調用actionMoveDone函數。在actionMoveDone中,我們將完成動作的魚從屏幕中移出。

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