一、欢迎来到安卓游戏

我在 2008 年初开始在测试平台上开发 Android。当时,还没有发布新操作系统的手机,我们开发者真的感觉好像我们正处于一个激动人心的开端。Android 抓住了早期开源开发的所有能量和激情。为该平台开发很容易让人想起凌晨两点坐在空荡荡的学生休息室里,喝着 Jolt 可乐,等待 VAX 时间运行我们的最新代码。这是一个激动人心的平台,我很高兴我在那里看到了它。

随着 Android 开始成长,谷歌发布了更多更新来巩固最终的架构,有一件事变得很明显:Android 基于 Java,包括许多众所周知的 Java 包,对于休闲游戏开发者来说是一个容易的过渡。Java 开发人员已经掌握的大部分知识都可以在这个新平台上重复利用。大量的 Java 游戏开发者可以利用这些知识相当顺利地迁移到 Android 平台上。

那么一个 Java 开发者如何开始在 Android 上开发游戏,需要哪些工具呢?本章旨在回答这些问题以及更多问题。在这里,你将学习如何把你的游戏故事分成可以完全作为你游戏的一部分实现的大块。在以后的章节中,我们将探讨执行这些任务所需的一些基本工具

这一章非常重要,因为它给了你一些其他游戏书籍所没有的东西——对游戏起源的真正关注。虽然知道如何编写能让游戏栩栩如生的代码是非常重要的,但是如果你没有一个能让游戏栩栩如生的代码,伟大的代码也没有用。知道如何以一种清晰明了的方式将你游戏的想法从你的头脑中清除出去,这将决定一款好游戏和一款玩家爱不释手的游戏的区别。

编程安卓游戏

在 Android 上开发游戏有其利弊,你应该在开始之前了解这一点。第一,Android 游戏是用 Java 开发的,但是 Android 并不是一个完整的 Java 实现。Android 软件开发工具包(SDK)中包含了许多您可能已经用于 OpenGL 和其他图形修饰的包。“许多”并不意味着“全部”,一些对游戏开发者,尤其是 3d 游戏开发者非常有用的软件包并不包括在内。并不是每个你以前用来制作游戏的包都可以在 Android 中使用。

随着新 Android SDK 的每个版本,越来越多的包变得可用,旧的包可能会被弃用。你需要知道你必须使用哪些包,我们将在本章中讨论这些。

另一个优点是 Android 的熟悉度,缺点是它的动力不足。Android 可能在编程的熟悉性和易用性方面有所贡献,但在速度和功能方面有所欠缺。大多数视频游戏,就像那些为个人电脑或游戏机编写的游戏一样,都是用 C 语言甚至汇编语言等低级语言开发的。这使得开发人员能够最大程度地控制处理器如何执行代码以及代码运行的环境。处理器运行非常低级的代码,你越接近处理器的母语,你需要跳过的解释器就越少。Android 虽然提供了一些有限的底层编码能力,但它通过自己的执行系统解释和线程化 Java 代码。这使得开发者对游戏运行环境的控制更少。

这本书不会带你经历游戏开发的低级方法。为什么呢?因为 Java,尤其是为一般 Android 开发而呈现的 Java,广为人知,易于使用,并且可以创建一些非常有趣、有益的游戏。

本质上,如果你已经是一个经验丰富的 Java 开发人员,你会发现你的技能在应用到 Android 上时并没有在翻译中丢失。如果您还不是经验丰富的 Java 开发人员,不要害怕。Java 是一种很好的开始学习的语言。出于这个原因,我选择坚持使用 Android 的原生 Java 开发环境来编写我们的游戏。

我们已经讨论了在 Android 上开发游戏的利弊。然而,对于独立和休闲游戏开发者来说,在 Android 平台上创作和发布游戏的最大好处之一就是你可以自由发布你的游戏。虽然一些在线应用商店对可以卖什么和卖多少有非常严格的规定,但 Android Market 没有。任何人都可以自由列出和出售他们想要的任何东西。这为开发人员提供了更大的创作自由。

在第二章中,你将创建你的第一个基于 Android 的游戏,尽管非常简单。然而,首先重要的是看看幕后是什么激发了任何有价值的游戏,即故事

从一个好故事开始

每一个游戏,从最简单的街机游戏到最复杂的角色扮演游戏(RPG),都是从一个故事开始的。这个故事不需要超过一句话,就像这样:想象一下,如果我们有一艘巨大的宇宙飞船可以拍摄东西。

