使用replaceScene实现场景切换

在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.height/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());
}
点击后实现的效果:
使用replaceScene实现场景切换_第1张图片

使用replaceScene实现场景切换_第2张图片

使用replaceScene实现场景切换_第3张图片

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

修改响应函数即可:

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

HelloWorld.cpp

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






你可能感兴趣的:(Cocos编程)