作者:Richard A. Rogers (本节内容选自《Learning Android Game Programming》这本书,主要分享针对Android设备开发游戏的基本原则和方法。) 创造优秀手机游戏不仅需要编写某些相当复杂的软件,还需要创造其他的成分,比如图像、动画、音效和音乐。幸运的是,这些成分都能够使用某些工具制作而成,而且许多工具可以免费使用。如果你能够上网并且拥有开发游戏的设备,那么你就可以获得所有所需的工具。 《Virgins Versus Vampires》(游戏邦注:以下简称V3)这款游戏使用Java编程语言编写而成,可在Android设备上的Dalvik虚拟机上运行。游戏使用的 是名为AndEngine的开源游戏引擎和Box2D物理引擎,这两者都已经移植到Android系统上。游戏及其所有的知识产权都是使用免费的软件开发 工具、图像工具和音频创造出来的,所有这些工具都将在本章节中进行说明。 需注意的是,我们正在编写的游戏是标准Android应用。它们以Dalvik/Java编写,可以完全使用Android API,它们拥有我们预想的Android应用所拥有的特征(游戏邦注:比如暂停和重新开始)。我们的游戏将会连接至AndEngine库,每个都会有供 游戏使用的Android应用程序包文件(游戏邦注:下文简称“apk”)中的库副本。 软件开发工具 我们需要软件开发工具来编写软件。幸运的是,有些绝妙的工具可以用来编写手机游戏等程序。更为幸运的是,许多此类工具可以免费下载和使用,即便我们是出于商业目的而开发游戏。 Android软件开发工具包(游戏邦注:下文简称“SDK”) 如果你对Android SDK还不熟悉,先别看下面的内容,花些时间来熟悉这个工具。可以先浏览http://developer.android.com/上的下载和安装说明。 Android SDK使用Eclipse来塑造集成开发环境(游戏邦注:下文简称“IDE”)和带有Oracle的Java开发工具包(游戏邦注:下文简称“JDK”) 的工具。Android网站上的安装说明会指导你如何安装Android SDK。你在本书中看到的范例和图像都是使用以下版本的组件构建而成的:Android SDK;Android SDK平台组件4.0;Android SDK工具,r14;用于Eclipse 14.0.0的ADT插件;Eclipse Helios;Oracle或Sun JDK(游戏邦注:即JDK6,也称为JDK 1.6)。 你可能使用的是比上述工具更新的版本,无需为此担心,范例代码与工具版本并无很大的关联。如果确实出现了问题,访问本书的合作网站 https://github.com/portmobile/LAGP-Example-Code,看看是否有针对较新版本发布的更新内容。在这本书编 写之时,当前Android版本为4.0,也就是Ice Cream Sandwich。 你还应当为自己计划支持的每种设备制作Android虚拟设备(游戏邦注:下文简称“AVD”),可以使用Android SDK和附属于SDK的AVD管理器。针对这本书中展示的范例,我们制作出很像HTC的EVO智能手机的AVD,相关数据如下: 名称:EVO 目标:Android 2.2(API等级8) 皮肤:HVGA SD卡:128M 加速计:有 LCD密度:160 音频输出:有 摄像头:无(游戏邦注:该版本模拟器不支持,而且游戏不需要摄像头) 电池:有。 你还应当浏览下SDK教程,熟悉下整个过程,包括:创建Android项目;编写代码;构建项目;于Android模拟器上运行项目;使用 Eclipse debugger、LogCat及SDK提供的其他工具来解决项目中的漏洞。如果你计划将游戏发布到Android Market上,你还需要确保它确实能够在真正的手机上良好运行,所以你还应当拥有在Android手机上加载和运行.apk文件的经验。 Android开发者站点上的指导文件很全面。如果你需要其他的指导或更多范例,还有许多优秀的Android编程书籍可供选择,包括由 Lauren Darcey和Shane Conder编写的《Sam’s Teach Yourself Android Application Development in 24 Hours》。 AndEngine游戏引擎库 AndEngine是个游戏引擎库,使得针对Android设备编写二维游戏更加容易。Nicolas Gramlich费尽心思创造了AndEngine,并编写了大量项目代码。它是开源项目,所以你可以前往项目网站加入AndEngine的开发计划。 当然,我们也可以用Java来自行编写例行程序,使用Android API来执行游戏各组件。然而,利用已经编写完成的游戏引擎有诸多好处: 1、我们可以使用其他人的工作成果。当然,如果我们真想这么做的话,也可以针对Android编写自己的IDE,但是除非我们需要某些特别功能,否则这完全是毫无意义的举动。 2、以AndEngine中使用的此类开源代码为基础,我们可以根据自己的需要来扩展引擎功能。如果扩展对其他人同样有用,我们可以将这些调整内容放回开源引擎库,助其他使用者改善引擎。 3、当我们遇到问题时,我们可以向使用相同技术的开发者社区寻求帮助。有可能其他人已经解决了我们所面临的问题,可以提供问题的解决方案。 4、我们可以借用许多开发者的最优化方案。游戏需要使用相当数量的计算资源来绘制图像、计算客观物理效果、演奏音效和掌握用户输入方式。如果使用游戏引擎,我们便可以使用已经得出的最优化方案。 其他针对Android的游戏引擎目前正在开发中,本书主要阐述使用AndEngine的方法。有关AndEngine的重要网站如下: 1、AndEngine源代码库:http://code.google.com/p/andengine/ 2、范例源代码库:http://code.google.com/p/andengineexamples/ 3、AndEngine社区论坛:http://www.andengine.org/forums/ 4、AndEngine维基页面:http://wiki.andengine.org/AndEngine 如果以上网站内容无效,只需要用浏览器搜索“AndEngine Android”,应当就可以找到当前可用的内容。 AndEngine是个.jar文件,也就是Java文档。在本章节随后的内容中,当我们开始进行游戏代码编写时,你就会知道如何配合使用这些文档 和你的Android SDK项目。该引擎采用GNU Lesser GPL License,你可以出于几乎所有合理的目标来使用源代码(当然要注意这里所涉及的授权问题)。 AndEngine游戏概念 我们之前提到的电影类比法是AndEngine的理想入门方法。你的游戏就像是电影,游戏引擎包含了类似于电影制作所涉内容的诸多概念。 镜头 游戏中的“镜头”决定了游戏呈现给玩家的景象。这很像二维空间中的电影镜头。镜头可以在场景中移动,改变所呈现的景象。镜头的移动既可以由玩家来控制,也可以由程序驱动。 场景 同电影一样,游戏也是由一系列发生动作的场景构成。在电影中,场景以固定的方式编辑拼接起来。在游戏中,场景呈现顺序由游戏过程决定。游戏就像是匆忙编辑完成的电影。 层次 场景由多个图像层次组成。各层次按一定顺序叠加,很像早期用来制作卡通的动画纸。层次还可以用来创造2.5D效果,随着镜头的移动,较近的层次移动得比较远层次快。 精灵 精灵指电影中表演者的视觉呈现,无论这些表演者是人还是物品。精灵可能是动画形式,也可能不是,但它们往往在游戏过程中随场景移动。精灵质感往往从由许多精灵图片组成的大图片加载而得。 实体 在AndEngine中,实体指所有屏幕上绘制的东西。精灵是实体,显示在屏幕上的瓦片、集合形状和线条都是实体。所有的实体都拥有可以用调节器来改变的资产,比如颜色、角度、范围和位置。 调节器 调节器可以改变实体的资产,在AndEngine中它们有强大的力量。它们可以用在任何实体上,它们造成的改变既可以马上呈现也可以在规定的间隔时间内逐渐呈现。在我们的游戏中,我们频繁使用调节器来创造精灵和其他实体的效果。 纹理 2D纹理,我们通常可以利用位图图像赋予物体纹理。纹理决定实体的视觉效果,许多OpenGL图像环境是围绕纹理的使用构建而成。 纹理区域 纹理定义完整的位图图像,纹理区域定义的是区域子集。随后我们会频繁提及2D图像表现最优化,而使用纹理区域来绘制大型组合型位图中的小区域是执行这些最优化方案的关键技巧。 引擎 场景运行通过引擎来是实现。它负责让动画和调节器知道何时更新呈现的图像,协调绘图,处理用户输入事件(游戏邦注:如触点、按键和传感器事件),通常还管理游戏的进程。引擎很像是电影的制作人或导演,告诉所有人应尽的职责。 BaseGameActivity 这个类扩展了Android Activity类,将是我们所设计游戏中所有场景的基础。BaseGameActivity负责所有场景都需要做的事情,设立游戏引擎,满足 Android Activity Lifecycle要求并使传感器可用。我们将在第3章中更深入地探讨这个类。 物理连接器 AndEngine的基础引擎中包含了基本物理能力,但Box2D物理引擎大幅扩展了这些能力。我们通过物理连接器将AndEngine物体同Box2D连接起来。如果你的游戏不使用Box2D物理引擎,那么你就无需有物理连接器。 Box2D物理引擎 AndEngine包含了Box2D物理引擎的开源JBox2D端口。它可以用来逼真地模拟物理物体的以下互动形式:刚体的物理效果;稳定的物体堆积;重力效果;自定义单位;碰撞和接触;滑动摩擦;正方形、圆形和多边形;多种连接类型;睡眠状态。 图像工具
任何电子游戏的开发都离不开大量的图像元素。我们需要绘制背景,还需要制作某些精灵的动画。许多工具可以用来管理电脑图像,专业化工具也相当高端精 良。如果你是个图像设计师,而且知道如何使用Adobe Illustrator或其他专业工具,你可以无需阅读这个部分的内容。 相反,如果你跟我一样,缺乏足够的图像制作经验或才能,而且开发资金较少,那么可以看看这个部分的内容。本部分将主要描述我为V3这款游戏创作图像的工具(游戏邦注:下文所阐述的工具多数是免费的)。这些工具都很不错,广被专业人士所用。 你可能会试图直接从网络上获取游戏图像。如果你这么做的话,就要确保你拥有使用这些图像的权利,你可以下载图像并不等同于你有权利使用图像。如果你计划靠该游戏盈利,那么“商业化”使用其他人的图像将带来很棘手的问题。 你或许也知道,绘制图片的图像程序分为两大类别:可于用来绘制和控制图像化物体的程序(游戏邦注:也称为“绘图程序”),以及可以在画布上创建颜色位图的程序(游戏邦注:也称为“上色程序”)。每种类别都有自己的用途,两种程序在V3的创作中都会用到。 矢量图像:Inkscape 我发现用矢量图像来绘画很方便,主要有以下两个原因: 1、图画中的每个组件都被视为一个物体。在你创作最终图画时,物体可以被独自移位、缩放、旋转和编辑。 2、组件和整个图画可以在不影响分辨率的前提下轻易缩放。这种能力对精灵来说特别重要,因为其最终形态通常很小。缩放矢量图像也可能遇到问题,所以你在绘制组件时应当尽可能贴近其最终版本的大小,但在必要的时候可以灵活地缩放总是件很棒的事情。 Inkscape(游戏邦注:网址为http://www.inkscape.org/)是个非常流行的矢量绘图程序包。 许多Linux系统中会自带这个软件,它也可以在各版本Windows和Mac OS X系统中运行。其下载安装包中包含大量的“帮助”内容和教程。如果你已经精于图像制作,那么很快便可以熟练使用这个工具。如果你跟我差不多,在图像制作方 面缺乏经验和才能,可能需要花长一点的时间来熟悉这个工具,但比起学习Adobe Illustrator来说依然要快得多。而且,这个工具是免费的。图2.1显示Inkscape打开一张蝙蝠图片的效果。 基础AndEngine游戏引擎难以呈现矢量图像,但是我们可以开发能够实现上述目标的扩展。在V3中,我的做法是使用Inkscape来创作图 像,将它们编辑入核心内容中,缩放至合适的像素,保存成矢量版本(即.svg),以.png(即便携式网络图形)文件格式导出,如果必要的话,使用 GIMP来制作透明背景。得到的位图图片(仍是.png格式)就是基础AndEngine能够识别的图片文件。 位图图像:GIMP GIMP(游戏邦注:即GNU图像操作程序,网址为http://www.gimp.org/)是个使用者遍布全球的跨平台位图涂色程序。多数 Linux系统自带该工具,该工具也是免费的。GIMP小组本身并不为Windows和Mac OS X提供支持,但现在已经出现了能够在这两个操作系统中运行的可下载版本。 图2.2显示的是与图2.1相同的蝙蝠图片。这里的蝙蝠图片以位图的形式呈现(在Inkscape中将矢量绘图保存为.png文件便可以得到)。正 如你所看到的那样,结果显示图片在此等大小下更具颗粒感,带有透明的背景,这正是我们制作精灵动画手绘所需的东西。在我们呈现精灵的时候,背景将通过透明 区域展示出来。 动画捕捉:AnimGet 生成动画是个乏味且颇耗时间的工作。你需要为游戏中用到的每个动画手绘、每个角度和每个姿态创作绘图。 制作3D动画是个捷径,目前可使用的3D工具很多(游戏邦注:Blender是个被设计师广泛使用的开源工具,3Ds Max、Poser和Maya也是较为流行的商业化工具)。随后,你可以根据自己需要的视角来播放2D动画。你最终会得到AVI或动画GIF文件,随后你 需要将其分解成独立的帧(这样才能将它们重新整合进精灵层中)。Michael Menne创造了称为“AnimGet”的工具,可以为你完成分解工作。该工具可以在网络上的许多地方下载到(用Google搜索“AnimGet”即 可),它只能在Windows系统下运行。 AnimGet背后的概念是很精巧的。该工具的原理并不复杂,只是监视你屏幕上的某个固定区域。它先复制下最初像素,然后每10毫秒查看1次。如果 该区域内的像素发生改变,AnimGet会复制下该区域的新状态,以新文件的形式保存。整个过程在内存中完成,所需时间并不长,但是你需要细心地选择工具 查看的区域,这样它就只会关注你感兴趣位置的动画。当你告诉AnimGet停止捕捉动画时,之前复制的图片会以独立文件的形式保存。 |