然而,故事可以像一本书那么长,描述游戏环境中的每一片土地、人和动物。它甚至可以描述每一件武器、挑战和成就。

注:故事概述了一个游戏的动作、目的、流程。你能放入的细节越多,你开发代码的工作就越容易。

看看图 1–1中的游戏,它告诉你什么?这是来自星际战斗机的截图;你将通过本书开始的章节开发的游戏。这个游戏背后也有一个故事。

images

图 1–1。星际战士截屏

我们中的大多数人从来没有机会去阅读那些帮助创造了我们最喜欢的游戏的故事,因为这些故事只对创造游戏的人来说是重要的。假设开发者和创造者做好他们的工作,玩家会在玩游戏时吸收故事。

在小型的独立开发团队中,除了首席开发人员之外,任何人都不会阅读这些故事。在较大的游戏开发公司中,在故事最终落入首席开发人员手中之前,它可能会被许多设计师、作家和工程师传递和处理。

每个人都有不同的方式来编写和处理他们想要制作的游戏的故事。处理一个游戏的故事没有对错之分,只是说在你开始写任何代码之前它需要存在。下一节将解释为什么这个故事如此重要。

为什么故事很重要

诚然,在电子游戏的早期,故事可能没有像现在这样重要。推销一款不需要深入了解其目的就能提供快速享受的游戏要容易得多。

现在肯定不是这样了。无论是玩《愤怒的小鸟》还是《T2》和《魔兽世界》,人们都希望游戏有一个明确的目的。这种期望甚至可能是下意识的,但你的游戏需要吸引玩家,让他们想继续玩下去。这个钩子是故事的驱动目的。

游戏背后的故事很重要,有几个不同的原因。让我们来看看,在你开始为你的游戏写任何代码之前,为什么你要花时间去开发你的故事。

游戏背后的故事之所以重要的第一个原因是,在你开始编码之前,它给了你一个从头到尾充分认识你的游戏的机会。无论你以什么为生,无论你是全职游戏开发人员还是仅仅作为业余爱好,你的时间都是有价值的。

对于全职游戏开发者来说,你花在编码和开发游戏上的每一个小时都有一个绝对的价值。如果你在业余时间开发独立的游戏,你的时间可以用你本来可以做的事情来衡量:钓鱼,和别人在一起,等等。不管你怎么看,你的时间都有明确具体的价值,你花在游戏编码上的时间越多,花费就越多。

如果在你开始写代码之前,你的游戏还没有完全实现,你将不可避免地遇到问题,迫使你回去调整或者完全重写已经完成的代码。这将耗费你的时间、金钱或理智。

注:一个想法要完全实现,必须是完整的。这个想法的每个方面都经过了深思熟虑。

作为一名游戏开发者,你最不希望的事情就是被迫回去修改已经完成甚至可能已经测试过的代码。理想情况下,你的代码应该具有足够的可扩展性,这样你就可以毫不费力地操作它——特别是如果你想在游戏中添加关卡或 bosses 的话。然而,你可能不得不重新编码一些相对次要的东西,比如一个角色或环境的名字,或者你可能不得不改变一些更激烈的东西。例如,也许你意识到你从来没有给你的主角完成游戏所需的武器,因为当你开始建造它时,你不知道它将如何结束。

为你的游戏设计一个完整的故事情节会给你一个线性地图,让你在编写代码时有所遵循。像这样描绘出你的游戏和它的细节将会使你避免许多问题,这些问题可能会使你重新编码你游戏中已经完成的部分。这就引出了下一个原因,为什么在开始编码之前你应该有一个故事。

你的游戏所基于的故事也将作为你写代码的参考材料。无论你是需要回顾一个角色或一群恶棍的名字的正确拼写,还是需要回忆一条城市街道的布局,你都可以从你的。

如果多人一起玩这个游戏,能够参考故事的细节是非常关键的。这个故事可能有你没有写的部分。如果您正在编写引用其中一个部分的代码,那么完全实现的故事文档对您来说是一份无价的参考资料。

让一个故事发展到这种规模和重要性意味着许多人可以参考相同的来源,他们都将得到相同的需要做什么的图片。如果你有多人在一个协作的环境中一起工作,每个人都朝着同一个方向前进是很关键的。如果每个人都开始编写他们认为游戏应该是什么样的代码,每个人都会编写不同的代码。一个写得好的故事,一个可以被每个游戏开发者参考的故事,将有助于保持团队朝着同一个目标前进。

但是,你如何把这个故事从你的脑海中抹去,并准备好供你自己或他人参考呢?这个问题将在下一节回答。

