第七章场景与层

来源:互联网 发布:尼康相机优化校准 编辑:程序博客网 时间:2024/05/05 10:36

Cococs2d-x学习笔记


场景与层的关系

一个场景(Scene)有n个层(Layer)对应,并且层的个数至少为1。

场景切换

场景切换相关函数

  • void runWithScene(Scene * scene):该函数可以运行场景,只能在启动第一个创景时调用该函数,如果已经有一个场景运行情况下则不能调用该函数。
  • void replaceScene(Scene * scene):切换到下一个场景,用一个新的场景替换当前场景,当前场景被终端释放。
  • void pushScene(Scene * scene):切换到下一个场景,将当前场景挂起放入场景堆栈中,然后再切换到下一个场景中。
  • void popScene():与pushScene配合使用,可以回到上一个场景。
  • void popToRootScene():与pushScene配合使用,可以回到根场景。

注意:replaceScene会释放和销毁场景,pushScene并不会释放和销毁场景,原来场景的状态可以保持。
使用replaceScene代码如下:

auto sc = Setting::createScene();Director::getInstance()->replaceScene(sc);

使用pushScene代码如下:

auto sc = Setting::createScene();DIrector::getInstance()->pushScene(sc);

实例

首先需要在VS2015中添加一个Setting场景(即创建一个头文件和CPP文件),根据我的尝试,应该是放在classes文件夹下。

HelloWorld.h文件

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#include "SettingScene.h"class HelloWorld : public cocos2d::Layer{public:    static cocos2d::Scene* createScene();    virtual bool init();    // a selector callback    void menuItemStartCallback(Ref * pSender);    void menuItemSettingCallback(Ref * pSender);    void menuItemHelpCallback(Ref * pSender);    // implement the "static create()" method manually    CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__

HelloWorld.cpp文件

#include "HelloWorldScene.h"USING_NS_CC;Scene* HelloWorld::createScene(){    // 'scene' is an autorelease object    auto scene = Scene::create();    // 'layer' is an autorelease object    auto layer = HelloWorld::create();    // add layer as a child to scene    scene->addChild(layer);    // return the scene    return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){    //////////////////////////////    // 1. super init first    if ( !Layer::init() )    {        return false;    }    Size visibleSize = Director::getInstance()->getVisibleSize();    Vec2 origin = Director::getInstance()->getVisibleOrigin();    /////////////////////////////    //背景    Sprite * bg = Sprite::create("background.png");    bg->setPosition(Vec2(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(Vec2(700, 170)));    //设置图片菜单    MenuItemImage * settingMenuItem = MenuItemImage::create("setting-up.png", "setting-down.png", CC_CALLBACK_1(HelloWorld::menuItemSettingCallback, this));    settingMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(480, 400)));    //帮助图片菜单    MenuItemImage * helpMenuItem = MenuItemImage::create("help-up.png", "help-down.png", CC_CALLBACK_1(HelloWorld::menuItemHelpCallback, this));    helpMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(860, 480)));    Menu * mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);    mu->setPosition(Vec2::ZERO);    this->addChild(mu);    return true;}void HelloWorld::menuItemStartCallback(Ref * pSender){}void HelloWorld::menuItemSettingCallback(Ref * pSender){    auto sc = Setting::createScene();//创建Setting对象    Director::getInstance()->pushScene(sc);//切换场景}void HelloWorld::menuItemHelpCallback(Ref * pSender){}

