cocos2d-x实战 C++卷 学习笔记--第6章 场景与层

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocos2d-x实战 C++卷 学习笔记--第6章 场景与层相关的知识,希望对你有一定的参考价值。

前言:

一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0。

技术分享

场景切换

 场景切换相关函数

1)void  runWithScene(Scene*  scene)

该函数可以运行场景。只能在启动第一个场景时调用该函数。如果已经有一个场景运行,则不能调用该函数。

2)void  replaceScene(Scene*  scene)

切换到下一个场景。用一个新的场景替换当前场景,当前场景被终端释放

3)void  pushScene(Scene*  scene)

切换到下一个场景。将当前场景挂起放入到场景堆栈中,然后再切换到下一个场景中。

4)void  popScene(Scene*  scene)

与 pushScene 配合使用,可以回到上一个场景。

5)void  popToRootScene(Scene*  scene)

与 pushScene 配合使用,可以回到根场景。

代码示例:

技术分享
 1 #ifndef __HELLOWORLD_SCENE_H__
 2 #define __HELLOWORLD_SCENE_H__
 3 
 4 #include "cocos2d.h"
 5 #include "Setting.h"
 6 
 7 class HelloWorld : public cocos2d::Layer
 8 {
 9 public:
10     // there‘s no ‘id‘ in cpp, so we recommend returning the class instance pointer
11     static cocos2d::Scene* createScene();
12 
13     // Here‘s a difference. Method ‘init‘ in cocos2d-x returns bool, instead of returning ‘id‘ in cocos2d-iphone
14     virtual bool init();  
15     
16     // a selector callback
17     void menuCloseCallback(cocos2d::Ref* pSender);
18 
19     //// 
20     void menuItemStartCallback(Ref* pSender);
21     void menuItemSettingCallback(Ref* pSender);
22     void menuItemHelpCallback(Ref* pSender);
23 
24     // implement the "static create()" method manually
25     CREATE_FUNC(HelloWorld);
26 };
27 
28 #endif // __HELLOWORLD_SCENE_H__
View Code
技术分享
  1 #include "HelloWorldScene.h"
  2 
  3 USING_NS_CC;
  4 
  5 Scene* HelloWorld::createScene()
  6 {
  7     // ‘scene‘ is an autorelease object
  8     auto scene = Scene::create();
  9     
 10     // ‘layer‘ is an autorelease object
 11     auto layer = HelloWorld::create();
 12 
 13     // add layer as a child to scene
 14     scene->addChild(layer);
 15 
 16     // return the scene
 17     return scene;
 18 }
 19 
 20 // on "init" you need to initialize your instance
 21 bool HelloWorld::init()
 22 {
 23     //////////////////////////////
 24     // 1. super init first
 25     if ( !Layer::init() )
 26     {
 27         return false;
 28     }
 29     
 30     Size visibleSize = Director::getInstance()->getVisibleSize();
 31     Point origin = Director::getInstance()->getVisibleOrigin();
 32 
 33     /////////////////////////////
 34     // 2. add a menu item with "X" image, which is clicked to quit the program
 35     //    you may modify it.
 36 
 37     // add a "close" icon to exit the progress. it‘s an autorelease object
 38     auto closeItem = MenuItemImage::create(
 39                                            "CloseNormal.png",
 40                                            "CloseSelected.png",
 41                                            CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
 42     
 43     closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
 44                                 origin.y + closeItem->getContentSize().height/2));
 45 
 46     // create menu, it‘s an autorelease object
 47     auto menu = Menu::create(closeItem, NULL);
 48     menu->setPosition(Point::ZERO);
 49     this->addChild(menu, 1);
 50 
 51     /////////////////////////////
 52     // 3. add your codes below...
 53 
 54     // add a label shows "Hello World"
 55     // create and initialize a label
 56     
 57     auto label = LabelTTF::create("Hello World", "Arial", 24);
 58     
 59     // position the label on the center of the screen
 60     label->setPosition(Point(origin.x + visibleSize.width/2,
 61                             origin.y + visibleSize.height - label->getContentSize().height));
 62 
 63     // add the label as a child to this layer
 64     this->addChild(label, 1);
 65 
 66     // add "HelloWorld" splash screen"
 67     auto sprite = Sprite::create("HelloWorld.png");
 68 
 69     // position the sprite on the center of the screen
 70     sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
 71 
 72     // add the sprite as a child to this layer
 73     this->addChild(sprite, 0);
 74 
 75     ////// "开始" 精灵菜单
 76     Sprite* startSpriteNormal = Sprite::create("Demo1/start-up.png");
 77     Sprite* startSpriteSelected = Sprite::create("Demo1/start-down.png");
 78     MenuItemSprite* startMenuItem = MenuItemSprite::create(startSpriteNormal,
 79         startSpriteSelected,
 80         CC_CALLBACK_1(HelloWorld::menuItemStartCallback, this));
 81     startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700, 170)));
 82 
 83     /// "设置" 图片菜单
 84     MenuItemImage* settingMenuItem = MenuItemImage::create(
 85         "Demo1/setting-up.png",
 86         "Demo1/setting-down.png",
 87         CC_CALLBACK_1(HelloWorld::menuItemSettingCallback, this));
 88     settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480, 400)));
 89 
 90     /// "帮助" 图片菜单
 91     MenuItemImage* helpMenuItem = MenuItemImage::create(
 92         "Demo1/help-up.png",
 93         "Demo1/help-down.png",
 94         CC_CALLBACK_1(HelloWorld::menuItemHelpCallback, this));
 95     helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860, 480)));
 96 
 97     Menu* mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);
 98     mu->setPosition(Point::ZERO);
 99     this->addChild(mu);
