您的位置:首页 > 移动开发 > Cocos引擎

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

2016-08-25 14:01 423 查看
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新建一项目,实现空项目当中点击右下角的按钮,切换到另一个场景。



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());
<span style="white-space:pre">	</span>//为了简单,直接把多余代码删除了
}

自定义类

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



图1



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

void SceneSecond::menuCloseCallback(CCObject* pSender)
{
<span style="white-space:pre">	</span>CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
<span style="white-space:pre">	</span>//切换为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());

}


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



图1



图2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: