C++到底适不适合做游戏开发?漫谈C++游戏引擎开发

最近我用 C++ 写了一个游戏引擎,并用该引擎开发了一个名为 Hop Out 的小型手游。先来看看实际运行效果:

Hop Out 是一款类似复古街机游戏,但拥有 3D 卡通外观的游戏。闯关方式为改变所有垫子的颜色,这一点和 Q*Bert 游戏很相似。

Hop Out 仍在开发当中,不过游戏引擎部分基本完工了,所以我想在这里分享关于游戏引擎开发的一些技巧。

在我看来,开发游戏引擎比较尴尬的一个情况就是你可能不知不觉地就造就出一个庞然大物,然后你一看到它就头皮发麻,所以我的主张是保持事物的可控性,具体将从以下三个方面进行阐述:

采用迭代方法

先三思而后合并

认识到序列化是个很大的主题

采用迭代方法

我的第一条建议是先快速地让程序运行起来,然后迭代地进行开发。

如果条件允许的话,找个样例程序,然后以此为基础开始。以我为例,先下载 SDL 再打开 Xcode-iOS/Test/TestiPhoneOS.xcodeproj ,然后在 iPhone 上运行 testgles2 样例程序。立刻我就得到了一个很可爱的旋转立方体,如下图。

C++到底适不适合做游戏开发?漫谈C++游戏引擎开发_第1张图片

然后我下载一个别人做好的马里奥 3D 模型。随后编写了一个文件格式不太复杂的 OBJ 文件加载程序,接着修改样例程序,让马里奥取代立方体,如下图。还有,我集成了SDL_image 来帮助加载纹理。

C++到底适不适合做游戏开发?漫谈C++游戏引擎开发_第2张图片

再然后,我实现了双摇杆控制来移动马里奥,如下图。

C++到底适不适合做游戏开发?漫谈C++游戏引擎开发_第3张图片

接下来我想着研究一下骨骼动画,所以我打开 Blender 制作了一个触手模型,并通过一段可以前后摆动的有两根骨头的骨架来操控它。

C++到底适不适合做游戏开发?漫谈C++游戏引擎开发_第4张图片

不过这里我放弃了使用 OBJ 文件格式,转而编写了一个将数据从 Blender 导出到自定义 JSON 文件的 Python 脚本,这些 JSON 文件存储了皮肤网格、骨骼、动画等数据。在 C++ JSON library 的帮助下我将这些文件加载到了游戏中。

C++到底适不适合做游戏开发?漫谈C++游戏引擎开发_第5张图片

上述过程成功后,我接着使用 Blender 制作更加精致的人物。下图展示了我制作出的第一个可操控的 3D 人物。

C++到底适不适合做游戏开发?漫谈C++游戏引擎开发_第6张图片

后来我又做了一大堆的工作,不过这里我想强调的重点是,我没有在动手编程之前先规划好引擎架构。事实上,每当要添加一个新特性时,我只着眼于用最简单的代码将其实现,然后观察这些代码,看看它们自然而然呈现出的是一种什么架构。这里所讲的引擎架构,指的是组成游戏引擎的模块集、模块之间的依赖关系,以及模块之间交互所使用的 API 。

C++到底适不适合做游戏开发?漫谈C++游戏引擎开发_第7张图片

这是一种迭代开发的方法,这种方法在编写游戏引擎时非常有用,其优点在于不管开发工作进行到哪个阶段,你始终都有一个可运行的程序。如果在后续提取代码模块时出现问题,你可以通过与上一次可正常运行的代码对比以快速地找出错误。显然,这里我假设你使用了某种源代码控制软件。

也许你认为这种开发方法会浪费大量的时间,因为中间过程会产生许多后续需要清理的垃圾代码。但是,大部分的清理工作无非就是将代码从一个 .cpp 文件移动到另一个 .cpp 文件、将函数声明提取到 .h 文件、或者一些其他简单的操作。决定代码的归属其实是一件相当困难的工作,但是显然,当代码呈现在你面前时,这个工作就会简单许多。

况且在我看来,先绞尽脑汁地想出一个你认为能满足未来所有需求的架构,然后再着手编程,会比迭代开发浪费更多的时间。这里转发分享就秒结到账,兼职全职月入过万,一部手机一根网线运作全球市场,咨询微信一商一耳零漆二零久巴零推荐一下我最喜欢的关于介绍过度工程危害的两篇文章,一篇是 Tomasz Dąbrowski 的 The Vicious Circle of Generalization ,另一篇是 Joel Spolsky 的 Don’t Let Architecture Astronauts Scare You 。

但是请注意,我并没有说你永远都不应该先在纸面上解决问题,然后编程实现它。我也并没有说你不应该提前规划好你想要的功能。就我而言,我从一开始就想要游戏引擎能够在后台线程中加载所有 assets 文件,但是我一开始并没有去设计如何实现这个功能,而且一开始也确实没有实现这个功能,实际上我一开始只实现了加载部分 assets 文件的功能。

你可能感兴趣的:(C++到底适不适合做游戏开发?漫谈C++游戏引擎开发)