三十、制作游戏

本章涵盖了几个与制作游戏相关的主题。我先谈设计 HTML5 游戏,然后谈开发。我还简要介绍了游戏素材的制作。最后,你会看到制作游戏的操作方面,比如如何在同一代码上与多人合作,以及如何在游戏制作团队中工作。马克·奥维马斯和彼得·维斯特巴卡在文中分享了关于这些话题的想法和技巧。

Peter vester backa:“html 5 和 JavaScript 在游戏开发方面被称为未来已经有很长时间了。他们还没有完全发挥他们的潜力,但我看到了很多希望。与此同时,原生开发工具、界面和易用性也有了很大改进。当然,在一个理想的世界中,能够到处使用 JavaScript 和 HTML5 代码就太好了。我认为本地应用和 HTML5/JavaScript 应用都有空间。”

设计游戏

这不是一本关于游戏设计的书。游戏设计是一个很大的研究领域,很多书都是关于这个主题的。欧内斯特·亚当斯的《游戏设计基础》这本书是一个很好的开始阅读游戏设计的地方。另一本有趣的书是《T2:游戏设计的艺术:透镜之书》,作者杰西·谢尔(CRC 出版社,2008)。

马克·奥维马斯:“在设计我们的游戏时,我们总是牢记代码需要高效。例如,我们不会设计一款游戏,其中数万个角色在屏幕上移动很重要,或者许多视觉事情同时发生,或者非常流畅的运动至关重要。”

这一部分不包括设计过程本身;相反,它主要讨论用 JavaScript 编写基于 web 的应用如何影响游戏设计。前面的引用是这种方法的一个例子:因为你想让你的游戏在各种设备上玩得好,你需要设计允许有效实现的游戏。

马克:“许多设备没有键盘,所以你的游戏需要允许通过触摸输入来控制。对于一些游戏来说,键盘控制更加自然。一个挑战是确保使用键盘玩游戏不会比使用触摸输入更容易。如果你开发一款游戏,让人们在网上对战,或者开发一款使用在线高分列表的游戏,要注意不要因为一组用户使用特定的输入法,就让他们比其他用户拥有更大的优势。”

彼得:“愤怒的小鸟成功的秘密之一是它是第一款在设计时就考虑到触摸设备的游戏。当你为触摸设备设计游戏时,它通常会不同于为带控制器的游戏机设计的游戏。始终为相关平台开发最佳体验。在 PlayStation 4 上玩和在 iPad 上玩是非常不同的体验,因为情况和背景非常不同。在一种情况下,你可以在沙发上坐几个小时在游戏机上玩游戏,而在手机上玩游戏可能只需要几分钟。两者都可以是很棒的体验,但方式非常不同,设计应该考虑到这一点。”

在许多 JavaScript 游戏中,精灵会根据设备的不同而放大或缩小。您已经在本书开发的游戏中看到了如何做到这一点。这本书没有考虑到的一点是,设备之间的长宽比是完全不同的。例如,iPad 的屏幕相对来说是方形的,不像 iPhone 6 的屏幕更像矩形。

在当前的游戏实现中,不同的纵横比意味着游戏屏幕周围有白色(或黑色)空间。如果你在 iPhone 5 上显示一个为 iPad 长宽比设计的游戏,几乎三分之一的屏幕都是空白的!在设计游戏时,尝试调整用户界面、游戏场地、覆盖位置等的设计以适应设备的长宽比是有意义的。理想情况下,游戏应该自动调整其整体布局,以适应每个设备的大小和长宽比。

Mark:“除了长宽比,还有人像和风景模式的选择。在手机上,你通常想使用纵向模式,但在台式电脑或电视上,横向模式更有意义。你的模式选择也取决于游戏的类型,你是否想使用纵向或横向模式,或者你是否希望两者都允许。

在我们的游戏中,游戏元素的定位依赖于长宽比。例如,在屏幕的顶部放置一个用户界面,在其下方是游戏区。如果有可用的空间,游戏区域将下移,以便元素在屏幕上的布局看起来更好。按钮的位置根据屏幕的长宽比而变化。但是,请注意,您也要相应地调整交互(手指位置)。因此,您不能总是使用设备的全屏。此外,如果您想要放置广告横幅,必须从可用于播放的屏幕部分中减去广告横幅的空间。这也意味着你必须使用容易缩放或者可以部分展示而不会从设计中带走任何东西的艺术品。"

当你设计在各种设备上运行的游戏时,你不能总是使用设备上所有可用的功能。例如,如果你的游戏严重依赖玩家倾斜设备,那么这个游戏就不能在台式机上玩。台式机显然没有检测倾斜的传感器(虽然那会很好玩!).此外,您通常依赖于浏览器的版本和已经实现的内容。音频就是一个很好的例子。不同的浏览器以不同的格式播放音频(或者根本不播放)。因此,你不应该设计一个将音频作为设计关键部分的游戏。像吉他英雄这样的游戏很难移植到 JavaScript,因为它们依赖于对音频的精确控制以及测量音频和玩家正在做的事情之间的同步性。

如果你制作一个游戏,你需要在为最小公分母(换句话说,功能最少的设备)创建游戏从而不使用更多现代设备的许多功能与创建一个使用那些功能但不能在旧设备上玩的游戏之间进行权衡。如果你想把你的游戏卖给一个游戏门户(一个托管许多不同游戏的网站),这个门户会有一个你的游戏需要支持的设备列表。所以,在很多情况下,如果你想通过门户发布你的游戏,你根本没有选择。

Mark:“游戏设计最重要的一个方面就是关卡设计。我们花了很多时间来调整关卡,使得每一关的难度都有很好的进展。所有影响游戏的参数都存储在设置文件中。然后,设计师可以修改这些设置文件,将这些文件的新版本推送到服务器,并立即使用新设置玩游戏。”

开发游戏

如果你想开发游戏,你需要知道如何编程,但你也需要知道解决编程问题的常用解决方案或方法。最重要的是,其中一些解决方案可能比其他解决方案更通用,一些解决方案可能比其他解决方案更有效。从这个意义上说,编程通常是在快速解决特定问题和花时间一次性解决一类问题之间的权衡。尤其是在游戏行业,由于紧迫的截止日期,通常很少有时间来解决各类问题。所以作为游戏行业的开发者,你需要非常仔细地考虑你选择的解决问题的方法。另一方面,编写好的、可重用的代码并不总是比编写快速而不可靠的代码花费更多的时间。随着您获得更多的编程经验,您会注意到您开始形成一种思维模式,这种思维模式可以让您快速判断某个编程问题需要哪种解决方案。让我们考虑决定解决方案的几个方面。

第三方库

