【cocos2d - x】 如何切换场景
在创建cocos2dx的游戏时,初始化默认为HelloWorld.H和cpp,这里我们要做自己的场景切换的话,首先
移除原本的HelloWold头文件和cpp文件,之后添加自己的场景在classes文件内如(图片中myfirstscene和mysecondscene头文件和cpp文件),注意:不在classes文件内添加的话,会在项目中无法连接两场景!
#pragma once
#include "cocos2d.h"
using namespace cocos2d; //使用cocos2d的名称空间
class myfirstscene : public Layer //创建我的第一个场景继承自层
{
public:
static Scene* createscene();//创建场景的架构
virtual bool init(); //myfirstscene的实现
CREATE_FUNC(myfirstscene); //生成myfirstscene的create
void comeback(Ref * Psendeer); //回调函数
};
实现代码:
#include "myfirstscene.h"
#include "mysecondscene.h"
//因为要切换场景所以要建立连接,调用切换场景的头文件
Scene* myfirstscene::createscene() //架构我的场景
{
auto scene = Scene::create(); //先申请场景
auto myscene = myfirstscene::create(); //构造我的层
scene->addChild(myscene); //将我的层在场景中显示
return scene; //返回场景 -方便切换场景
}
bool myfirstscene::init() //实现myfistscene的层
{
if (!Layer::init())
//先判断是否实现了父类的init()函数,如果未成功实现Layer::init()会返回false,取反
{
return false;
}
Size VisibleSize = Director::getInstance()->getVisibleSize();
//获得屏幕大小
auto label = Label::createWithSystemFont("this is my firstscene!,great!", "fonts/arial.ttf", 30);
//创建文字按钮
auto menuitem = MenuItemLabel::create(label,CC_CALLBACK_1(myfirstscene::comeback, this));
//将创建好的按钮装入菜单条目 ,并回调函数
auto menu = Menu::create(menuitem, NULL);
//将条目装入系统的菜单里
this->addChild(menu);
//将菜单在我的场景中显示
return true;
}
void myfirstscene::comeback(Ref * Psendeer)//回调函数
{
Director::getInstance()->replaceScene(mysecondscene::createscene());//切换至mysecondscene场景
//导演场景的切换:replaceScene()函数
}
第二个场景的头文件:
#pragma once
#include "cocos2d.h"
using namespace cocos2d;
class mysecondscene :public Layer
{
public:
static Scene* createscene();//架构场景
virtual bool init(); //具体实现
CREATE_FUNC(mysecondscene); //生成项目
void comeback(Ref * temp); //回调函数
void comeback2(Ref * temp); //回调函数2
};
第二个场景有两个回调函数,因为我放入了两个菜单,一个为返回第一个场景,第二个为结束。
#include "mysecondscene.h"
#include "myfirstscene.h"
//同样调用第一个场景的头文件进行场景切换
Scene* mysecondscene::createscene() //架构场景
{
auto scene = Scene::create();
auto layer = mysecondscene::create();
scene->addChild(layer);
return scene;
}
bool mysecondscene::init() //层的实现
{
if (!Layer::init())
{
return false;
}
Size VisibleSize = Director::getInstance()->getVisibleSize(); //获得屏幕大小
auto label = Label::createWithSystemFont("this is my mysecondscene!,great!!!", "fonts/arial.ttf", 30);
//创建文字按钮
auto menuitem = MenuItemLabel::create(label, CC_CALLBACK_1(mysecondscene::comeback, this));
//将创建好的按钮装入菜单条目 ,并创建回调函数
auto menu = Menu::create(menuitem, NULL);
//将条目装入系统的菜单里
this->addChild(menu);
//创建图片回调
auto label2 = MenuItemImage::create(
"CloseNormal.png",
"CloseNormal.png",
this,
menu_selector(mysecondscene::comeback2)
);
//auto menuitem2 = MenuItemLabel::create(label2, CC_CALLBACK_1(mysecondscene::comeback2, this));
//label2->setPositionX(1800);
auto menu2 = Menu::create(label2, NULL);
this->addChild(menu2); //装入层
return true;
}
void mysecondscene::comeback(Ref* temp) //切换场景回调函数1
{
Director::getInstance()->replaceScene(myfirstscene::createscene());
}
void mysecondscene::comeback2(Ref* temp) //结束的回调函数
{
Director::getInstance()->end();
}
这里讲解一下导演类:Director,导演类是用单例设计模式设计的,所以整个游戏只会有一个导演,而例如标签这种,每次调用create()都会创建一个新的标签对象。
最后要把AppDelegate.cpp中的场景接口由原来的Helloworld改为我们自己创建的场景
两个场景的切换就完成了。