适合初学者的5款游戏引擎:如何从零开始用 C 开发一款游戏引擎
适合初学者的5款游戏引擎:如何从零开始用 C 开发一款游戏引擎我最喜欢的脚本语言是Lua。Lua体积小、速度快,非常容易与C和C 本机代码集成。此外,如果我使用Lua和“现代”C ,我喜欢使用一个名为Sol的包装库(https://github.com/ThePhD/sol2)。Sol库可帮助人们快速熟悉和使用Lua,并提供了许多辅助函数来改进传统的Lua C-API。Lua是一种快速、小型的脚本语言,可轻松与C/C 项目集成随着我们游戏引擎的不断发展,一个常见的选择是使用简单的脚本语言实现游戏关卡定制。想法很简单:我们在原生C 应用程序中嵌入了一种脚本语言,非专业程序员可以使用这种更简单的脚本语言编写实体行为、AI逻辑、动画和游戏的其他重要方面的脚本。一些流行的游戏脚本语言有Lua、Wren、C#、Python和JavaScript等。所有这些语言的运行级别都比我们的原生C 代码高得多。无论谁使用脚本语言编写游戏行为脚本,都不需要担心内存
Imgui是一个强大的UI库,被许多游戏引擎用作编辑工具
Dear ImGui是极佳的选择之一,它允许我们为引擎工具快速设置用户界面。ImGui项目使用了一种称为“即时模式UI”的设计模式,由于它通过利用加速的GPU渲染与3D应用程序进行良好的通信从而被广泛用于游戏引擎。
总之,如果你想在游戏引擎中添加UI工具,建议使用Dear ImGui。
9 . 脚本开发
随着我们游戏引擎的不断发展,一个常见的选择是使用简单的脚本语言实现游戏关卡定制。
想法很简单:我们在原生C 应用程序中嵌入了一种脚本语言,非专业程序员可以使用这种更简单的脚本语言编写实体行为、AI逻辑、动画和游戏的其他重要方面的脚本。
一些流行的游戏脚本语言有Lua、Wren、C#、Python和JavaScript等。所有这些语言的运行级别都比我们的原生C 代码高得多。无论谁使用脚本语言编写游戏行为脚本,都不需要担心内存管理或核心引擎如何工作的其他低级细节。他们要做的就是编写游戏中对应关卡的脚本,而我们的引擎知道如何解释脚本并在幕后执行艰难的任务。
Lua是一种快速、小型的脚本语言,可轻松与C/C 项目集成
我最喜欢的脚本语言是Lua。Lua体积小、速度快,非常容易与C和C 本机代码集成。此外,如果我使用Lua和“现代”C ,我喜欢使用一个名为Sol的包装库(https://github.com/ThePhD/sol2)。Sol库可帮助人们快速熟悉和使用Lua,并提供了许多辅助函数来改进传统的Lua C-API。
如果我们开发的游戏引擎中支持脚本编程的话,那么接下来可以开始在游戏引擎中讨论一些更高级的话题。脚本编程能够帮助定义人工智能逻辑、自定义动画帧和运动,以及其他不需要通过原生C 代码控制,而是可以通过外部脚本轻松管理的游戏行为。
10 . 音频
接下来,还有一个需要为游戏引擎添加的支持元素是音频。
如果想要读写音频数据并发出声音,我们需要通过操作系统访问音频设备。再次声明,由于人们通常不想编写特定于操作系统的代码,我建议使用一个多平台库来抽象音频硬件访问。
SDL等多平台库就具有扩展功能,可帮助引擎处理音乐和音效等内容。
但是,我强烈建议只有在确定引擎的其他部分都已经能够正常协同工作之后,再考虑处理音频的问题。控制声音文件发音可能很容易实现,但如果我们过早地开始处理音频同步问题,即把音频与动画、事件和其他游戏元素联系起来共同考虑,事情往往会变得一团糟。
如果你真正是自己手工编写代码,那么由于多线程管理的复杂性,可能会导致音频处理起来变得很棘手。不过,如果你的目标是编写一个简单的游戏引擎,那么我可能更会借助一个专门的库来处理这一部分功能。
例如,你可以考虑将SDL_Mixer、SoLoud和FMOD等优秀的音频库和工具集成到自己开发的游戏引擎中。
《微型战场》(Tiny Combat Arena)
这款游戏就使用FMOD声音库来实现多普勒和压缩等音频效果
11 . 人工智能
最后一个子系统是人工智能。我们可以通过脚本来实现人工智能。这意味着,我们可以将人工智能逻辑委托给关卡设计师来编写脚本。另一个选择是,在我们的游戏引擎内核的本机代码中嵌入适当的人工智能系统。
在游戏中,人工智能用于对游戏对象产生响应性、适应性或类似智能的行为。大多数人工智能逻辑被添加到非玩家角色(NPC、敌人)中,以模拟类似人类的智能。
敌人是AI在游戏中应用的一个流行的例子。当敌人追逐地图上的物体时,游戏引擎可以通过路径搜索算法或有趣的模仿人类的行为来创建抽象效果。
伊恩·米林顿(Ian Millington)的《游戏人工智能》是一本关于游戏人工智能理论和实现技术的综合性书籍,值得参考。
五、不要贪多求快在游戏引擎开发工作中,最困难的部分之一是大多数开发者都不会设定明确的界限,即有一种走不到“终点线”的感觉。换句话说,程序员会启动一个游戏引擎项目,渲染对象,添加实体,添加组件,但到最后突然发现一切都很糟糕。因此,如果他们不定义某种边界,就很容易不断添加越来越多的功能,而忽略了全局。如果这种情况发生,游戏引擎很有可能永远看不到曙光。
除了缺乏边界,当看到代码以闪电般的速度在眼前增长时,我们自己反倒很容易被淹没。游戏引擎项目的复杂性可能会迅速扩大,几周内你的C 项目可能会有几个依赖项,需要复杂的构建系统,而随着更多功能添加到引擎中,代码的整体可读性会不断下降。
因此,我的首要建议是,在编写实际游戏时,要始终坚持编写自己的游戏引擎。开始并完成游戏的第一次迭代时,脑海中要有一个真实的游戏。这将帮助你设定限制,并为你需要完成的工作指出一条清晰的路径。尽最大的努力坚持下去,而不是反复改变需求。
六、稳扎稳打,专注基础大多数学生在项目开始时都感到兴奋,但是随着时间的推移就开始出现焦虑情绪。如果我们从头开始创建一个游戏引擎,尤其是在使用像C 这样的复杂语言时,很容易不知所措失去动力。
因此,要学会及时享受某些阶段性的小胜利。例如,学会如何成功地在屏幕上显.jpg纹理,成功地发现了两个物体之间的碰撞等等。专注并理解基础知识一直都是非常重要的事情。
对于热爱编程的朋友来说,路再难走也要坚持走下去!如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
编程学习书籍分享:
编程学习视频分享: