使用replaceScene实现场景切换
2015-10-29 09:58
309 查看
在CCDirector中,可以使用replaceScene实现场景切换。
说明:
1.场景的运行,首先在AppDelegate::applicationDidFinishLaunching()中通过CCDirector的runWithScene方法,运行游戏的第一个场景
2.通过点击HelloWorldScene中的一个精灵,实现切换到场景SceneSecond
3.通过点击SceneSecond中的一个精灵,实现切换到成精HelloWorldScene
创建第一个场景HelloWorldScene:
HelloWorldScene.h
SceneSecond.cpp
当然,也可以使用pushScene和poScene来实现,但是这种方式会消耗很多内存:
修改响应函数即可:
说明:
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()); }
相关文章推荐
- 页面中特定文字加粗
- Spring MVC入门示例
- nginx 优化
- Xamarin.Forms入门困扰与解决方式-No.3
- 多个Fragment的使用
- 第一个简单的android项目
- db2用户权限
- CL.exe的 /D 选项, Preprocessor Macro预处理器宏定义
- 【详解】Python抓取数据脚本
- linux中的一些命令
- JS实现网页右侧带动画效果的伸缩窗口代码
- R语言:表达式、数学公式、特殊符号
- java之静态变量
- Android Messenger 跨进程通信
- 解决PKIX:unable to find valid certification path to requested target 的问题
- ==、equals
- 基于windows的多线程编程初步介绍
- STM32 ADC结合DMA数据采样与软件滤波处理
- 乱码 "lock".equals("lock")->false
- Leetcode || Integer to Roman