在實際游戲運用中,一個場景是遠遠不夠的,我們必須要掌握多個場景之間的切換。
場景切換時通過Director導演類來實現的,在cocos中定義了如下幾種場景切換函數:
1,void runWithScene(Scene *scene)。這是一個運行場景的函數,該函數的使用情況是當前沒有場景正在運行,因為一次只能運行一個場景。
2,void replaceScene(Scene *scene)。 這是第一種用來切換到另一個場景的函數,用一個新的場景來代替當前場景,當前場景則會被終端釋放。
3,void pushScene(Scene *scene)。 這是第二種用來切換到下一個場景的函數,用一個新的場景來代替當前場景,當前場景掛起壓入場景堆棧中。
void popScene(Scene* scene)。 該函數配合pushScene使用,用來返回上一個場景。
void popToRootScene(Scene*scene)。配合pushScene使用,返回根場景。
實例展示:
1,首先在我們默認生成的HelloWorld 場景之外建立我們的新場景Setting
SettingScene.h:
#ifndef __Setting_SCENE_H__
#define __Setting_SCENE_H__
#include "cocos2d.h"
class Setting : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void menuSoundToggleCallback(cocos2d::Ref* pSender);
void menuMusicToggleCallback(cocos2d::Ref* pSender);
void menuOkCallback(cocos2d::Ref* pSender);
// implement the "static create()" method manually
CREATE_FUNC(Setting);
};
#endif
SettingScene.cpp:
#include "SettingScene.h"
USING_NS_CC;
Scene *Setting::createScene()
{
auto scene = Scene::create();
auto layer = Setting::create();
scene->addChild(layer);
return scene;
}
bool Setting::init()
{
if (!Layer::init())
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
Sprite *bg = Sprite::create("menu/setting-back.png");
// position the label on the center of the screen
bg->setPosition(Vec2(origin.x + visibleSize.width / 2,
origin.y + visibleSize.height / 2));
this->addChild(bg);
//音效
auto soundOnMenuItem = MenuItemImage::create(
"menu/on.png",
"menu/on.png");
auto soundOffMenuItem = MenuItemImage::create(
"menu/off.png",
"menu/off.png");
auto soundToggleMenuItem = MenuItemToggle::createWithCallback(CC_CALLBACK_1(Setting::menuSoundToggleCallback, this),
soundOnMenuItem,
soundOffMenuItem,
NULL);
soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(818, 220)));
//音樂
auto musicOnMenuItem = MenuItemImage::create(
"menu/on.png",
"menu/on.png");
auto musicOffMenuItem = MenuItemImage::create(
"menu/off.png",
"menu/off.png");
auto musicToggleMenuItem = MenuItemToggle::createWithCallback(CC_CALLBACK_1(Setting::menuMusicToggleCallback, this),
musicOnMenuItem,
musicOffMenuItem,
NULL);
musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(818, 362)));
//Ok按鈕
auto okMenuItem = MenuItemImage::create(
"menu/ok-down.png",
"menu/ok-up.png",
CC_CALLBACK_1(Setting::menuOkCallback, this));
okMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(600, 510)));
Menu* mn = Menu::create(soundToggleMenuItem, musicToggleMenuItem, okMenuItem, NULL);
mn->setPosition(Vec2::ZERO);
this->addChild(mn);
return true;
}
void Setting::menuOkCallback(Ref* pSender)
{
Director::getInstance()->popScene();
}
void Setting::menuSoundToggleCallback(Ref* pSender)
{
}
void Setting::menuMusicToggleCallback(Ref* pSender)
{
}
在根場景下的切換函數使用於你相應的切換按鈕的回調函數中:
void HelloWorld::menuItemSettingCallback(Ref* pSender)
{
MenuItem* item = (MenuItem*)pSender;
log("Touch Setting %p", item);
auto sc = Setting::createScene();
Director::getInstance()->pushScene(sc);
}
運行效果: 點擊游戲設置,切換到下一個場景,,,點擊ok,返回上一個場景。