SettingScene.h文件(几乎是仿照HelloWorld.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();    // a selector callback    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_SCENE_H__

SettingScene.cpp文件

#include "SettingScene.h"USING_NS_CC;Scene* Setting::createScene(){    // 'scene' is an autorelease object    auto scene = Scene::create();    // 'layer' is an autorelease object    auto layer = Setting::create();    // add layer as a child to scene    scene->addChild(layer);    // return the scene    return scene;}bool Setting::init(){    //////////////////////////////    // 1. super init first    if (!Layer::init())    {        return false;    }    Size visibleSize = Director::getInstance()->getVisibleSize();    Vec2 origin = Director::getInstance()->getVisibleOrigin();    /////////////////////////////    //背景    Sprite * bg = Sprite::create("setting-back.png");    bg->setPosition(Vec2(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(Vec2(818, 220)));    //音乐    auto musicOnMenuItem = MenuItemImage::create("on.png", "on.png");    auto musicOffMenuItem = MenuItemImage::create("off.png", "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("ok-down.png", "ok-up.png", CC_CALLBACK_1(Setting::menuOkCallback, this));    okMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(600, 510)));    Menu * mu = Menu::create(soundToggleMenuItem, musicToggleMenuItem, okMenuItem, NULL);    mu->setPosition(Vec2::ZERO);    this->addChild(mu);    return true;}void Setting::menuMusicToggleCallback(Ref * pSender){}void Setting::menuSoundToggleCallback(Ref * pSender){}void Setting::menuOkCallback(Ref * pSender){    Director::getInstance()->popScene();//返回上一个场景}

场景过渡动画

场景切换时可以添加过渡动画,场景过渡动画是由TransitionScene类和它的子类展示的。

如上图所示,TransitionScene类的直接子类有13个,子类的子类就更多了。过渡动画类的使用方式都是类似的,如下:

auto sc = Setting::createScene();auto reScene = TransitionJumpZoom::create(1.0f, sc);//创建TransitionScene对象,它有两个参数,第一个是持续时间,第二个是场景对象。Directior::getInstance()->pushScene(reScene);//pushScene函数使用的参数是过渡动画TransitionScnen对象,而不是场景对象。

过渡动画:

  • TransitionFadeTR:网格过渡动画,从坐下到右上。
  • TransitionJumpZoom:跳动的过渡动画。
  • TransitionCrossFade:交叉渐变过度动画。
  • TransitionMoveInL:从左边推入覆盖的过渡动画。
  • TransitionShrinkGrow:放缩交替的过渡动画。
  • TransitionRotoZoom:类似照相机镜头旋转放缩的交替过度动画。
  • TransitionSlideInL:从左边推入的过度动画。
  • TransitionSplitCols:按列分割界面的过渡动画。
  • TransitionSplitRows:按行分割界面的过渡动画。
  • TransitionTurnOffTiles:生成随机瓦片方格的过渡动画。

场景的生命周期

一般情况下,一个场景只需要一个层。层需要子类化,编写自己层类,如前面的HelloWorld和Setting都是层Layer类的子类,而场景不需要子类化。由于这些原因,场景的生命周期就通过层的生命周期反映出来,通过重写层的生命周期函数,可以处理场景不同生命周期阶段的事件。

生命周期函数

层(Layer)的生命周期函数如下:

  • bool init():初始化层调用。
  • void onEnter():进入层时调用。
  • void onEnterTransitionDidFinish():进入层而且过渡动画结束时调用。
  • void onExit():退出层时调用。
  • void onExitTransitionDidStart():退出层而且过渡动画结束时调用。
  • void cleanup():层对象被清除时调用。

如果HelloWorld是第一个场景,当启动HelloWorld场景的时候,它的调用顺序是:

多场景切换生命周期

多个场景切换时分为几种情况:

  • 情况1:使用pushScene函数实现从HelloWorld场景进入Setting场景。

  • 情况2:使用replaceScene函数实现从HelloWorld场景进入Setting场景。

  • 情况3:在1的情况下,使用popScene函数实现从Setting场景回到HelloWorld场景。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绑定微信的手机号不用了怎么办 绑定支付宝的手机号不用了怎么办 百度账号手机号换了密码忘了怎么办 换手机好了华为账号密码忘了怎么办 苹果手机忘了id账号和密码怎么办 金立手机账号密码忘了怎么办 乐视手机账号密码忘了怎么办 企业邮箱发出去邮件撤不回来怎么办 餐厅加热保温设备零线带电怎么办 小米手机不小心把照片删了怎么办 华为手机不小心把照片删了怎么办 网易邮箱被改成别人的姓名怎么办 苹果手机忘记id密码和邮箱怎么办 163邮箱下载的附件没有了怎么办 小米自带浏览器打开网页太慢怎么办 再歪一点授权码忘记了怎么办 注册支付宝的手机号不用了怎么办 手机号被别人注册了支付宝怎么办 支付宝账号密码都忘了怎么办 申请微信公众号邮箱被占用怎么办 邮箱注册微博需要手机验证怎么办 苹果手机的ad码忘记了怎么办 苹果手机酷狗音乐没有声音怎么办 在手机屏上不能缷载软件怎么办? 手机酷狗音乐下载歌曲要钱怎么办 酷狗下载歌曲后歌词不见了怎么办 手机酷我音乐缓冲文件损坏怎么办 苹果手机音乐里的歌删掉了怎么办 上课学生把粉笔擦藏起来了怎么办 手机没法解压10g压缩包怎么办 苹果id被锁邮箱也忘记密码怎么办 手机号注册的微信忘记密码怎么办 qq号注册微信忘记密码怎么办 云课堂密码忘记手机号更改了怎么办 孩子做事才要奖励怎么办的教案 员工做事效率低家庭情况不好怎么办 安全云课堂人脸识别失败怎么办 酷我k歌里音乐太少怎么办 酷狗里面的歌没有了怎么办 第一试用网登录密码忘记了怎么办 第一试用网登录密码忘了怎么办