• 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,返回上一个场景。

  • 相关阅读:
    MFC自绘框架窗口客户区
    命令行下创建mysql数据库
    linux重置mysql root密码的6种方
    xampp修改mysql默认密码详解
    Java常用包装类
    Java异常处理
    Java数组
    Java流程控制
    Java基本数据类型
    golang https server分析
  • 原文地址:https://www.cnblogs.com/steven66/p/5655774.html
Copyright © 2020-2023  润新知