这一篇是来说说关于cocos2dx中场景的切换相关的问题。
我们都知道,一个游戏,首先进入时不会直接进入游戏界面,而是其他的一些,可以是logo,也可以是菜单界面或是注册界面。
这时候,在开始游戏的时候就需要进行场景的切换才可进行游戏的体验。现在就来简单的写下关于场景的跳转吧~其实关于场景切换时,是会有呈现出Node不同的事件回调的,也就是生命周期。这里我们就先不说,直接来实现怎么进行的切换及切换时附带的一些酷炫效果~
继续引用上一次的工程,没错,还是TestFor_3_9。
上一次,我们创建出自己的场景,既然这篇写的是场景的跳转,那么,我们还需要创建另一个场景类,就叫MySecondScene。这里就不在给出新建的过程了,记得在新建的时候,把它们都放在Classes目录下就行了~
然后首先我们需要怎么样的效果呢?
现在有两个场景:MyFirstScene 和 MySecondScene。
然后场景跳转需要有个按钮来调用这个函数的实现。还记得HelloWorld这个场景吗?怕你们忘了,给你们贴出来看看,如下图所示:
这个HelloWorld场景中右下角有个按钮,当时它的功能就是来调用场景结束的函数的实现的。
所以,现在就这么来,我们创建两个场景,然后再场景中分别创建一个菜单条目来实现场景跳转函数接口的调用!这样我们点击了场景一的菜单条目,就会跳到第二个场景,再点击场景二的菜单条目,就会跳回一个场景。思路就这样。
好!现在开始编写场景的代码,我就直接给代码了,如果有不懂的可以留言问:
MyFirstScene.h:
#pragma once
#include "cocos2d.h" //包含头文件
using namespace cocos2d; //使用cocos2d命名空间
class MyFirstScene : public Layer //新建一个类,继承层(Layer)
{
public:
static Scene* createScene(); //MyFirstScene场景创建实现
virtual bool init(); //MyFirstScene层的初始化
CREATE_FUNC(MyFirstScene); //创建MyFirstScene的Create方法
void EnterSecondScene(Ref *pSender); //创建一个菜单回调函数,这里实现了场景的跳转
};
MyFirstScene.cpp:
#include "MyFirstScene.h"
#include"MySecondScene.h"
//MyFirstScene场景创建实现
Scene* MyFirstScene::createScene()
{
auto scene = Scene::create(); //创建一个场景
auto layer = MyFirstScene::create();//创建一个MyFirstScene层
scene->addChild(layer); //把MyFirstScene层加入刚刚创建的场景中,
return scene; //返回这个场景
}
bool MyFirstScene::init()
{
if ( !Layer::init() ) //先初始化父类的init方法,如何初始化失败,则创建MyFirstScene层失败
{
return false;
}
Size VisibleSize = Director::getInstance()->getVisibleSize(); //获得屏幕大小
auto label = Label::createWithSystemFont("Hello,This is MyFirstScene", "fonts/arial.ttf", 30);//创建一个标签
//菜单条目的创建有多种,之前的HelloWorld.cpp中实现的是图片菜单条目(MenuItemImage),即根据图片来创建菜单条目
//这里是根据标签来创建菜单条目,然后设置回调函数
auto menuitem = MenuItemLabel::create(label,CC_CALLBACK_1(MyFirstScene::EnterSecondScene,this));
//创建好了菜单条目,就需要加入菜单中,所以下面就是创建菜单
auto menu = Menu::create(menuitem, NULL);
//把菜单添加到MyFirstScene层中
this->addChild(menu);
return true;
}
//菜单回调函数的实现
void MyFirstScene::EnterSecondScene(Ref *pSender)
{
//我们知道,如果需要跳转场景,就会想到一个类,它就是Director类,它就是管理场景的
//这里跳转场景调用到的是导演类的这个接口:replaceScene(Scene *scene),里面传进去的是就是一个场景,这里需要注意的是场景二的头文件这是要加上的
Director::getInstance()->replaceScene(MySecondScene::createScene());
}
好了,其实上面注释也写的挺清楚了,就不再多说了,下面的MySecondScene场景的实现就没有注释了,因为基本都是一样的,如果有看不懂的,可以参照场景一的代码注释进行查看~
MySecondScene.h:
#pragma once
#include"cocos2d.h"
using namespace cocos2d;
class MySecondScene :public Layer
{
public:
static Scene *createScene();
CREATE_FUNC(MySecondScene);
virtual bool init();
void EnterFirstScene(Ref *pSender);
};
MySecondScene.cpp:
#include"MySecondScene.h"
#include"MyFirstScene.h"
Scene *MySecondScene::createScene()
{
Scene* scene = Scene::create();
MySecondScene *layer = MySecondScene::create();
scene->addChild(layer);
return scene;
}
bool MySecondScene::init()
{
if (!Layer::init())
{
return false;
}
Size VisibleSize = Director::getInstance()->getVisibleSize();
auto label = Label::createWithSystemFont("Hello,This is MySecondScene", "fonts/arial.ttf", 30);
auto menuitem = MenuItemLabel::create(label, CC_CALLBACK_1(MySecondScene::EnterFirstScene, this));
auto menu = Menu::create(menuitem, NULL);
this->addChild(menu);
return true;
}
void MySecondScene::EnterFirstScene(Ref *pSender)
{
//跳转到第一个场景,记得包含第一个场景的头文件:MyFirstScene.h
Director::getInstance()->replaceScene(MyFirstScene::createScene());
}
编写完成之后就可以运行了,然后效果如下:不知读者实现了么有~
最后,既然见到这个场景的跳转问题,就在此基础上加个比较有意思的效果,那就是场景跳转的方式。
使用很简单,就是在跳转场景的前面创建一个切换的效果就行了,比如创建一个淡入淡出效果:TransitionFade::create(float t,cocos2d::Scene *scene);
第一个参数就是场景跳转时所需要的时间,第二个就是跳转的场景了。然后使用如下:
Director::getInstance()->replaceScene(TransitionFade::create(1.0f,MySecondScene::createScene()));
运行效果就不贴出来了~
关于跳转方式,cocos官方提供的好多种跳转方式,比如淡入淡出效果,向上、向下、向左及向右跳转等等,反正挺多的,下面我就把它们部分的写出来,具体大家可以去试一下:
TransitionFade(淡入淡出效果)
TransitionFadeBL(从右上到左下消失)
TransitionFadeTR(从左下到右上消失)
TransitionCrossFade(对象交替呈现)
TransitionFadeDown(从上到下百叶窗效果)
TransitionFadeUp(从下到上百叶窗效果)
TransitionFlipAngular(轻弹效果的翻转)
TransitionFlipX(水平翻转)
TransitionFlipY(垂直翻转)
TransitionJumpZoom(跳跃试效果)
。。。。。。。。。。。。
(因为效果挺多的,而且有些是重复的,只是方向变了下,所以在这里我就不列出来了。仔细看看,这些效果都有一个特性,就是前面都存在Transition这么一个单词,这个单词是跳转的意思。其实Vs上也是有提示的,只要往那一打这么个词,后面就会提示很多效果了,这个就可以慢慢去找自己想要的效果。)
好了,这篇到这里就结束了,关于场景的跳转,想必还是挺重要的~
在下一篇中,我会讲讲另外一种场景切换的方式,就是在不释放你的场景的基础上切换到另外一个场景中,然后如果对这另外一个场景访问结束之后,可以退回来并释放你当前的场景。这在进入游戏时暂停然后继续游戏很有帮助,因为如果你直接用replaceScene的话,是直接释放掉你之前的场景的,也是挺有意义的哈~