最近开始着手开发一个手游,把遇到的一些技术性问题解决方案记录一下。
一般情况我们点开一个游戏的时候,首先会出现展现开发团队的slogan的场景,然后会自动切换到资源加载场景或者菜单。
这样场景的自动切换在cocos2dx中如何实现呢,首先先来说说场景切换的问题。
cocos2dx中有一个大总管Director,由它来管理场景的切换。我们来看看创建新项目后,cocos自动为我们生成的代码,在AppDelegate.cpp中有这样一段:
auto scene = HelloWorld::createScene();
director->runWithScene(scene);
切换场景使用的方法是replaceScene,看一个例子:
auto new_scene = NewScene::createScene();
<pre name="code" class="cpp">Director::getInstance()->replaceScene(new_scene);
getInstance()方法获得了一个director的实例,上面那个例子里面的director就是这样的一个实例。
在切换场景的过程中还可以添加特效,例如蹦蹦跳跳地切换:
Director::getInstance()->replaceScene(TransitionJumpZoom::create(1,new_scene));
传入的两个参数分别是切换所用时间以及切换到的场景对象。在官方的demo中有很多场景切换特效的例子,如果感兴趣可以一一尝试。
接下来就说一下如何进行自动切换,其实在cocos中说到自动调用什么,大家就都不陌生了,第一时间想到的就是定时器,cocos中的定时器有三种,因为不是本文重点,就不一一介绍着三种了,只说一下用到的一种:
scheduleOnce(schedule_selector(被调用函数),时间)
这是一种只执行一次的定时器,在设置了这种定时器以后,经过设定的时间,就会自动调用schedule_selector中的函数,使用这个定时器,就可以很方便地实现场景的自动切换了。
例如本文一开始提到的展现完开发团队slogan后。自动切换到另一个场景,我们可以在前一个scene的init函数最后设置这个定时器:
this->scheduleOnce(schedule_selector(HelloWorld::changeScene),2.0f);
void changeScene(float dt);
我们在这个函数里面实现切换场景的代码即可:
void HelloWorld::changeScene(float dt)
{
auto load_scene = new_Scene::createScene();
Director::getInstance()->replaceScene(TransitionJumpZoom::create(1,new_scene));
}
PS.replaceScene会将原来的场景释放掉,有些时候我们需要原来的场景暂停,在完成新场景后返回,例如在游戏过程中进入设置界面修改一下声音什么的,这时使用replaceScene就不合适了,cocos中进行场景切换还有popScene和pushScene两种方法,我将在后面的blog中进行使用讲解。