Cocos2d-x場景切換相關函數介紹
場景切換是通過導演類Director實現的其中的相關函數如下
runWithScene(Scene* scene)。該函數可以運行場景。隻能在啟動第一個場景時候調用該函數。如果已經有一個場景運行情況下則不能調用該函數。
replaceScene(Scene* scene)。切換到下一個場景。用一個新的場景替換當前場景當前場景被終端釋放。
pushScene(Scene* scene)。切換到下一個場景。將當前場景掛起放入到場景堆棧中然後再切換到下一個場景中。
void popScene()。與pushScene配合使用可以回到上一個場景。
void popToRootScene()。與pushScene配合使用可以回到根場景。
我們需要注意replaceScene和pushScene使用的區別。replaceScene會釋放和銷毀場景如果需要保持原來場景的狀態replaceScene函數不適合。pushScene並不會釋放和銷毀場景原來場景的狀態可以保持但是場景不能放太多的場景對象。
使用replaceScene代碼如下
auto sc = Setting::createScene(); Director::getInstance()->replaceScene(sc);
其中的Setting是下一個要切換的場景。使用pushScene代碼如下
auto sc = Setting::createScene(); Director::getInstance()->pushScene(sc);
從Setting場景回到上一個場景使用代碼如下
Director::getInstance()->popScene();
下麵我們通過一個實例場景切換相關函數如下圖所示有兩個場景HelloWorld和Setting設置。在HelloWorld場景點擊“遊戲設置”菜單可以切換到Setting場景在Setting場景中點擊“OK”菜單可以返回到HelloWorld場景。

我們首先需要在工程中添加一個Setting場景SettingScene.cpp和SettingScene.h如下圖所示右鍵點擊HelloWorld工程中Classes文件夾在彈出菜單中選擇“添加”→“新建項”

彈出對話框如下圖所示在名稱中輸入“SettingScene.cpp”並選擇保存文件位置然後點擊“添加”按鈕創建SettingScene.cpp。使用同樣的方法創建SettingScene.h。

下麵我們看看代碼部分HelloWorldScene.cpp中的重要代碼如下
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin();
Sprite *bg = Sprite::create("background.png");
bg->setPosition(Point(origin.x + visibleSize.width/2,
origin.y +visibleSize.height /2));
this->addChild(bg);
//開始精靈
Sprite *startSpriteNormal = Sprite::create("start-up.png");
Sprite *startSpriteSelected =Sprite::create("start-down.png");
MenuItemSprite*startMenuItem = MenuItemSprite::create(startSpriteNormal,
startSpriteSelected,
CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this));
startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700,170)));
//設置圖片菜單
MenuItemImage *settingMenuItem = MenuItemImage::create(
"setting-up.png",
"setting-down.png",
CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this));
settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480,400)));
//幫助圖片菜單
MenuItemImage *helpMenuItem = MenuItemImage::create(
"help-up.png",
"help-down.png",
CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this));
helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860,480)));
Menu*mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);
mu->setPosition(Point::ZERO);
this->addChild(mu);
return true;
}
voidHelloWorld::menuItemSettingCallback(Ref* pSender) ①
{
autosc = Setting::createScene(); ②
//Director::getInstance()->replaceScene(sc); ③
Director::getInstance()->pushScene(sc); ④
}
void HelloWorld::menuItemHelpCallback(Ref*pSender)
{
MenuItem* item = (MenuItem*)pSender;
log("TouchHelp %p", item);
}
void HelloWorld::menuItemStartCallback(Ref*pSender)
{
MenuItem* item = (MenuItem*)pSender;
log("TouchStart %p", item);
}
上述代碼中的第①行定義的函數menuItemSettingCallback是在用戶點擊“遊戲設置”菜單時候回調。第②行代碼是創建設置創建對象。第③行是使用replaceScene函數進行場景切換。第④行代碼是pushScene函數進行場景切換。
HelloWorldScene.cpp中的重要代碼如下
bool Setting::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin();
Sprite *bg = Sprite::create("setting-back.png");
bg->setPosition(Point(origin.x + visibleSize.width/2,
origin.y +visibleSize.height /2));
this->addChild(bg);
//音效
auto soundOnMenuItem = MenuItemImage::create(
"on.png",
"on.png");
auto soundOffMenuItem = MenuItemImage::create(
"off.png",
"off.png");
auto soundToggleMenuItem = MenuItemToggle::createWithCallback(
CC_CALLBACK_1(Setting::menuSoundToggleCallback,this),
soundOnMenuItem,
soundOffMenuItem,
NULL);
soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818,220)));
//音樂
auto musicOnMenuItem =MenuItemImage::create(
"on.png",
"on.png");
automusicOffMenuItem =MenuItemImage::create(
"off.png",
"off.png");
auto musicToggleMenuItem = MenuItemToggle::createWithCallback(
CC_CALLBACK_1(Setting::menuMusicToggleCallback,this),
musicOnMenuItem,
musicOffMenuItem,
NULL);
musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818,362)));
//Ok按鈕
autookMenuItem = MenuItemImage::create(
"ok-down.png",
"ok-up.png",
CC_CALLBACK_1(Setting::menuOkCallback, this));
okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(600,510)));
Menu* mn = Menu::create(soundToggleMenuItem,
musicToggleMenuItem,okMenuItem,NULL);
mn->setPosition(Point::ZERO);
this->addChild(mn);
return true;
}
void Setting::menuOkCallback(Ref*pSender) ①
{
Director::getInstance()->popScene(); ②
}
void Setting::menuSoundToggleCallback(Ref*pSender)
{}
void Setting::menuMusicToggleCallback(Ref*pSender)
{}
上述代碼中的第①行定義的函數menuOkCallback是在用戶在設置場景點擊“OK”菜單時候回調。第②行代碼是使用popScene函數返回HelloWorld場景。
《Cocos2d-x實戰 C++卷》現已上線各大商店均已開售
京東https://item.jd.com/11584534.html
當當https://product.dangdang.com/23606265.html
互動出版網https://product.china-pub.com/3770734
《Cocos2d-x實戰 C++卷》源碼及樣章下載地址
源碼下載地址https://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1
樣章下載地址https://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

最後更新:2017-04-03 08:26:18