在实际游戏运用中,一个场景是远远不够的,我们必须要掌握多个场景之间的切换。
场景切换时通过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,返回上一个场景。