书写你的故事

写出你的故事没有窍门。只要你觉得有必要,你可以是复杂的,也可以是简单的。任何东西,从你电脑旁边便笺簿上的几个简短句子到格式良好的 Microsoft Word 文档中的几页,都足够了。重点是不要试图把这个故事出版成书;相反,你只需要把故事从你的头脑中拿出来,变成一种清晰的格式,可以参考,希望不要改变。

故事在你脑海中停留的时间越长,你就有越多的时间来改变细节。当你改变故事中的任何细节时,你就冒着重写代码的风险(我们已经讨论过这样做的危险)。因此,即使你是一个人,随意发展的机器,你认为没有必要只为你写一个故事,再想想。写下这个故事可以确保你不会忘记或不小心改变任何细节。

毫无疑问,一旦你学会了这本书里的技巧,你心里就会有一个想开发的游戏。然而,你可能从来没有真正考虑过这个游戏的故事是什么。想一想这个故事。

提示:如果你已经有了主意,现在就花点时间写下你的游戏草稿。当你完成后,把它和后面的模拟故事进行比较。

让我们看一个可以用来开发游戏的故事的简单例子。

约翰·布莱克从当地的扣押处偷了一辆速度稍快但性能强劲的汽车。坏人很快就追上了他。现在,他必须带着钱逃出维利安斯堡,躲避警察,并击退偷钱的贺刚。这伙人的车更快,但对约翰来说幸运的是,他可以一边开枪一边开车。希望安全屋的灯还亮着。

在这个简短的故事中,即使没有多少细节,你仍然有足够的时间让一个业余开发人员开始开发一个相当简单的游戏。你能从这一段中得到什么?

从这个小故事中想到的第一个概念是一个自上而下的街机风格的驾驶游戏;想当初间谍猎人。司机或汽车可能有枪向敌人的车辆开火。当玩家到达城镇的边缘,或者可能是一个安全的房子或某种车库时,游戏可能会结束。

这个简短的故事甚至有足够的细节让游戏玩起来更有乐趣。主角有名字,约翰·布莱克。有两组敌人需要避开:警察和黑帮。这个环境由 Villiansburg 的街道组成,大多数敌人的车辆行驶速度比主角的快。这里绝对有足够的好素材来制作一个快速、休闲的游戏。

你大脑中的隐喻之轮应该已经在为这个游戏出主意了。在这短短的一段中,描述了相当多的好的街机风格的动作。如果你能像这样用一小段话描述你想要制作的游戏,而不是作为一个普通的开发者,你就已经在制作一个相当有趣的游戏的路上了。

一小段话可能足以构成一个相当有说服力的休闲游戏,想象一下一个更长的故事能提供什么。你现在能在你的故事中加入的细节越多,你的工作就越容易,你的游戏就越好。

花一些额外的时间在你的故事上,让细节恰到好处。当然,像本节中这样的一小段就足够了,但是更多的细节肯定会对你的编码有所帮助。读完这个故事后,你应该问自己以下几个问题:

  • 约翰偷了什么车,开什么车?
  • 他为什么偷钱?
  • 他有什么样的武器?
  • 车上有什么武器吗?
  • vvillainburg 是城市环境还是乡村环境?
  • 最后有没有 boss 战?
  • 得分是如何累计的,如果有的话?

如果我们回过头来回答其中的一些问题,故事可能会是这样的。

约翰·布莱克被诬陷为莫须有的罪行,他抓住机会报复陷害他的那帮人。他截获了 800 万美元,这笔钱正准备汇给坏男孩的头头“大老板”。他知道自己无法徒步逃脱,所以他从当地拘留所偷了一辆速度稍快但结实的黑色轿车。

这辆车什么都有:双架机枪、浮油和迷你导弹。

坏人很快就追上了他。现在,他必须带着钱走出拥挤的维利安斯堡的街道。街道两旁是破旧的用木板封起来的建筑。约翰开得越快,活着出来的机会就越大。他所要做的就是避开警察,击退偷钱的贺刚。

这伙人的车可能更快,但对约翰来说幸运的是,他可以一边开枪一边开车。当“大老板”开着他重新服役的美国陆军坦克在城镇边缘追上他时,他将需要这些技能。

如果约翰能打败“大老板”,他将保留这笔钱,但如果他在途中被击中,“大老板”的追随者将带走他们能逃脱的一切,直到约翰一无所有。约翰最好小心点,因为“大老板”的党羽会倾尽所有向他发起攻击:跑车、摩托车、机关枪,甚至直升机。

