瞬時動作是指能立刻完成的動作,是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. CCFlipX
和CCFlipY
這兩個動作分別用於將精靈沿X和Y軸反向顯示,其作用與設置精靈的FlipX
和FlipY
屬性相同。將其包裝爲動作類也是爲了便於與其他動作進行組合。例如,我們想使魚從屏幕的一端遊動到另一端,然後按原路返回。爲了更自然一點(雖然仍然不是很自然),我們設置一個序列,魚先執行移動的動作,在魚到達另一端時反向顯示,然後再執行移動回起點的動作,相關代碼如下:
CCFiniteTimeAction* flipXAction = CCFlipX::create(true);
CCAction* action = CCSequence::create(curveMove, flipXAction, curveMove->reverse(), NULL);
其中reverse
的作用是取得原動作的逆動作。在這個例子中,魚沿X軸翻轉後將會沿原路返回起點。
3. CCShow
和CCHide
這兩個動作分別用於顯示和隱藏節點,其作用與設置節點的Visible
屬性的作用一樣。例如,爲了使魚完成遊動之後隱藏起來,我們使用如下代碼:
CCFiniteTimeAction* hideAction = CCHide::create();
CCAction* action = CCSequence::create(curveMove, hideAction, NULL);
4. CCCallFunc
CCCallFunc
系列動作包括CCCallFunc
、CCCallFuncN
、CCCallFuncND
,以及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
中,我們將完成動作的魚從屏幕中移出。