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,返回上一個場景。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM