【cocos2d - x】 如何切换场景

在创建cocos2dx的游戏时,初始化默认为HelloWorld.H和cpp,这里我们要做自己的场景切换的话,首先

移除原本的HelloWold头文件和cpp文件,之后添加自己的场景在classes文件内如(图片中myfirstscene和mysecondscene头文件和cpp文件),注意:不在classes文件内添加的话,会在项目中无法连接两场景!

 

【cocos2d - x】 如何切换场景【cocos2d - x】 如何切换场景【cocos2d - x】 如何切换场景【cocos2d - x】 如何切换场景

#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改为我们自己创建的场景

【cocos2d - x】 如何切换场景

【cocos2d - x】 如何切换场景

两个场景的切换就完成了。