许多游戏和应用依赖于不同开发人员编写的代码。这就是为什么当你写代码时,你要以这样一种方式来写,即代码是有逻辑的,并且易于其他开发者理解。通常,开发人员将相关代码分组到库中。例如,开发人员可以创建处理游戏中的物理的类,并在库中发布这些代码,以便在任何需要物理的游戏中使用。开发人员已经用许多不同的编程语言创建了许多库,包括 JavaScript。例如,jQuery 是一个众所周知的 JavaScript 库,用于在网站上创建界面。还有一些工具将库与开发环境相结合来创建完整的游戏,比如 Unity ( http://unity3d.com)有一个脚本引擎,它使用了一种非常类似于 JavaScript 的东西,叫做 UnityScript。另一个值得一看的游戏引擎是 Cocos2D ( www.cocos2d-x.org)。当你想开发一个商业游戏时,考虑使用这样的库或游戏引擎是一个好主意,因为它们允许你将游戏作为原生应用导出到各种平台。

Peter:“在 Rovio,我们的大多数游戏都是 iOS、Android 等系统的原生代码。我们确实有一个使用 WebGL 的 HTML5 版本的愤怒的小鸟,但我们暂时主要做原生移动应用开发。我们有自己多年来在内部开发的工具,所以我们可以非常容易地编写一次代码,然后将其部署到任何平台。对于一些项目,我们使用 Unity,这也使我们能够将代码部署到各种操作系统和设备上。”

Mark:“在很大程度上,我们开发了自己引擎,编写了自己的库。我们这样做是因为从代码中挤出最后一滴效率对我们来说非常重要。我们发现有许多设计精美、非常通用的库,正因为如此,它们很慢,很难适应我们的框架和工作方式。在少数情况下,我们会使用库,例如游戏物理。我们确实经常使用第三方开发的工具,如代码编辑器或混淆/缩小工具,如 Closure[有关闭包、混淆和缩小的更多信息,请参见第 31 章]

在本书中,您只使用了一个第三方库——Lab.js——您使用它来更容易地加载多个 JavaScript 文件。您可以选择使用更多的库,而不是从头开始编写所有代码。就本书而言,我的目标是教你 JavaScript 的重要编程习惯,以及它们如何应用于游戏编程。我选择最小化使用的库的数量,这样我可以保持代码简单明了,并且符合我在书中提出的游戏编程的一般方法。作为一名开发人员,您经常需要在使用他人编写的库和自己从头开始编程之间做出选择。如果这个库写得很好,并且做了一些你需要的事情,那么在你的游戏中使用它是很有意义的。你不必做所有的工作来编写别人已经写好的类。此外,如果一个库有很多用户,那么库代码中的主要错误可能已经被解决了。总而言之,如果你使用库,你的游戏代码可能会比你自己编程更健壮。最后,由于库通常是为通用目的而开发的,您可能会发现您合并的库解决了您刚刚在游戏中发现的问题,因此您可以简单地使用库中已经存在的额外功能。

在某些情况下,图书馆带来的麻烦比它们的价值更大。首先,库通常是在某种许可模式下发布的。如果您想在您的商业游戏中使用开源库,许可证可能不允许您出售包含该库的游戏代码。因此,使用库会限制您对代码的处理,因为并非所有代码都是您编写的。

Mark:“库的另一个问题是许可证并不总是明确定义的,特别是因为你是用 JavaScript 发布源代码。此外,最终我们喜欢将所有的 JavaScript 代码放在一个缩小且模糊的文件中,这一过程在使用第三方库时并不总是正确。”

如果你使用一个库,你可以避免写所有的代码,但是你依赖于库的限制。如果您事先没有适当地调查这个库是否真的能解决您的问题,您可能会花很大的力气将这个库集成到您的代码中,然后发现它实际上并没有做您需要它做的重要事情。还有,有时候从头开始写代码而不是使用库是个好主意,因为这样做会迫使你在深层次上理解问题;因此,您可能会找到对您的应用更有效的解决方案。最后,如果您从头开始编写所有代码,那么扩展或修改代码会更容易,因为是您编写的。

总的来说,作为一名开发者,你必须对游戏的哪些部分你想自己编程(这需要时间,但会让你更好地理解)以及哪些部分你想使用一个库(这能更快地给出结果,但可能并不完全符合你的需求)。

代码效率

JavaScript 程序可以在许多不同的设备上运行,从高端台式机到平板电脑和智能手机。这有时会限制可用的计算能力。因此,JavaScript 程序拥有高效的代码至关重要。这取决于程序员如何解决特定的编程问题。通常,有许多可能的解决方案。例如,考虑创建一个数组并用数字 0、1、2、3 等填充它的简单问题。有一种方法可以做到这一点:

var myArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};

您也可以使用一个for循环:

var myArray = {};
for (var i = 0; i < 20; i++)
    myArray.push(i);

这里还有另一个解决方案:

var myArray = {0};
while (myArray.length < 20)
    myArray.push(myArray.length);

