现场由导演级交换机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场景。
我们首先须要在project中加入一个Setting场景(SettingScene.cpp和SettingScene.h),例如以下图所看到的,右键点击HelloWorldproject中Classes目录,在弹出菜单中选择“加入”→“新建项”:
弹出对话框例如以下图所看到的。在名称中输入“SettingScene.cpp”。并选择保存文件位置,然后点击“加入”button创建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)));
-
-
//Okbutton
-
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)
-
{}
在第一代码①行-defined功能menuOkCallback。用户设置场景中点击“OK”当菜单回调。文章②的代码行popScene该函数返回HelloWorld幕后。