希望安全屋的灯还亮着。

现在,让我们再来看看这个故事。我们现在有更多的东西要继续,很明显,更详细的故事会让游戏变得更有趣。任何编码这个游戏的人现在都能够辨别出下面的游戏细节。

  • 主角的车是一辆黑色轿车。
  • 车上有两挺机枪、导弹和浮油作为武器。
  • 环境是拥挤的城市街道,街道两旁是破旧的用木板封起来的建筑。
  • 玩家将从$8,000,000 (8,000,000 点)开始。
  • 如果敌人抓住或击中玩家,玩家将会损失金钱(点数)。
  • 敌人的交通工具将是跑车、摩托车和直升机。
  • 城市的尽头是一场 boss 对战坦克的战斗。
  • 当游戏没有钱(点数)时,游戏结束。

正如您所看到的,需要做什么的画面要清晰得多。这场比赛不会有混乱。这就是为什么把尽可能多的细节放入你的游戏所基于的故事中是很重要的。你肯定会从你开始编码前投入的所有时间中受益。

既然我们已经解决了你可能想要在 Android 平台上开发游戏的一些原因,并回顾了让你的游戏变得重要背后的哲学,那么让我们看看我将采取的方法以及成为一名成功的 Android 游戏开发者需要哪些工具。这些将作为其余章节中所有项目的基础。

你将要走的路

在这本书里,你将学习二维和三维开发。如果你从这本书的开头开始,并通过基本的例子来工作,一边做一边构建 2d 游戏的例子,那么关于 3D 图形的章节应该更容易理解。相反,如果你试图直接跳到 3d 开发的章节,并且你不是一个经验丰富的 OpenGL 开发者,你可能很难理解正在发生的事情。

如同任何课程、班级或学习路径一样,从头到尾遵循这本书对你会有最好的帮助。然而,如果你发现一些早期的例子对你的经验水平来说太基础了,请随意在章节之间移动。

收集您的 Android 开发工具

在这一点上,你可能渴望投入到开发你的 Android 游戏中。那么你需要什么工具来开始你的旅程呢?

首先,您需要一个良好的、功能全面的集成开发环境(IDE)。我用 Eclipse Indigo 编写了我所有的 Android 代码(这是免费下载的)。本书中的所有例子都将使用 Eclipse 呈现。虽然您可以使用几乎任何 Java IDE 或文本编辑器来编写 Android 代码,但我更喜欢 Eclipse,因为它有精心制作的插件,这些插件紧密集成了许多编译和调试 Android 代码的更繁琐的手动操作。