这些解决方案都提供了一个大小为 20 的数组,包含数字 0-19。但是您选择哪种解决方案可能取决于上下文。第一种解决方案(写出数组)非常简单,通过查看代码,可以立即清楚地看到代码执行后数组的内容。对于较小的数组定义,这种方法非常有效。然而,如果您需要一个大小为 300 的数组,这是行不通的。第二种解决方案使用了一个for循环,在这种情况下更合适,因为改变数组的期望长度只需要改变for指令头中的一个数字。第三个解决方案使用了一个while循环来解决这个问题。它避免了声明一个计数器变量(i)。但是,这种解决方案可能不如第二种解决方案有效,因为在每次迭代中,必须检索两次数组的长度(一次在头中,一次在正文中)。

当你写代码时,总是预先考虑解决特定问题的各种解决方案,并选择最适合的一个。这不一定总是最有效的解决方案。如果一个解决方案效率稍低,但能产生更清晰的代码,那么选择那个解决方案可能是个好主意。有工具可以测量代码中的瓶颈。对于 Firefox,Firebug 工具有一个分析器,可以分析你的代码,让你知道哪里花了最多的时间。类似地,Chrome 的开发工具包括一个基准套件,可以分析 JavaScript 的性能。

能够为一个问题选择最佳解决方案需要了解在解释和执行代码时会发生什么。有时候低效率可能很容易解决,但是你不知道它们的存在。考虑下面的基本for指令,它将数组中的每个元素递增 1:

for (var i = 0; i < myArray.length; i++)
    myArray[i] += 1;

这条for指令很简单,但是效率不是很高。在循环的每次迭代中,检索数组的长度并与计数器进行比较。因为检索数组的长度需要时间,所以下面的for指令更有效:

for (var i = 0, l = myArray.length; i < l; i++)
    myArray[i] += 1;

在这种情况下,您检索数组的长度并将其存储在一个变量中。每次迭代都执行循环的条件,但是因为它现在使用变量而不是直接检索长度,所以代码更有效。

您可以进一步改进代码。递增计数器是通过以下指令完成的:

i++

让我们更详细地看看这条指令。可以按如下方式使用它:

var i = 10;
var j = i++;

尽管第二条指令看起来有点奇怪,但它是完全有效的 JavaScript 代码。这是因为i++也是一个表达式,所以它有一个结果可以存储在一个变量中。i++表达式的结果是在增加之前iT11 的值。结果,在第二条指令被执行后,j将包含值 10,而i将包含值 11。因此,i++需要创建一个临时变量来存储该值并返回。然而,在前面的for循环中,您不使用那个临时值。还有另一种增加变量的方法,如下所示:

++i

这与i++做的完全一样,除了它返回i的新值:

var i = 10;
var j = ++i; // j and i both contain the value 11

因为它返回新值,所以您不必存储旧值,从而消除了对临时变量的需要。您可以在for循环中利用这一点,使其更加有效:

for (var i = 0, l = myArray.length; i < l; ++i)
    myArray[i] += 1;

这些效率的提高看似微不足道,但如果对一个包含数千个粒子的阵列每秒执行 60 次for循环,那么效率的微小提高可能会决定一个流畅运行的游戏和一个不可玩的游戏,尤其是在计算能力有限的移动设备上。一些浏览器可能会在解释和运行 JavaScript 代码时进行优化,这种低效相对容易被自动检测到。但是,并非所有浏览器或版本都可以执行相同的优化。通过确保你的代码本身已经是高效的,你的游戏将在更多的平台上更流畅地运行。

Mark:“一般来说,图形是主要瓶颈。对于一些设备来说,把所有的东西都放在一个大的精灵中并画出来会更有效率。对于其他设备,这种方法没有帮助,因为瓶颈是绘制的像素数量。因此,我们并不总是知道瓶颈在哪里,因为瓶颈因设备、浏览器类型和版本、操作系统版本等而异。我们的观点是,我们需要尽可能高效地做每一件事。传统上,我们会使用一个分析器来找到瓶颈,然后尝试相应地优化代码。在 JavaScript 中,这是不可行的,因为有各种不同的设备和浏览器,更不用说对设备、浏览器和操作系统的某些组合使用分析器了。”

