場(chǎng)景與層的關(guān)系
編程的時(shí)候往往不需要子類化場(chǎng)景牲证,而是子類化層闽撤。雖然場(chǎng)景與層之間是1:n組成的關(guān)系添吗,但是通過模板生成的工程默認(rèn)情況下都是1:1的關(guān)系届惋。由模板生成的HelloWorldScene.h和HelloWorldScene.cpp文件中聲明和定義了層HelloWorld類入桂。場(chǎng)景與層的靜態(tài)結(jié)構(gòu)關(guān)系如xia:scene(1)——layer(1...n)奄薇。從這里我們可以看到HelloWorld是子類化Layer,其中createScene()是靜態(tài)函數(shù)事格,create()也是驚天函數(shù)惕艳,init()是實(shí)例函數(shù)用來初始化層,Scene類是Cocos2d-x提供的場(chǎng)景類驹愚,其中的create()是靜態(tài)函數(shù)用來創(chuàng)建場(chǎng)景远搪,addChild()是實(shí)例函數(shù)用來將剛剛創(chuàng)建的層添加到場(chǎng)景中。
場(chǎng)景切換相關(guān)函數(shù)
場(chǎng)景切換是通過導(dǎo)演類Director實(shí)現(xiàn)的逢捺,其中的相關(guān)函數(shù)如下:
- 1)void runWithScene(Scene *scene).該函數(shù)可以運(yùn)行場(chǎng)景谁鳍,只能在啟動(dòng)第一個(gè)場(chǎng)景時(shí)調(diào)用該函數(shù)。如果已經(jīng)有一個(gè)場(chǎng)景運(yùn)行劫瞳,則不能調(diào)用該函數(shù)
- 2)void replaceScene(Scene *scene).切換到下一個(gè)場(chǎng)景倘潜。用一個(gè)新的場(chǎng)景替換當(dāng)前場(chǎng)景,當(dāng)前被終端釋放掉
- 3)void pushScene(Scene *scene).切換到下一個(gè)場(chǎng)景中志于,將當(dāng)前場(chǎng)景掛起放入到場(chǎng)景堆棧中涮因,然后切換到下一個(gè)場(chǎng)景中。
*4)void popScene().與pushScene配合使用伺绽,可以回到上一個(gè)場(chǎng)景养泡。 - 5)void popToRootScene().與pushScene配合使用,可以回到根場(chǎng)景奈应。
需要注意replaceScene和pushScene使用的區(qū)別澜掩,replaceScene會(huì)釋放和銷毀場(chǎng)景,如果要保持原來場(chǎng)景的狀態(tài)杖挣,replaceScene函數(shù)不適合肩榕,pushScene并不會(huì)釋放和銷毀場(chǎng)景,原來的場(chǎng)景的狀態(tài)可以保持惩妇,但是游戲中也不能同時(shí)又太多的場(chǎng)景對(duì)象運(yùn)行株汉。
場(chǎng)景過渡動(dòng)畫
場(chǎng)景切換時(shí)是可以添加過渡動(dòng)畫的筐乳,場(chǎng)景過渡動(dòng)畫是由TransitionScene類和它的子類展示的。TransitionScene類的直接子類有13個(gè)郎逃,而且有些子類還有子類哥童,全部的過渡動(dòng)畫類有30多個(gè)。但是其使用方式都是一樣的類似如下代碼:
auto scene = MyFirsh::createScene();
auto rescene = TransitionFlipX::create(1.0f, scene);
Director::getInstance()-> pushScene(rescene);
意思就是基本所有的過渡動(dòng)畫都是這樣子寫的褒翰,我們要做的就是把代碼中的TransitionFlipX替換成自己想要的效果就OK了贮懈;
場(chǎng)景的生命周期
- 1)bool init()。初始化層調(diào)用优训。
- 2)void onEnter()朵你。進(jìn)入層時(shí)調(diào)用
- 3)void onEnterTransitionDidFinish()。進(jìn)入層而且過渡動(dòng)畫結(jié)束時(shí)調(diào)用揣非。
- 4)void onExit()抡医。退出層時(shí)調(diào)用。
- 5)void onExitTransitionDidStart()早敬。退出層而且開始過渡動(dòng)畫時(shí)調(diào)用忌傻。
- void cleanup()。層對(duì)象被清除時(shí)調(diào)用搞监。
提示:層繼承于節(jié)點(diǎn)水孩,這些生命周期函數(shù)根本上是從Node繼承而來。事實(shí)上所有Node對(duì)象都有這些函數(shù)琐驴,只要是子類化這些類都可以重寫這些函數(shù)俘种,來處理這些對(duì)象的不同生命周期階段事件。:
- void cleanup()。層對(duì)象被清除時(shí)調(diào)用搞监。
重寫HelloWorld層中的幾個(gè)生命周期函數(shù)绝淡,代碼如下:
bool HelloWorld::init()
{
if(!Layer::init())
{
return false;
}
log("HelloWorld init");
...
return true;
}
void HelloWorld::onEnter()
{
Layer::onEnter();
log("HelloWorld onEnter");
}
注意:在重寫生命周期函數(shù)中宙刘,第一行代碼應(yīng)該是調(diào)用父類的函數(shù)。列如牢酵,HelloWorld::onEnter()中第一行應(yīng)該是Layer::onEnter()函數(shù)悬包,如果不調(diào)用父類的函數(shù)則可能會(huì)導(dǎo)致層中的動(dòng)畫,動(dòng)作或者計(jì)劃無法執(zhí)行馍乙。