cocos 中熟练运用场景的切换

  在实际游戏运用中,一个场景是远远不够的,我们必须要掌握多个场景之间的切换。

场景切换时通过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,返回上一个场景。

 

posted @ 2016-07-09 13:53  Steven2.0  阅读(5114)  评论(0编辑  收藏  举报