場景與層的關系
編程的時候往往不需要子類化場景,而是子類化層。雖然場景與層之間是1:n組成的關系,但是通過模板生成的工程默認情況下都是1:1的關系。由模板生成的HelloWorldScene.h和HelloWorldScene.cpp文件中聲明和定義了層HelloWorld類。場景與層的靜態結構關系如xia:scene(1)——layer(1...n)。從這里我們可以看到HelloWorld是子類化Layer,其中createScene()是靜態函數,create()也是驚天函數,init()是實例函數用來初始化層,Scene類是Cocos2d-x提供的場景類,其中的create()是靜態函數用來創建場景,addChild()是實例函數用來將剛剛創建的層添加到場景中。
場景切換相關函數
場景切換是通過導演類Director實現的,其中的相關函數如下:
- 1)void runWithScene(Scene *scene).該函數可以運行場景,只能在啟動第一個場景時調用該函數。如果已經有一個場景運行,則不能調用該函數
- 2)void replaceScene(Scene *scene).切換到下一個場景。用一個新的場景替換當前場景,當前被終端釋放掉
- 3)void pushScene(Scene *scene).切換到下一個場景中,將當前場景掛起放入到場景堆棧中,然后切換到下一個場景中。
*4)void popScene().與pushScene配合使用,可以回到上一個場景。 - 5)void popToRootScene().與pushScene配合使用,可以回到根場景。
需要注意replaceScene和pushScene使用的區別,replaceScene會釋放和銷毀場景,如果要保持原來場景的狀態,replaceScene函數不適合,pushScene并不會釋放和銷毀場景,原來的場景的狀態可以保持,但是游戲中也不能同時又太多的場景對象運行。
場景過渡動畫
場景切換時是可以添加過渡動畫的,場景過渡動畫是由TransitionScene類和它的子類展示的。TransitionScene類的直接子類有13個,而且有些子類還有子類,全部的過渡動畫類有30多個。但是其使用方式都是一樣的類似如下代碼:
auto scene = MyFirsh::createScene();
auto rescene = TransitionFlipX::create(1.0f, scene);
Director::getInstance()-> pushScene(rescene);
意思就是基本所有的過渡動畫都是這樣子寫的,我們要做的就是把代碼中的TransitionFlipX替換成自己想要的效果就OK了;
場景的生命周期
- 1)bool init()。初始化層調用。
- 2)void onEnter()。進入層時調用
- 3)void onEnterTransitionDidFinish()。進入層而且過渡動畫結束時調用。
- 4)void onExit()。退出層時調用。
- 5)void onExitTransitionDidStart()。退出層而且開始過渡動畫時調用。
- void cleanup()。層對象被清除時調用。
提示:層繼承于節點,這些生命周期函數根本上是從Node繼承而來。事實上所有Node對象都有這些函數,只要是子類化這些類都可以重寫這些函數,來處理這些對象的不同生命周期階段事件。:
- void cleanup()。層對象被清除時調用。
重寫HelloWorld層中的幾個生命周期函數,代碼如下:
bool HelloWorld::init()
{
if(!Layer::init())
{
return false;
}
log("HelloWorld init");
...
return true;
}
void HelloWorld::onEnter()
{
Layer::onEnter();
log("HelloWorld onEnter");
}
注意:在重寫生命周期函數中,第一行代碼應該是調用父類的函數。列如,HelloWorld::onEnter()中第一行應該是Layer::onEnter()函數,如果不調用父類的函數則可能會導致層中的動畫,動作或者計劃無法執行。