您的位置:首页 > 其它

使用replaceScene实现场景切换

2015-10-29 09:58 309 查看
在CCDirector中,可以使用replaceScene实现场景切换。

说明:

    1.场景的运行,首先在AppDelegate::applicationDidFinishLaunching()中通过CCDirector的runWithScene方法,运行游戏的第一个场景

    2.通过点击HelloWorldScene中的一个精灵,实现切换到场景SceneSecond

    3.通过点击SceneSecond中的一个精灵,实现切换到成精HelloWorldScene

创建第一个场景HelloWorldScene:

HelloWorldScene.h

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::CCLayer
{
public:
// 初始化函数,也是HelloWorld这个类真正初始化的地方
virtual bool init();
// 这个类用来创建一个场景
static cocos2d::CCScene* scene();
// 回调函数
void menuCloseCallback(CCObject* pSender);
// 使用宏来初始化
CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp
#include "HelloWorldScene.h"
#include "SceneSecond.h"

USING_NS_CC;

CCScene* HelloWorld::scene()
{
// 创建一个CCScene的实例对象
CCScene *scene = CCScene::create();
// 创建一个HelloWorld对象的实例
HelloWorld *layer = HelloWorld::create();
// 把HelloWorld加入到CCScene中
scene->addChild(layer);
// 返回CCScene实例
return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
// 首先执行父类的初始化函数
if ( !CCLayer::init() )
{
return false;
}

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

// 实例化一个CCMenuItemImage对象,点击的时候出发menuCloseCallback
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
// 设置显示的位置
pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
origin.y + pCloseItem->getContentSize().height/2));
// 创建一个CCMenu的实例
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
// 设置位置
pMenu->setPosition(CCPointZero);
// 加入到HelloWorld中,并设置Z轴的坐标为1
this->addChild(pMenu, 1);

static int value = 1;
char buf[100];
sprintf(buf, "Hello World %d", value++);
// 创建一个CCLabelTTF的实例对象
CCLabelTTF* pLabel = CCLabelTTF::create(buf, "Arial", 24);
// 设置CCLabelTTF的显示位置
pLabel->setPosition(ccp(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - pLabel->getContentSize().height));
// 加入到HelloWorld中,并设置Z轴的坐标为1
this->addChild(pLabel, 1);
// 创建一个CCSprite对象的实例
CCSprite* pSprite = CCSprite::create("HelloWorld.png");
// 设置CCSprite的显示位置
pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.heigh
4000
t/2 + origin.y));
// 加入到HelloWorld中,并设置Z轴的坐标为0
this->addChild(pSprite, 0);

return true;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
// 切换到SceneSecond
CCDirector::sharedDirector()->replaceScene(SceneSecond::scene());
}
SceneSecond.h
#ifndef __SCENESECOND_H__
#define __SCENESECOND_H__

#include "cocos2d.h"
USING_NS_CC;

class SceneSecond : public CCLayer
{
public:
static CCScene* scene();
CREATE_FUNC(SceneSecond);
bool init();
void menuCloseCallback(CCObject* pSender);
};

#endif // __SCENESECOND_H__


SceneSecond.cpp

#include "SceneSecond.h"
#include "HelloWorldScene.h"

CCScene* SceneSecond::scene()
{
CCScene* s = CCScene::create();

SceneSecond* layer = SceneSecond::create();
s->addChild(layer);

return s;
}

bool SceneSecond::init()
{
// 调用父类的初始化
if (!CCLayer::init())
{
return false;
}

CCLabelTTF* label = CCLabelTTF::create("Second Scene", "Arial", 36);
label->setPosition(CCPoint(100, 200));
this->addChild(label);

CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.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);

return true;
}

void SceneSecond::menuCloseCallback(CCObject* pSender)
{
// 切换到SceneSecond
CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
}
点击后实现的效果:







当然,也可以使用pushScene和poScene来实现,但是这种方式会消耗很多内存:

修改响应函数即可:

void SceneSecond::menuCloseCallback(CCObject* pSender)
{
// 切换到SceneSecond
CCDirector::sharedDirector()->popScene();
}

HelloWorld.cpp
</pre><p></p><p></p><pre name="code" class="cpp">void HelloWorld::menuCloseCallback(CCObject* pSender)
{
// 切换到SceneSecond
CCDirector::sharedDirector()->replaceScene(SceneSecond::scene());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: