一旦游戏的复杂性达到足够大的规模,任何游戏开发人员都会遇到的第一件事就是场景管理。 能够在逻辑上将游戏的各个部分划分为离散的场景,并以有状态的方式呈现给用户,这不仅是游戏开发的关键,也是应用程序开发的关键。 Godot凭借其树上的实用程序功能,在轻松更改根场景方面做得很好。 但是,即使在Godot自己的文档中,它也指出默认实现有一些缺点,您将需要通过后台加载,添加一些进度条以及执行其他操作来使其更加美观。 实际上,在本教程中,他们的第一个使用Singletons的示例就是如何制作自己的场景管理器。
因此,如果所有这些都是本教程中可用的基本信息,那么为什么要写它呢? 好吧,从图形化的实现中,有一些本教程并没有真正涉及到的细节,另外,我用简单的动画做的一些整洁的事情对其他人来说是一个很好的起点。 因此,我将向您展示我如何在A:\ dventure中做到这一点,添加了一些技巧,甚至还提供了代码,以便您可以将其放入游戏中!
- 采访了令人惊叹的独立游戏《独立开发故事》(Indie Dev Story)的创作者James R.。
- 关于Swift和SpriteKit的故事
- 我的新游戏正在等待审查
- 创建完整的2D视频游戏的初学者指南Free Udemy Course
- 游戏开发的故事-第一步

首先,由于此场景管理器将具有一些很酷的图形效果,因此我们需要对其进行制作,以便它实际上可以在所有内容之上进行渲染。 由于SceneTree类上的change_scene函数将替换根目录中的最后一个节点,这意味着默认情况下,任何自动加载的元素都将在所有内容之前和之下呈现。 为了解决这个问题,我使用的场景管理器实际上是一个CanvasLayer,其渲染的级别比屏幕上所有其他元素的渲染级别高。 这样一来,推子及其子项就将始终显示在顶部。
最初,我采用了蛮力方法,在卸载场景之前和之后,使用场景管理器在场景树中添加和删除过渡节点。 这种单例方法的复杂度大大降低了,而且对于那些比我当时更了解戈多的人来说可能很明显。 还要注意,“暂停模式”设置为“处理”,这是由于我们的脚本使用了标准的SceneTree.paused属性冻结了我们的游戏。 这将使正在加载的动画能够在暂停其他所有内容的同时进行动画处理(假设所有可交互对象也都尊重已暂停的属性)。
即使我创建的场景管理器不执行异步加载,但我确实添加了一个简单的标志,如果您的新场景在开始时需要进行大量处理,则可以切换该标志。 在过渡到我的地牢之前,由于它们开始时会花费一些时间,因此我将保持值传递给新的change_scene方法。 这通知场景管理器在加载新场景时不应自动淡入。 生成地牢之后,我只需要告诉场景管理器事情已经准备就绪,然后它将执行正常的淡出过程。
除了实际的场景管理方面,过渡还需要很好看。 类似于那些经典的PowerPoint过渡。 RPG Maker通过使用灰度图像滚动滚动来淡入和淡出屏幕,这是一种很好的方法。 您甚至可以提供自己的图像来制作自定义过渡效果。 在我成长的那段时间里,我堆砌了很多东西,而且如果您知道在哪里寻找的话,他们仍然在线上服务很多。 任何灰度图像都可以使用; 您甚至可以使用当您经历“摄影阶段”时拍摄的一些火车轨道的黑白照片。
为了使该功能正常工作,我在“ Fader”图像节点上添加了一个小的着色器材质。 实际上,它并没有那么复杂,它使用图像节点自己的资源。 这样就可以轻松地从GDScript进行更改,并可以直接在编辑器中直接预览推子。
场景管理器中的AnimationPlayer实际上将对着色器的“过渡”值执行补间,这将根据像素相对于过渡位置的值来渲染黑色或透明。 这样可以实现平滑的过渡效果,但代价是存在硬边缘,根据图像的过滤情况,硬边缘可能会或可能不会明显。 使用change_scene函数以及加载下一个场景后更改其is_ready状态时,将自动触发AnimationPlayer。 在这个简单的实现中,它将随着图像淡出,然后反向播放相同的动画以逐渐淡入。最后,您将获得与测试着色器时所见的结果。 但是,真正精巧的是在游戏中看到它。
在这里制作的场景管理器并没有像异步加载那样做任何花哨的事情,但是确实为视觉效果增加了一些麻烦。 如果您像我一样,并且在使用RPG Maker之后使用了Godot,这应该有助于弥补您可能会缺少的功能集中的微小但令人难忘的空白之一。 我认为,与以前相比,这种效果是我游戏演示中的飞跃性进步,并且保留了我想要的复古美感。 对于低分辨率游戏来说确实很棒。
您可以下载嵌入了脚本和着色器的完整.tscn文件,并将其添加到“自动加载”中以立即开始使用它。 确保更改任何get_tree()。change_scene引用,以通过SceneManager Singleton代替