如果您还没有 Eclipse,并且想尝试一下,可以从 Eclipse.org 网站(http://eclipse.org)免费下载,如图 1–2 所示:

images

图 1–2。Eclipse.orgT3

这本书不会深入 Eclipse 的下载或安装。有许多资源,包括 Eclipse 自己的站点和 Android 开发人员论坛上的资源,可以在您需要帮助时帮助您设置环境。

提示:如果您从未安装过 Eclipse 或类似的 IDE,请仔细遵循安装说明。你最不希望的就是一个错误安装的 IDE 阻碍了你编写优秀游戏的能力。

你还需要最新的 Android SDK。与所有 Android SDKs 一样,最新版本可以在 Android 开发者网站([http://developer.android.com/sdk/index.html](http://developer.android.com/sdk/index.html))找到,如图图 1–3所示:

images

图 1–3。 安卓开发者网站

与 IDE 一样,如果您需要帮助,许多资源可以帮助您下载和安装 SDK(以及您可能需要的相应 Java 组件)。

最后,你至少应该对开发有一个基本的了解,特别是 Java。虽然我尽力解释了在为这本书创建代码时使用的许多概念和实践,但我无法解释更基本的开发概念。简而言之,如果您是新手,我的解释应该足以让您理解本书中的代码,但是更高级的 Java 开发人员将能够很容易地采用我的示例并对其进行扩展。

安装 OpenGL ES

可以说,您将使用的最重要的项目之一是 OpenGL ES,这是由 Silicon Graphics 在 1992 年开发的用于计算机辅助设计(CAD)的图形库。从那时起,它就由 Khronos Group 管理,可以在大多数平台上找到。对于任何想创作游戏的人来说,这是一个非常强大和无价的工具。

注:值得一提的是,Android 提供并支持的 OpenGL 版本实际上是 OpenGL ES(嵌入式系统的 OpenGL)。OpenGL ES 不像标准 OpenGL 那样功能齐全。但是,它仍然是在 Android 上进行开发的优秀工具。在本书中,为了便于讨论,我将把 OpenGL ES 函数和库称为 OpenGL;请注意,我们实际上使用的是 OpenGL ES

当大多数人想到 OpenGL 时,首先想到的是 3d 图形。的确,OpenGL 非常擅长渲染 3d 图形,可以用来制作一些令人信服的 3d 游戏。然而 OpenGL 也非常擅长渲染二维图形。事实上,OpenGL 可以比原生 Android 调用更快地渲染和操作二维图形。对于大多数应用开发者来说,原生 Android 调用已经足够好了,但是对于需要尽可能多的优化的游戏来说,OpenGL 是最好的选择。

对于那些可能没有太多 OpenGL 经验的人来说,不用担心。在处理繁重的 OpenGL 图形渲染的章节中,我会尽我所能完整地解释你需要做的每一个调用。所以,如果下面的 OpenGL 代码对你来说看起来像外语,也不用担心;这本书的结尾会说得通:

gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluOrtho2D(gl, 0.0f, 0.0f, (float)width,(float)height);

OpenGL 是你在本书中使用和学习的完美工具,因为它是一个跨平台的开发库。也就是说,您可以在许多环境和学科中使用 OpenGL 和您在这里学到的 OpenGL 知识。从 iPad 和 iPhone 到 Microsoft Windows 和 Linux,许多相同的 OpenGL 调用可以跨所有这些系统使用。

在本书中,使用 OpenGL 制作二维游戏图形还有一个额外的好处。

对于所有的意图和目的来说,OpenGL 并不关心你使用的是二维还是三维图形。许多相同的呼叫用于两者。唯一的区别是 OpenGL 在绘制到屏幕上时如何渲染多边形。也就是说,使用 OpenGL,你从二维图形到三维图形的转换会更加平滑和容易。请记住,这本书并不打算成为 OpenGL ES 的完整桌面参考,也不会向您展示复杂的矩阵数学和其他优化技巧,否则您会在专业游戏中使用。事实是,作为一个休闲游戏开发者,为 matrix math 之类的东西提供的 OpenGL 方法虽然有一些开销,但对于学习本书的课程来说已经足够好了。

在本书中,您将使用 OpenGL ES 1.0。Android 用户可以使用三个版本的 OpenGL:OpenGL ES 1.0、1.1 和 2.0。为什么要用 1.0 版本?首先,互联网上已经有很多关于 OpenGL ES 1.0 的参考资料。因此,如果你遇到困难,或者想扩大知识面,你会有很多地方可以求助。第二,屡试不爽。作为最古老的 OpenGL ES 平台,它将适用于大多数设备,并将经过广泛的测试。最后,它非常容易掌握和学习。同样,在你已经知道 1.0 之后,再去学 1.1 甚至 2.0 会容易得多。

选择安卓版本

为 Android 开发的吸引力之一是它在许多不同的设备上广泛使用,如手机、平板电脑和 MP3 播放器。你开发的游戏有机会运行一打不同的手机,桌子,甚至电子阅读器。从不同的无线运营商到不同的制造商,你的游戏可以获得的硬件暴露是相当不同的。

不幸的是,这种无处不在的情况也可能成为你需要跨越的一个艰难的障碍。在任何时候,都可能有多达 12 个不同版本的 Android 在几十种不同的硬件上运行。最新的平板电脑和手机将运行版本 2.3.3、3.0、3.1 或 4.0,这是在最强大的设备上运行的最新版本。因此,这些将是我们在本书中要针对的版本。

注意:如果您没有 Android 设备进行测试,您可以使用 PC 模拟器。然而,我强烈建议您尝试使用实际的 Android 手机或平板电脑来测试您的代码。在我的测试中,我注意到在模拟器上运行我的代码与在我的手机或平板电脑上运行时有一些细微的差异。

最重要的是,在创作游戏的过程中享受乐趣。游戏毕竟是好玩的,做游戏你也要乐在其中!

总结

在这一章中,我们讨论了你应该期望从本书中得到什么。你学到了故事对于游戏创作的重要性,以及如何坚持故事可以帮助你创作出更好的代码。您还了解了在 Android 平台上创建游戏的过程、Android 的版本以及 Android 的开发环境。最后,您发现了在 Android 平台上创建游戏的关键——OpenGL ES,并且我们讨论了一些关于 Android 版本发布的相关细节。