这本书里开发的游戏根本没有把重点放在效率上。还有很多可以改进的地方,尤其是在绘制图形的时候。目前,本书中的游戏在每次游戏循环迭代中都会重绘整个图像。在许多情况下,这是不必要的。屏幕的大部分不会改变,为什么要重画呢?HTML5 画布只允许你重画画布屏幕的一部分。如果你重写代码,使得屏幕的静态部分不被重绘,游戏会更有效率。例如,如果在数独游戏中玩家什么也没做,就没有必要重画任何东西。如果您使用动画效果,如闪光,只需重画显示该效果的屏幕部分。另一种提高游戏效率的方法是制作一个高分辨率版本和一个低分辨率版本。根据设备的功能,您可以自动选择应该使用哪个版本的游戏。

代码效率很重要,但不应该以代码清晰为代价。在许多情况下,效率没有编写清晰的代码重要。如果由于代码效率低下,按钮点击被延迟了百分之一秒,玩家不会注意到。另一方面,如果您决定将所有输入处理代码放在一个方法中以避免方法调用开销,您的代码将很难被其他人理解,包括未来的您。

马克:“在许多情况下,效率不是问题,但打嗝是问题。打嗝的一个重要原因是纹理交换。对于视频内存有限的设备,当游戏运行时,精灵将被交换进出内存,导致额外的计算。我们所做的就是将游戏中相同地方使用的精灵分组到一个精灵表中。例如,用于标题屏幕的子画面与用于级别选择屏幕的子画面放置在不同的子画面上。打嗝的另一个原因是垃圾收集(销毁不再使用的对象,释放内存)。不幸的是,没有办法控制垃圾收集何时发生。任何对象都属于垃圾收集的范畴。当你的游戏使用许多小物体如向量时,这就成了一个问题。在这种情况下,尽量减少创建新对象的数量,或者将 x 和 y 值传递给方法,而不是使用 vector 对象。

代码一致性

当你写代码时,另一件非常重要的事情是确保你的代码是连贯的。一致性可以在几个层面上实现。首先,一致性在代码的设计中很重要。例如,在本书的所有游戏中,我假设游戏循环做三件事:

  • 处理玩家输入
  • 更新游戏世界
  • 绘制游戏世界

这是我做出的代码设计决定,但是其他开发人员可能会做出不同的选择。例如,一些游戏引擎不区分处理玩家输入和更新游戏世界。其他游戏引擎将绘制视为高度独立的过程,不属于游戏对象类。重要的是,这样的设计决策在整个游戏中得到连贯的应用。如果处理输入和更新游戏世界应该是两个独立的过程,这应该在所有的类中都很明显。在代码设计中可以看到一致性的另一个例子是您处理只需要一个实例的对象的方式,例如游戏状态管理器或负责在画布上绘图的对象(Canvas2D)。对于所有这些对象,本书的例子虔诚地使用了 Singleton 设计模式。当你开始为自己的游戏编程时,明确地思考你所做的设计选择,并在编程时连贯地应用它们。

一致性在代码的结构层次上也很重要。每个游戏对象类对于每个游戏循环元素都有一个单独的方法。这些方法在每个类中都有完全相同的头,因此它们需要相同的参数。例如,在所有的游戏对象类中,update方法只有一个参数delta。如果你在类的结构上是一致的,那些类的用户就知道会发生什么。另一个例子是将通用类如GameObjectList(可用于许多不同的游戏)与游戏专用类如WaterDrop分开,将通用类放在一个名为powerupjs的名称空间中。同样,这有助于其他开发人员理解如何使用这些类以及它们属于哪里。