100 
101 
102 
103     
104     return true;
105 }
106 
107 
108 void HelloWorld::menuCloseCallback(Ref* pSender)
109 {
110 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
111     MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
112     return;
113 #endif
114 
115     Director::getInstance()->end();
116 
117 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ios)
118     exit(0);
119 #endif
120 }
121 
122 
123 void HelloWorld::menuItemStartCallback(Ref* pSender)
124 {
125     MenuItem* item = (MenuItem*)pSender;
126     log("Touch Start %p", item);
127 
128     auto sc = Setting::createScene();
129 //    Director::getInstance()->replaceScene(sc);
130     Director::getInstance()->pushScene(sc);
131 }
132 
133 void HelloWorld::menuItemSettingCallback(Ref* pSender)
134 {
135     MenuItem* item = (MenuItem*)pSender;
136     log("Touch Setting %p", item);
137 
138 }
139 
140 void HelloWorld::menuItemHelpCallback(Ref* pSender)
141 {
142     MenuItem* item = (MenuItem*)pSender;
143     log("Touch Help %p", item);
144 
145 }
View Code
技术分享
 1 #ifndef __SETTING_SCENE_H__
 2 #define __SETTING_SCENE_H__
 3 
 4 #include "cocos2d.h"
 5 
 6 class Setting : public cocos2d::Layer
 7 {
 8 public:
 9     static cocos2d::Scene* createScene();
10     virtual bool init();
11 
12     void menuSoundToggleCallback(cocos2d::Ref* pSender);
13     void menuMusicToggleCallback(cocos2d::Ref* pSender);
14     void menuOkCallback(cocos2d::Ref* pSender);
15 
16     CREATE_FUNC(Setting);
17 };
18 
19 #endif   // __SETTING_SCENE_H__
View Code
技术分享
 1 #include "Setting.h"
 2 
 3 // using namespace cocos2d;
 4 USING_NS_CC;
 5 
 6 Scene* Setting::createScene()
 7 {
 8     // ‘scene‘ is an autorelease object
 9     auto scene = Scene::create();
10     // ‘layer‘ is an autorelease object
11     auto layer = Setting::create();
12 
13     scene->addChild(layer);
14     return scene;
15 }
16 
17 bool Setting::init()
18 {
19     if (!Layer::init())
20     {
21         return false;
22     }
23     Size visibleSize = Director::getInstance()->getVisibleSize();
24     Point origin = Director::getInstance()->getVisibleOrigin();
25 
26     Sprite*bg = Sprite::create("Demo1/setting-back.png");
27     bg->setPosition(Point(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2));
28     this->addChild(bg);
29 
30     // 音效
31     auto soundOnMenuItem = MenuItemImage::create(
32         "Demo1/on.png",
33         "Demo1/on.png");
34     auto soundOffmenuItem = MenuItemImage::create(
35         "Demo1/off.png",
36         "Demo1/off.png");
37     auto soundToggleMenuItem = MenuItemToggle::createWithCallback(
38         CC_CALLBACK_1(Setting::menuSoundToggleCallback, this),
39         soundOnMenuItem,
40         soundOffmenuItem,
41         NULL);
42     soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818, 220)));
43 
44     // 音乐
45     auto musicOnMenuItem = MenuItemImage::create(
46         "Demo1/on.png",
47         "Demo1/on.png");
48     auto musicOffMenuItem = MenuItemImage::create(
49         "Demo1/off.png",
50         "Demo1/off.png");
51     auto musicToggleItem = MenuItemToggle::createWithCallback(
52         CC_CALLBACK_1(Setting::menuMusicToggleCallback, this),
53         musicOnMenuItem,
54         musicOffMenuItem,
55         NULL);
56     musicToggleItem->setPosition(Director::getInstance()->convertToGL(Point(818, 362)));
57 
58     // OK 按钮
59     auto okMenuItem = MenuItemImage::create(
60         "Demo1/ok-down.png",
61         "Demo1/ok-up.png",
62         CC_CALLBACK_1(Setting::menuOkCallback, this));
63     okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(600, 510)));
64 
65     Menu* mn = Menu::create(soundToggleMenuItem,
66         musicToggleItem,
67         okMenuItem,
68         NULL);
69     mn->setPosition(Point::ZERO);
70     this->addChild(mn);
71 
72     return true;
73 }
74 
75 
76 void Setting::menuSoundToggleCallback(cocos2d::Ref* pSender)
77 {
78     MenuItem* item = (MenuItem*)pSender;
79     log("Touch Setting::Music %p", item);
80 }
81 
82 
83 void Setting::menuMusicToggleCallback(cocos2d::Ref* pSender)
84 {
85     MenuItem* item = (MenuItem*)pSender;
86     log("Touch Setting::Music %p", item);
87 }
88 
89 
90 void Setting::menuOkCallback(cocos2d::Ref* pSender)
91 {
92     MenuItem* item = (MenuItem*)pSender;
93     log("Touch Setting::Ok %p", item);
94     Director::getInstance()->popScene();
95 }
View Code

关键代码解释:

1)使用 replaceScene

auto  sc = Setting::createScene();

Director->getInstance()->replaceScene(sc);

用 Setting 场景,替换当前的场景。当前场景被是否。

2)使用 pushScene

auto  sc = Setting::createScene();

Director->getInstance()->pushScene(sc);

将当前场景挂起放入到场景堆栈中,然后切换到 Setting 场景

3)使用 popScene

Director->getInstance()->popScene();

将当前场景释放,从 场景堆栈的栈顶 调入 一个 场景到程序中。(如果场景堆栈中没有场景,那么程序退出)

 

以上是关于cocos2d-x实战 C++卷 学习笔记--第6章 场景与层的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d-x实战 C++卷 学习笔记--第4章 使用菜单

cocos2d-x实战 C++卷 学习笔记--第5章 精灵

cocos2d-x实战 C++卷 学习笔记--第7章 动作特效

《Cocos2d-x实战:C++》学习笔记——基础概念

《Cocos2d-x实战:C++》学习笔记——基础概念

《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音