游戏中的场景切换

游戏中的场景切换

        游戏中存在多个简单场景的,在进入游戏前可能在场景之间来回的切换,场景返回依据的是场景打开的顺序,而场景的打开是UI点击事件驱动的。 从这个角度看,打开UI时记录其打开的场景,关闭UI时关闭其打开的场景,建立UI栈通过控制UI栈的进出,可以控制场景的顺序打开与退出。 不同的UI可以打开相同的场景,可以通过UI保存一份场景数据, 在不同UI打开相同场景时,使得同一个场景恢复出不同的状态, 场景类本身是无状态的, 此外对于单个UI内切换场景的情况, 可以在UI内部建立场景栈,以便从其他场景返回时, 能够返回到UI内部打开的不同场景。场景切换的结构如下图所示:


        如上图,UI管理器建立UI栈,打开的UI入栈,关闭的UI出栈, 栈结构能够维护打开的先后顺序, 以便在回退的时候恢复之前打开的UI, 而场景通常是通过UI打开的, 因此可以打开场景的先后顺序过继给UI, 通过UI的回退实现场景的回退,而UI在打开场景时会生成一份关于该场景状态的数据(如镜头位置、加载的模型、模型的状态、光影效果、音效等), 以便回退到此场景时能够复现场景。对于单个UI可以切换多个场景的情况需要进行相应的调整, 将UI的场景改为场景栈, 记录打开顺序, 而场景栈内的信息就包括 场景ID 与场景驱动数据类。此外仅有UI栈对于场景的切换还是不是十分的方便, 如图UI-5退出时场景退出, 但UI-4 并没有关联场景, 此时我们无法知道需要打开的场景, 当然我们可以在UI栈里查找,但是这样是比较耗时的, 我们可以通过场景管理器维护一个场景栈, 就可以知道在场景退出的时候应该切换到哪个场景, 而不是在UI栈中寻找上一个UI关联的场景。

        以上为结构是建立基于主动场景切换是通过UI进行的基础上, 对于存在多个场景而又存在组队战斗的情况, 场景的切换变得更加复杂, 组队流程会使得玩家直接进入到某个场景,而在这个场景内进行系列操作后(进入其它场景)会因为其它队员未准备战斗等情况直接强制退出场景栈到某个场景, 而被踢出队伍也会造成整个场景栈退回到某个场景, 被迫切换的场景往往是一个固定的状态。对于这些情况需要场景管理器提供一些特殊的接口。

        从上图可以看出,场景正常切换流程,只需UI打开场景与UI关闭场景连个接口,而打开场景需要场景的驱动数据。被动的场景切换可以利用实现的接口到达指定类型的场景,只需POP空UI栈, 然后打开指定UI与场景。 当然POP的过程中需要控制参数空时是否显示栈内场景, 否则会将站内场景统统显示一遍。同样可以利用接口回到UI栈关联出的场景栈的某个场景, 只需要POPUI栈,直到显示出指定的场景。这样就可以几乎满足所有的场景切换需求。


猜你喜欢

转载自blog.csdn.net/ybn6775/article/details/79769739
今日推荐