cocos2d-x(2):场景管理函数切换管理基础学习

1、场景管理切换相关函数介绍

note: 场景切换是通过导演类Director实现管理的。

runWithScene(Scene* scene)。该函数可以运行场景。只能在启动第一个场景时候调用该函数。如果已经有一个场景运行情况下则不能调用该函数。

replaceScene(Scene* scene)。切换到下一个场景。用一个新的场景替换当前场景,当前场景被终端释放。

pushScene(Scene* scene)。切换到下一个场景。将当前场景挂起放入到场景堆栈中,然后再切换到下一个场景中。

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

void popToRootScene()。与pushScene配合使用,可以回到根场景。

void pause()。   暂停当前的场景

void resume() 。   恢复被暂停的当前场景

void end()。      终止执行,释放当前的场景


note:  replaceScene和pushScene使用的区别。

replaceScene会释放和销毁场景,如果需要保持原来场景的状态,replaceScene函数不适合。replaceScene使用于游戏中一些简单提示,而且不会包含其他CCNode。

pushScene并不会释放和销毁场景,原来场景的状态可以保持,但是场景不能放太多的场景对象,资源消耗大。


平台:   Win32

2、runWithSceneand replaceScene 函数学习
note:替换,就是用某个场景替换当前场景,原先场景就被释放掉了。

2.1新建一项目,实现空项目当中点击右下角的按钮,切换到另一个场景。

cocos2d-x(2):场景管理函数切换管理基础学习_第1张图片

2.2、具体实现,自定义一个类,名为SceneSecond,继承CCScene/ CCLayer ,在HelloWorld::menuCloseCallback(CCObject* pSender) 函数中调用CCDirector::sharedDirector()->replaceScene(SceneSecond::scene());  导演将目前场景替换为sceneSecond::scene()返回的场景  这样就实现了场景的切换。新建的场景类SceneSecond显示一个关闭按钮精灵, 也就是只显示右下角关闭按钮图片。

2.3、代码实现

空项目只需要在HelloWorldScene中函数HelloWorld::menuCloseCallback,使用Director导演调用replaceScene,切换到另外一个场景

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
      CCDirector::sharedDirector()->replaceScene(SceneSecond::scene());
	//为了简单,直接把多余代码删除了
}

自定义类

SceneSecond.h

#pragma once
/*
注释部分可以忽略,只是学习#pragma once
1、编译器预编译命令
2、命令内容显而易见:仅编译一次
3、用途:常出现在头文件中。因为同一头文件会在许多源文件中多次引用。如果没有指定编译一次,则编译时出现重定义错误。
4、相同作用命令
#ifndef ABC_H
#define ABC_H
//头文件代码内容

*******
#endif
*/
class SceneSecond : public CCLayer
{
public:
	SceneSecond();
	~SceneSecond();
	virtual bool init();
	static cocos2d::CCScene* scene();
	CREATE_FUNC(SceneSecond);
};

SceneSecond.cpp

CCScene *SceneSecond ::scene()
{
	CCScene *s = CCScene::create();
	SceneSecond *layer = SceneSecond::create();
	s->addChild(layer);
	return s;
}
bool SceneSecond::init()
{
	//调用父类init初始化
	CCLayer::init();
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();//获取窗口大小
	CCSprite* pSprite = CCSprite::create("CloseNormal.png");
	pSprite->setPosition(ccp(winSize.width/2,winSize.height/2));
	// position the sprite on the center of the screen
	// add the sprite as a child to this layer
	this->addChild(pSprite, 0);
	return true;
}

运行结果:点击右下角按钮即可切换到图2

cocos2d-x(2):场景管理函数切换管理基础学习_第2张图片

图1

cocos2d-x(2):场景管理函数切换管理基础学习_第3张图片
图2

note:

如果想在图2中按点击按钮切换为图1,先不讨论如何自定义实现点击图2按钮实现切换为图1。  想想触发HelloWorldScen场景按钮1是怎么实现的,我们可以直接拷贝当中的代码到我们自定类中,即将HelloWorldScene:init中代码copy到我们自定义SceneSecond::init(),基本上只需要修改类名即可,还有对应的精灵。然后再增加按钮触发函数void menuCloseCallback(CCObject* pSender);

menuCloseCallback.cpp

void SceneSecond::menuCloseCallback(CCObject* pSender)
{
	CCDirector::sharedDirector()->replaceScene(HelloWorld::scene()); 
	//切换为HelloWorld::scene返回的场景,即图1
}

3、pushScene and popScene 函数学习

note: 栈式,将现在的场景保存,向入栈一样,压入栈中,显示新场景,如果新场景释放,将原场景显示。原场景不释放,耗内存大。

3.1、继续上面代码介绍,通过pushScene 和 popScene 实现上面所述,点击图1右下角的按钮切换到图2, 点击图2按钮切换为图1.(为了方便,图2有改动,基本都是copy),即HelloWorldScene:init中代码copy到我们自定义SceneSecond::init();

SceneSecond.cpp  

bool SceneSecond::init()  //稍有改动
{
	//调用父类init初始化
	CCLayer::init();
	/*
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	CCSprite* pSprite = CCSprite::create("CloseNormal.png");
	pSprite->setPosition(ccp(winSize.width/2,winSize.height/2));
	// position the sprite on the center of the screen
	//pSprite->setPosition(ccp(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));
	// add the sprite as a child to this layer
	this->addChild(pSprite, 0);
	*/
	CCLabelTTF * label = CCLabelTTF::create("SceneSecond","Arial",36);
	label->setPosition(CCPoint(100, 200));


	CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
	CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

	/////////////////////////////
	// 2. add a menu item with "X" image, which is clicked to quit the program
	//    you may modify it.

	// add a "close" icon to exit the progress. it's an autorelease object
	CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
		"CloseSelected.png",
		"CloseSelected.png",
		this,
		menu_selector(SceneSecond::menuCloseCallback));

	pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width / 2,
		origin.y + pCloseItem->getContentSize().height / 2));

	// create menu, it's an autorelease object
	CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu, 1);


	addChild(label);
	return true;
}

void SceneSecond::menuCloseCallback(CCObject* pSender)
{
	CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
	//CCDirector::sharedDirector()->popScene();
}
HelloWorldScene,cpp
void HelloWorld::menuCloseCallback(CCObject* pSender)
{

	//SceneSecond::scene() 返回一个自定义的场景
	// CCDirector::sharedDirector 导演
	//导演将目前场景替换为sceneSecond 返回的场景
	//CCDirector::sharedDirector()->replaceScene(SceneSecond::scene());
	//只是简单的将SceneSecond 的场景push和pop而已 
	CCDirector::sharedDirector()->pushScene(SceneSecond::scene());

}

运行:  通过按钮即可实现切换

cocos2d-x(2):场景管理函数切换管理基础学习_第4张图片
图1

cocos2d-x(2):场景管理函数切换管理基础学习_第5张图片

图2


你可能感兴趣的:(cocos2d-x)