cocos2dx场景切换小例子
2014-03-08 21:52
267 查看
环境:cocos2d.x.version: 2.2.1 + vs2010
目的:HelloWorld程序中,已经有了一个场景,现在自己加一个场景,两个场景来回切换,可以加任何渐变效果。
方法一,不用create函数:
首先建一个自定义层:
class TestLayer1 : public CCLayer
{
public:
TestLayer1(void);
~TestLayer1(void);
void nextCallback(CCObject* pSender);
}; 在层的构造函数中可以放置该层要用的所有内容,比如背景图,然后放一个按钮,可以用菜单来实现:
// menu
CCMenuItemImage *item1 = CCMenuItemImage::create("anniu.png", "anniu.png", this, menu_selector(TestLayer1::nextCallback) );
CCMenu *menu = CCMenu::create(item1, NULL);
menu->setPosition( CCPointZero );
item1->setPosition(230,50);
addChild(menu, 1);
将点击按钮的回调函数放到菜单项的参数中。在按钮的回调函数中切换场景,这里是当场景为TestLayer1时切回HelloWorld主场景:
void TestLayer1::nextCallback(CCObject* pSender)
{
CCScene* s = new CCScene();
CCLayer* pLayer = new HelloWorld();
pLayer->init();
s->addChild(pLayer);
CCScene* pScene = CCTransitionFadeDown::create(1.2f, s);//创建渐变模式
pLayer->release();
s->release();
if (pScene)
{
CCDirector::sharedDirector()->replaceScene(pScene);//切换场景
}
}
CCTransitionXXXXX有很多种效果,换个名字即可。使用new方法时注意要手工release。
同理,在HelloWorld的初始化函数中加一个按钮和回调函数,回调函数中将场景从HelloWorld切换到自定义的TestLayer1:
void HelloWorld::nextCallback(CCObject* pSender)
{
CCScene* s = new CCScene();
CCLayer* pLayer = new TestLayer1();
s->addChild(pLayer);
CCScene* pScene = CCTransitionFadeDown::create(1.2f, s);
s->release();
pLayer->release();
if (pScene)
{
CCDirector::sharedDirector()->replaceScene(pScene);
}
}方法二,模仿源代码使用create函数:
将自定义层作如下更改:
class TestLayer1 : public CCLayer
{
public:
TestLayer1(void);
~TestLayer1(void);
//将初始化放在这里
virtual bool init();
//模仿源代码
static CCScene* scene();
void nextCallback(CCObject* pSender);
CREATE_FUNC(TestLayer1);
}; 其中scene函数的实现与HelloWorld中的实现大致相同,作用是创建新场景和新的TestLayer1层,由于使用Create函数创建,所以已将产生的对象添加到自动释放的对象中,不用手动release。
CREATE_FUNC宏就是自动生成Create函数的宏。
回调函数简化为:
CCScene* s = HelloWorld::scene();
CCScene* pScene = CCTransitionFadeDown::create(1.2f, s);//创建渐变模式
if (pScene)
{
CCDirector::sharedDirector()->replaceScene(pScene);//切换场景
} HelloWorld类不需要改变,只需要简化回调函数:
CCScene* s = TestLayer1::scene();
CCScene* pScene = CCTransitionFadeDown::create(1.2f, s);//创建渐变模式
if (pScene)
{
CCDirector::sharedDirector()->replaceScene(pScene);
}
以上。
(ps:为什么没有见HelloWorld类的构造和析构函数?使用第二种方法,删除了构造析构确实可以,但Create里面不是也new了吗?内部有点什么还不明白)
目的:HelloWorld程序中,已经有了一个场景,现在自己加一个场景,两个场景来回切换,可以加任何渐变效果。
方法一,不用create函数:
首先建一个自定义层:
class TestLayer1 : public CCLayer
{
public:
TestLayer1(void);
~TestLayer1(void);
void nextCallback(CCObject* pSender);
}; 在层的构造函数中可以放置该层要用的所有内容,比如背景图,然后放一个按钮,可以用菜单来实现:
// menu
CCMenuItemImage *item1 = CCMenuItemImage::create("anniu.png", "anniu.png", this, menu_selector(TestLayer1::nextCallback) );
CCMenu *menu = CCMenu::create(item1, NULL);
menu->setPosition( CCPointZero );
item1->setPosition(230,50);
addChild(menu, 1);
将点击按钮的回调函数放到菜单项的参数中。在按钮的回调函数中切换场景,这里是当场景为TestLayer1时切回HelloWorld主场景:
void TestLayer1::nextCallback(CCObject* pSender)
{
CCScene* s = new CCScene();
CCLayer* pLayer = new HelloWorld();
pLayer->init();
s->addChild(pLayer);
CCScene* pScene = CCTransitionFadeDown::create(1.2f, s);//创建渐变模式
pLayer->release();
s->release();
if (pScene)
{
CCDirector::sharedDirector()->replaceScene(pScene);//切换场景
}
}
CCTransitionXXXXX有很多种效果,换个名字即可。使用new方法时注意要手工release。
同理,在HelloWorld的初始化函数中加一个按钮和回调函数,回调函数中将场景从HelloWorld切换到自定义的TestLayer1:
void HelloWorld::nextCallback(CCObject* pSender)
{
CCScene* s = new CCScene();
CCLayer* pLayer = new TestLayer1();
s->addChild(pLayer);
CCScene* pScene = CCTransitionFadeDown::create(1.2f, s);
s->release();
pLayer->release();
if (pScene)
{
CCDirector::sharedDirector()->replaceScene(pScene);
}
}方法二,模仿源代码使用create函数:
将自定义层作如下更改:
class TestLayer1 : public CCLayer
{
public:
TestLayer1(void);
~TestLayer1(void);
//将初始化放在这里
virtual bool init();
//模仿源代码
static CCScene* scene();
void nextCallback(CCObject* pSender);
CREATE_FUNC(TestLayer1);
}; 其中scene函数的实现与HelloWorld中的实现大致相同,作用是创建新场景和新的TestLayer1层,由于使用Create函数创建,所以已将产生的对象添加到自动释放的对象中,不用手动release。
CREATE_FUNC宏就是自动生成Create函数的宏。
回调函数简化为:
CCScene* s = HelloWorld::scene();
CCScene* pScene = CCTransitionFadeDown::create(1.2f, s);//创建渐变模式
if (pScene)
{
CCDirector::sharedDirector()->replaceScene(pScene);//切换场景
} HelloWorld类不需要改变,只需要简化回调函数:
CCScene* s = TestLayer1::scene();
CCScene* pScene = CCTransitionFadeDown::create(1.2f, s);//创建渐变模式
if (pScene)
{
CCDirector::sharedDirector()->replaceScene(pScene);
}
以上。
(ps:为什么没有见HelloWorld类的构造和析构函数?使用第二种方法,删除了构造析构确实可以,但Create里面不是也new了吗?内部有点什么还不明白)
相关文章推荐
- 【笔记】试玩 cocos2d-x-3.0beta on android
- cocos2dx出现 Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
- CCScale9Sprite的用法
- cocos2dx入门
- cocos2dx中js绑定的回调
- xcode创建cocos2dx模版 关于couldn't add 'com.apple.XcodeGenerated' tag错误
- cocos2dx radiogrouop实现
- cocos2dx+lua+zeroBraneStudio 配置
- Cocos2dx新建项目包含路径问题,链接库问题
- <Xcode><初学><备忘>convertToGL 和convertToNodeSpace的作用
- 如何实现手势识别功能?
- 如何优雅的管理游戏资源
- 自大的cocos2dx程序员惨痛的教训
- 用于解析PhysicsEditor生成的plist文件 ,支持cocos2d-x-2.1.5 亲测通过
- cocos2dx + android 如何添加百度插屏广告
- cocos2dx 官方示例学习(二), Vector
- 基于boost::asio的客户端网络库
- cocos2dx lua 加载cocostudio 导出场景
- COCOS2DX 3.0 Andriod配置