最后,代码应该在词法层次上是一致的。确保所有的方法都有相似的命名约定。一些开发人员喜欢方法和属性名称总是以大写字符开头。本书遵循的惯例是,变量、方法和属性名称以小写字符开头,而类名以大写字符开头。此外,任何不应该在类外直接访问的变量前面都有一个下划线字符。在您的代码中有这样的约定是一件好事。这使得你的代码更容易理解。本书遵循的另一个惯例是,在由多个单词组成的名称中,后面的每个单词都以大写字符开头:

function GameObjectList() {
    ...
}
GameObjectList.prototype.handleInput = function() {
    ...
};
var thisIsAVeryLongVariableName;

这种命名变量的方式在编程中很常见。有些人试图定义命名方案的标准,比如匈牙利符号。在匈牙利符号中,变量名也包含关于它们类型的信息。看看下面的例子:

var bIsAlive = true;

b字符告诉你这个变量是一个布尔变量。这可能是在变量名中编码的有用信息,因为 JavaScript 不要求程序员在声明变量时提供变量的类型。您可能会在其他开发人员编写的代码中遇到匈牙利符号,尽管现在它的使用越来越少,因为编译器和开发环境可以自动提供关于变量的各种信息,例如变量的范围、它所代表的类型等等。

Mark:“在 JavaScript 中,你可以用一百种不同的方式编写代码。所以,在你开始开发之前,想想你最终真正需要的是什么。如果你从一个错误的方法开始,你会因为那个选择而遇到很多问题。然而,做出正确的选择并不总是容易的。很多情况下,当你开始开发的时候,游戏的设计还没有完成。有时候你最终意识到,你需要游戏中的某种视觉效果,但代码中没有地方放它。”

制作游戏内容

如果你想让你的游戏好看,你需要好的游戏资源。表现出一致性的好游戏素材会让你的游戏对玩家更有吸引力。这不仅包括视觉效果,还包括音效和背景音乐。一般来说,声音和音乐被低估了,但它们是营造氛围的重要因素。看一部没有声音的电影比当你听到在情感上支持正在发生的事情的音乐和给角色正在做的事情赋予形体的声音效果时看电影要有趣得多。游戏也需要音乐和音效,就像电影一样。

首先,你可以购买预制的精灵包。这里有几个网站的例子,在那里你可以免费得到精灵,购买精灵,或者雇佣艺术家为你创造精灵:

  • www.supergameasset.com
  • www.graphic-buffet.com
  • www.hireanillustrator.com
  • http://opengameart.org
  • www.3dfoin.com
  • www.content-pack.com

就像精灵一样,你也可以为你的游戏购买音乐和音效。看看这些网站:

  • www.soundrangers.com
  • www.indiegamemusic.com
  • www.stereobot.com
  • http://audiojungle.net
  • www.arteriamusic.com
  • https://soundcloud.com

如果你已经用这些股票素材创建了一些游戏,你就可以更容易地与其他独立开发者建立联系。你开发的游戏将形成一个作品集,展示你作为游戏开发者的能力。

在游戏制作团队工作

当你和其他人一起玩游戏时,你需要有不同技能的人。一般一个游戏制作团队都有一个领导整体制作流程的项目经理,游戏设计师,关卡设计师,美工,音效师,测试员,当然还有程序员。有时一个人扮演多个角色。比如,项目经理也可以是首席游戏设计师。测试人员和程序员通常是同一批人。

彼得:“我们有许多艺术家、设计师、程序员、专家和问答测试员。有很多合作。现在很多人都参与了游戏制作。

当一家游戏公司发展壮大时,一个挑战就是寻找人才。此外,忠于你的创业根基也很重要,这样你才不会变成一个又大又慢的公司。试着在你的公司里保持敏捷,并把公司的等级制度保持在最低限度。就像他们说的,文化早餐吃策略。保持创业文化的活力,确保你能把事情做好。这适用于许多成长中的公司。挑战在于保持心态,让事情保持运转和敏捷。"

