熟悉coco2dx的人,可能都知道在引擎内部提供CCScene类,这是一个场景概念的类,而cocos2dx本身提供了切换场景的方法。
CCScene t_scene;
CCDirector::sharedDirector()->runWithScene(t_scene);
其实,我们要做而非去怎么改引擎。而是在引擎外部进行封装。抽象出各个系统,然后通过各个系统中调用引擎的功能,来实现我们的需求。
需求: 要实现一个场景,场景是动态的,上面漂浮着各种各样的小岛,场景当中有飞鸟,流水。上面有一层GUI 上面有很多按钮,比如背包,任务等。
分析:
“场景设计规则”
一种是在游戏当中切场景,比如A,B两个场景切换,如果当前显示A场景,则B场景的资源需要从内存中移除。如果是当前是B场景,A场景中的资源需要从内存中移除。从理论上来讲,内存的峰值能改出现在你最复杂的场景中。可能在切场景的过程中,需要做loading,时间上有损耗。
另一种是单一场景,我们需要做的就是不停的换UI。
由于我们需要做战斗场景,所以,我们采取了第一种切场景的方式,规划了2个场景。一个是主场景,一个是战斗场景,进入战斗过程中需要做Loading来加载战斗资源。然后主场景的部分资源做了cash,来保证从战斗退出后,能快速的切换到主场景。
“UI设计规则”
在战斗场景和主场景中,我们的UI显示完全不一样。所以,我们决定UI跟场景走。由于场景就两种,所以就手动写死在程序中指定的场景加载指定的UI。如果设计到多场景模式的情况,比如3D客户端游戏,UI其实就与场景无关了,除非做特殊需求。其实,到最后我们的UI模块和场景模块也是分开。只不过是在切换场景的过程当中,将指定的UI挂到场景的某一层上。2D游戏当中比较常见的操作就是一个UI弹出另一个UI,一个UI切换到另一个UI,一个UI返回上一个UI。
根据常用的规则我们将UI的操作方式主要设定三个规则,
一种叫做UI弹出关闭规则(popUp,popDown),它来实现在某一个界面弹出任意界面,然后在弹出后,不许关闭此界面,比如战斗胜利后,你必须点确定才能推出当前弹出窗口。有点类似Windows程序设计中的模式对话框。
一种叫做UI进入退出规则(entry,back),它主要用来界面的切换,例如界面A->界面B->界面C 一层层进入,然后界面C->界面B->界面A 一层层退出。它的内部实现就是一个栈,后进先出,先进后出。
一种清空UI规则,就是清空栈,强制返回主界面。
“场景层次划分”
对于一个场景,我们目前根据需求分了4个层次,就是CCScene上面挂了4个CCLayer 并设置了ZOrder的先后关系,一个叫背景层,中间层,UI层,前UI层。背景层就是底图,比如蓝天白云,中间层就是漂浮的小岛,UI层就是UI要挂载这个上面。前UI层是在战斗过程中某些特效需要覆盖在战斗UI中,所以增加了这么一层。否则,在整个框架下,我们的UI会覆盖所有东西。