简介
使用本系列文章所描写的iPhone游戏引擎开发的首款游戏是《Monster Bowling》,它已经在圣诞前发布于App Store。

Monster Bowling

Monster Bowling


你可能会好奇为何成品游戏与早前呈现的游戏截图(dApps注:即玩家需要控制着一艘船去探索世界的冒险游戏)不一样。因为之前参与该项目的人员失去了最初的创作激情,并退出了项目开发。但我不希望自己投入努力而创造出的引擎白白浪费(即未能基于该引擎创造游戏),我便与另外一名美术人员合作并最终创造出《Monster Bowling》。我花费了9个月的时间编写引擎和工具,并且在后来6个月中利用空闲时间里编写游戏代码,现在看来我真的为这款游戏投入了非常多的时间。
不足之处
以下我将总结我们在这两个项目中所犯的错误:
首先,船舶游戏项目的失败原因在于游戏规模过大。尽管我们在制作过程中已经删减了一些内容,但是仍然有太多需要费心的内容,并因此抹灭了团队成员的激情。所以我建议那些利用业余时间制作游戏的人,特别是与别人首次合作之时,千万不要轻易尝试制作大型游戏。如果团队中有任何成员失去了创作激情,那么不论你付出了多少努力,都不可能完成游戏创作。
Monster Bowling

Monster Bowling


其次,船舶游戏失败的另外一个原因是开发团队缺少清晰的方向,未能明确游戏的发展,时间安排以及检查列表。如果缺少明确的目标,团队成员便很容易迷失方向,并失去激情。
第三点是关于《Monster Bowling》的发行;游戏刚发行时销量并不是很好。因为我们的开发团队中只有1名美术人员和1名程序员,我们将全部的精力都投入游戏开发但而忽略了市场营销,以及宣传游戏的时机。所以游戏在刚刚发行时并未出现任何能够提高销量的评论。
第四,引擎中的技术性问题。在引擎中,游戏执行时间和编辑器会使用相同的文件格式,即二进制格式。但是这导致我们很难合并文件,就像如果2个人都修改了游戏关卡中的物体,我们便很难整合这个过程中产生的变化。幸运的是,我们的团队规模不大,并且我们只需避免同时编辑相同文件就行,这就不会影响项目的整体发展。
可取之处
谈论了错误之处后,我想也应该分享一些我们所做出的正确决定。
首先,在制作《Monster Bowling》期间,我们的团队内部总是进行各种交流。每隔1周或2周的时间我们便会讨论关于游戏的进程。这点对于那些利用休闲时间制作游戏的人来说尤为重要,因为通过讨论游戏,我们能够保持激情,并让团队成员掌握游戏项目的发展过程。
其次,制作编辑器以及Mac版本的游戏决定都很重要。因为这么做让美术人员能够脱离程序员而独立创造并测试游戏关卡。尽管编辑器并非用户友好型工具,美术人员仍建议添加一些自己能够承受的最低功能集(如在3D视口中添加变焦功能以拉近物体)而提高工作效率。明确地说,那些缺失的功能能够帮助程序员真正改善自己的工具。
游戏所使用的关卡编辑器

游戏所使用的关卡编辑器


第三,在游戏中植入脚本语言非常有帮助。比起使用C++,在Lua中编写游戏玩法代码更加有效。并且,修改脚本文件也比编辑C++代码快得多,因为它的迭代速度更为迅速。除此之外,脚本语言能够明确区分引擎代码和游戏玩法代码。多亏了Lua,我们在从船舶游戏到《Monster Bowling》的转变中并不需要过多修改引擎代码。
使用Lua创建的《Monster Bowling》测试关卡

使用Lua创建的《Monster Bowling》测试关卡


第四,我们坚持从头开始编写引擎,包括内存管理,渲染代码,动画等。我一直在使用的一些开放源码库包括:Bullet physics library,Lua以及SOIL(用于解压PNG纹理)。我之所以会坚持使用这些源码库是因为我希望借此学习如何创建一个能够与不同模块相互作用的引擎。并且,我也不擅长物理和脚本语言,所以如果要自己编写物理库和脚本语言将会花费更多时间,并且最终创造出来的代码可能也没有Bullet或Lua那般有效。所以我便选择了具有源代码的开放源码库,从而帮助我更轻松地进行调试。
结论
这次的iPhone游戏引擎项目共花费了我们1年又3个月的时间,并且我们也最终创造了一款完整的游戏。尽管我们只有一名程序员,但是我们合理利用了开源码库,并且我也割舍了最喜欢的图像编程以减少我们的工作负荷。我认为编写了引擎但却不制作游戏实在太荒唐了,所以我便决定使用该引擎创造出《Monster Bowling》。不过从船舶游戏的转变的确浪费了我们之前所付出的一些努力(如游戏世界关卡流动传输)。所以对于那些只是单纯地想创造一款游戏的人来说,他们可以授权使用一些现有的商业引擎,如Unity或UDK,而不是自己花大量的时间编写引擎。但是对于我本人来说,编写引擎能够让我学习到更多知识并感受到更多乐趣。
dApps注:原文发表于2011年12月31日,所涉事件及数据以当时为准。