Mark:“因为我们是一个相当小的团队,项目经理也是我们的游戏设计师。有时这会导致问题。项目经理希望游戏按时完成,而设计师希望不断改进或改变游戏。在这种情况下,项目经理应该告诉设计师应该做这个游戏,如果两者是同一个人,这是很难做到的。”

你可能已经掌握了制作一个游戏所需的各种元素,但并不认为你可以自己做所有的事情。如果你是一名优秀的程序员,并不意味着你也是一名优秀的艺术家。而且,对你来说不幸的是,最初往往是视觉效果决定了一个人是否会尝试你的游戏。和一个艺术家组成一个团队是个好主意,也许还可以和一个游戏设计师和一个音频专家组成一个团队。试着和其他人联系,这样你们可以一起创作游戏。活跃在社交网络中,开自己的博客,在论坛上发帖,等等。你将成为一名独立开发者,所以去看看像www.indiegames.com这样的网站,了解其他独立开发者在做什么。活跃在像全球游戏堵塞(www.globalgamejam.org)这样的游戏堵塞中,结识其他开发者。看看 HTML5 开发者论坛,比如 HTML5 游戏开发者(www.html5gamedevs.com)或者 Web 开发者论坛(www.webdeveloper.com/forum/forum.php)。

如果你在一个游戏上和多个开发者一起工作,你需要找到一种方法来共享代码并一起工作。你可以使用版本管理工具,比如 Subversion ( http://subversion.apache.org)来实现。Subversion 的替代品有 Git ( http://git-scm.com)和 Mercurial ( http://mercurial.selenic.com)。网上也有类似的工具,结合版本管理工具提供云存储。这允许您处理代码并将其提交给服务器,之后其他开发人员可以检索代码并使用它。这种在线代码和版本管理工具的例子有 GitHub ( https://github.com)和 Bitbucket ( https://bitbucket.org)。

与其他开发人员合作时,你需要考虑的另一件事是记录你的代码。如果您在源文件中以某种格式编写文档,有工具可以自动读取该文档并创建 HTML 文件,以漂亮的布局显示它。这类工具的例子有 YUIDoc ( http://yui.github.io/yuidoc)和 Doxygen ( www.stack.nl/~dimitri/doxygen)。文档是非常有用的,但是并不是所有的游戏开发者都花时间正确地记录他们正在编写的代码。

Mark:“我们用合流( www.atlassian.com/software/confluence )来管理一个游戏制作项目。在这个工具中,我们存储了很多关于我们的框架以及如何使用它的信息。我们已经为我们内部的游戏引擎编写了适当的文档,但并不是真正为游戏本身编写的。我们的游戏一般都是单人开发,然后完成。我们确实为每个游戏编写了一份文档,全面描述了游戏代码的结构。”

最后,想想你如何组织你的团队。许多人忘记了这一点,只是开始一起工作,但这可能会很快导致问题,因为团队中人们的角色和期望是不同的。如果有人认为他们是主要的游戏设计者,而团队中的另一个人认为这个人对事业并不重要,这将对团队的合作产生影响。当你在做一个项目时,想想你为什么要这么做,并确保和你一起工作的其他人也同意你的观点。你团队中的一个成员可能想做一个有创意的声明,但另一个成员可能只是想赚很多钱。

彼得:“扁平的组织通常比深层次的结构运作得更好。非常重要的一点是,你要创造一个环境,让人们知道他们应该做什么,这样就有了明确的方向和领导。给人们提供有目的的工作是很重要的,不管你是在游戏中编码、做艺术品还是从事营销工作。”

马克:“如果你想创建一家游戏公司,在选择你想合作的人时要非常谨慎。如果你一开始就选错了人,你会因为不得不在过程中改变团队而浪费时间。在开始阶段花很多时间来找到合适的人。”