图书前言

前    言

欢迎来到《Android 4游戏高级编程(第2版)》。本书将帮助你创建精彩的Android游戏。有很多书籍都在解决这个问题,但是本书将以一个独特的视角向你展示如何轻而易举地将原生PC游戏移植到Android平台。每章都将使用真实的示例和源代码。记住在深入研究这本书之前,需要具备Java和ANSI C方面的坚实基础。我已尝试尽可能清晰、简洁并结合图形和示例代码来解释这些最复杂的概念。每一章提供的源代码都将帮助你详细地理解这些概念,作为手机游戏开发人员,它们还可以帮助你节省大量的时间。

绿色机器人已经腾飞

难以置信,Android进入智能手机市场仅两年时间就取得了如此成就。请看看美国智能手机平台市场份额,如图0-1所示。根据Nielsen的调查1,2011年5月,Android占据了美国36%的智能手机市场份额,这对于诞生仅仅两年的操作系统来说并不算太差,并且这个状态还将越来越好。Distimo是一家专注于应用程序商店分析的公司,它预测Android Market将在2011年8月超过苹果App Store2。这为希望利用飞速发展的智能手机市场的开发人员打开了一个新的领域。如果你渴望将尖端游戏运行和编译到Android平台,《Android 4游戏高级编程(第2版)》就正是你所需要的。

 

图0-1  智能手机市场份额(2011年4月,Nielsen)

本书的目标读者

本书的目标读者是经验丰富的游戏开发人员,不仅包括Java开发人员,还包括C开发人员。性能是游戏开发的关键。其他读者包括:

● 商业应用程序开发人员。如果你从事原生应用程序开发,那么本书将是十分有价值的工具。

● 科学开发人员。解决科学世界中的原始性能问题。第3章可以帮你实现目标。

● 学习新移动平台的计算机科学专业的学生。Android开放且相当容易移植,因此本书可以在很多平台上帮助学生,包括iPhone、BlackBerry和Meego。

● 任何对Android开发感兴趣的人。Android已经在手机市场空间中加快了发展的步伐。你需要扩展自身的技能,包括游戏和图形,否则将会被甩在后面。

学习本书大部分内容需要的技能

本书需要的技能包括C/C++和Java,以及一些基本的Linux shell脚本编程知识。Java提供了优雅的面向对象功能,但只有C能给予推进游戏开发所需要的力量。总而言之,你必须具备下面内容中描述的技能。

坚实的Android基础

本书假定你已经了解基本的Android开发,例如,你需要知道什么是Activity、视图和布局。如果你仅仅通过看下面的代码片段,就能理解它们的意思,那么你的基础还不错。

public class MainActivity extends Activity

{

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

}

该代码片段定义了应用程序的主Activity或是控制应用程序生命周期的类。当应用程序启动时,onCreate方法将被调用一次,其工作是为应用程序设置内容布局或GUI。

同时,你还需要对如何使用XML创建GUI有一个基本的了解。看看下面的代码片段,你能告诉我它做了些什么吗?

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<ImageView android:id="@+id/doom_iv"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@drawable/doom"

android:focusableInTouchMode="true" android:focusable="true"/>

<ImageButton android:id="@+id/btn_upleft"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_alignParentLeft="true"

android:src="@drawable/img1" />

</RelativeLayout>

它定义了一个相对布局。在相对布局中,组件彼此相对放置(有时重叠在一起)。在本例中,有一个图像视图填充着整个屏幕。该图像将作为背景,显示存储在项目res/drawable文件夹下名为doom.png的文件,并接收按键和触摸事件。在屏幕的左下方,重叠的ID为btn_upleft的图像按钮将被显示出来。

需要Android教程吗?

这里有许多与Android开发相关的概念,要记住关于Activity、视图和布局的每一个细节是不可能的。可以从下面的地址快速获取Android教程:http://developer.android.com/。

有关Android开发人员的终极指南——最新发布、下载、SDK快速入门、版本说明、原生开发工具、以前发布版本,可以在以下站点中找到:http://developer.android.com/sdk/

1.6_r1/index.html。

由于本书(特别是在处理原生代码的章节)频繁使用Android软件开发工具包(Software Development Kit,SDK)命令工具(系统管理员任务),因此你需要清楚地理解这些工具,尤其是Android调试桥(Android Debug Bridge,ADB)。你需要知道如何完成以下操作:

● 创建Android虚拟设备(Android Virtual Device,AVD)。AVD封装了详细的移动设备配置信息,如固件版本和SD卡路径。创建AVD非常简单,可以使用AVD Manager(可通过单击工具栏中的黑色手机图标来访问)在集成开发环境(Integrated Development Environment,IDE)中完成。

● 创建SD卡文件。在后面的章节中,有些游戏有大文件(5MB或更多)。为了节省空间,将所有的游戏文件存储在设备SD卡中,你需要知道如何创建SD卡。例如,在home路径下创建100MB大小的SD卡文件,命名为sdcard.iso,使用如下命令:

$ mksdcard 100M $HOME/sdcard.iso

● 连接到模拟器。这样做可以完成一些系统管理杂项,如库提取。打开设备shell,使用如下命令:

$ adb shell

● 将文件上传到模拟器和从模拟器导出文件。该任务对于将游戏文件存储到设备和从设备中提取出游戏文件非常有帮助。使用如下命令:

$ adb push <LOCAL_FILE> <DEVICE_FILE>

$ adb pull <DEVICE_FILE> <LOCAL_FILE>

注意:

在运行命令创建SD卡文件、连接模拟器或者上传和导出文件前,都要确保SDK_

HOME/tools路径已经被添加到系统变量PATH。

Linux与shell脚本编程的基础知识

对于处理混合游戏的章节,你将在Ubuntu Linux中完成工作,所以将重新使用这些老的UNIX技能。

你应该知道基本的shell命令,例如列举文件、安装软件组件(这可能非常棘手,需要根据Lunix发行的版本而定)以及基本的系统管理。

在本书中有一些非常简单的shell脚本,大致了解一下bash shell总是有帮助的。

提示:

如果你需要复习一下Linux和shell脚本,请参阅下面由Ashley J.S Mills编写的教程:http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/unixscripting/ unixscripting.html。

学习本书所需要的硬件/软件

为充分利用这本书,你将需要具备提到的以下工具。

已经正确安装Java SDK的Windows或Linux PC

我想这很容易理解,因为大多数Android开发都是由Java完成的。注意我提到的是Java SDK,而不是JRE。必须是SDK,因为后面的章节会大量使用JNI头文件和命令行工具。

已经正确安装Eclipse IDE和Android SDK

Eclipse几乎是Android开发的标准IDE。我使用Eclipse Galileo为本书的示例创建工作区。不过,Eclipse Ganymede应该也能正常工作。

需要IDEM?

尽管Eclipse Helios已被用于创建代码工作区,但是你仍可以使用自己喜欢的IDE。当然,这需要一点点额外的配置。你可以从www.eclipse.org/获取Eclipse。

对于如何为其他IDE(如IntelliJ或基本编辑器)设置Android SDK的说明,请参见

http://developer.android.com/guide/developing/other-ide.html。

要正确安装Android SDK,需要进行如下操作:

(1) 为Eclipse安装Android SDK插件:

● 在IDE主菜单中,单击Help菜单并选择Install New Software。

● 单击Add按钮,添加新的站点并输入名称Android SDK和地址https://dl-ssl.google.com/ android/eclipse/。单击OK按钮。

● 从Available Software对话框中选择Android SDK并按照向导的简易安装说明进行安装。

(2) 安装Android SDK,可以从前面提到的Android站点下载该工具。注意Eclipse必须知道Android SDK的位置。从IDE主菜单单击Window菜单并选择Preferences菜单项。在左边的导航菜单中,选择Android并输入SDK位置(如图0-2所示)。我使用的是SDK 3.1,因为它是编写本书时最新版本的SDK。不过,本书的代码已在SDK 2.3和3.1中测试通过(详细信息参见接下来的“SDK兼容性”部分)。

 

图0-2  Eclipse Galileo中的Android SDK配置对话框

原生开发工具包(NDK)

NDK是任何正式游戏开发人员必不可少的工具。它提供了编译器链、头文件以及将尖端游戏移植到移动平台所需的文档。使用NDK,开发人员可以逃离Java内存堆的束缚并激发他们在编译最强大的C/C++引擎时的创作力,因为这仅限于硬件能够提供哪些支持。在本书中,你将广泛地使用NDK,因此要充分理解每章中提出的概念,就需要具备坚实的C程序基础。

章节源代码

这是一个可选工具,但是它对你理解概念有着极大的帮助。我将尽可能简单地描述每个章节。然而,一些游戏(特别是Wolf 3D和Doom)使用了C编写的庞大核心引擎(Doom有近10万行代码),而且缺少注释难以理解。总而言之,你将看到如何轻而易举地将两种语言(Java和C)简单结合在一起。从www.apress.com站点可以获取本书的配套源代码,它们都使用最新的Eclipse SDK创建。

本书独特之处

我认为重要的是让读者理解本书的写作目标和独特之处。尽管Java是Android的主要开发语言,但Google已经意识到Android要想成为成功的游戏平台,就必须混合Java/C开发。因此,他们发布了原生开发工具包(NDK)。我认为Google支持C开发是明智的,否则会有大量的原生游戏将是为其他平台编写的,如iOS。

PC游戏已经经历了几十年的发展(大部分由C语言编写),只需要使用一个简单的ARM C编译器,就可以将成千上万的PC游戏移植到Android平台。这也正是本书的独特之处。为什么要将10万行令人头疼的复杂代码从C转换到Java?如果可以采用一种优雅的方式简单地结合这两种语言,那么在整个过程中将节省你大量时间和金钱。这是我的目标,也是为什么本书能从众多图书中脱颖而出的原因。虽然本书包含纯Java游戏章节,但同样也呈现了合理的布局以同时满足Java和C爱好者。

相对上一版本,本书有何变化

随着Android的不断更新,本书相对上一版本已经有大量内容被更新。这些改动如下:

● 更新到最新版本的Android SDK、原生开发工具包(NKD)和Eclipse IDE。

● 更加关注平板电脑。人们渴望更大的屏幕和更高的分辨率。平板电脑越来越多,我们必须注意不断变化的设备分辨率和硬件规格。

● 更加关注原生端。我认为可以公正地说,Java对于3D游戏开发人员已经没有吸引力,尤其是强大的游戏。Java的内存限制和性能匮乏则是罪魁祸首。因此,《Android 4游戏高级编程(第2版)》将更加注重原生游戏的开发和图形硬件加速。

● 更大更好的现实世界引擎。我的目的不是简单地提供一些开发游戏的技巧,而是提供更真实、强大的实例。本书将展示如何将优秀的游戏引擎几乎不做任何改动移植到你的移动设备上,如QuakeⅠ和QuakeⅡ,而且还包括上一版本中旧的内容——Doom。

Android SDK兼容性

作为开发人员,你可能很想知道本书代码的SDK兼容性。随着Android SDK新版本的频繁出现,这一问题显得十分重要。在编写本书时,Google刚发布了Android SDK 3.2版本。本书代码已在Android SDK 4.0版本和3.1版本上进行了充分测试。

底线是本书代码可以运行在任何版本的SDK中,这也是我一直以来的目标。

本书对强大的混合游戏有着很好的平衡布局,按章节划分如下:

第1章

本章提供了编译混合游戏的第一步,设置Linux系统,包括获取Android源代码、提取设备系统库、定制交叉编译工具链、定制编译脚本以及设置本书其余部分需要使用的IDE。

第2章

在本章,你将学到如何通过一种优雅的方式结合Java和C代码,以便在原生库的上层建立简单的Java应用程序。你将学习关于Java原生接口(Java Native Interface,JNI),以及结合Java和C所需要使用的API等,这都是一些令人兴奋的概念,包括如何加载原生库、如何使用原生关键字、如何生成JNI头文件,以及方法签名、Java数组与C数组、调用Java方法、编译和打包程序等内容。

第3章

本章讨论OpenGL的3D图形。其中展示了一种巧妙的方法,允许Java和C混合调用OpenGL API。Google提供的3D立方体实例对这一概念进行了很好的阐述,并展示了如何在纯Java和混合模式下使用OpenGL。该技巧将为Android的3D开发开辟新的领域,并可能将大量的3D PC游戏带到这个平台,同时还能节约开发成本和时间。

第4章

第4章采用OpenGL ES 2.0处理高效图形。本章首先对OpenGL ES 2所能提供的最重要特性进行了简短的描述,包括着色器、GLSL以及它们如何影响Android平台。然后,巧妙地通过一个Android项目对GLSL进行了更深入的了解,该项目使用OpenGL ES 2.0渲染一个二十面体。另外,还展示了如何使用单点和多点触摸函数来控制二十面体的旋转速度,以及通过“捏”操作实现放大和缩小。

第5章

第5章随着Doom将本书内容带入一个新的层次,Doom是PC游戏的一个里程碑,也是毫无争议的最伟大的3D游戏,它开辟了3D图形的新领域。本章最终的目的不是描述游戏本身,而是向你展示将诸如Doom这样复杂的PC游戏移植到Android平台是多么容易。如何才能证明呢?Doom有超过10万行的C代码,而把它移植到Android平台(包括创建移动UI的Java代码)却只需要不到200行的新增JNI API调用代码。本章向你展示不需要把10万行C代码转换为Java代码,而只需要在一个优雅的应用程序中结合这两种强大的语言。考虑到可能节省开发时间和成本,这将是必读的一章。

第6章

这是开始让我们真正感到兴奋的部分。第6章将为你带来第一人称射击游戏(First Person Shooter,FPS)的精品:Quake。你将学习如何轻而易举地将强大的PC引擎移植到Android平台。你可以保持原始C代码95%的完整性,额外添加的简易Java封装代码仅500到1000行。现在你可以在智能手机上玩Quake以展示荣耀。

第7章

本章在第6章的基础之上把QuakeⅡ引擎带到你的指尖。将向你介绍非常棒的名为NanoGL的工具,它允许开发人员将复杂的OpenGL立即绘制模式转换到OpenGL ES上,并保持原始代码的完整性。你还将学习如何创建定制音频和视频处理程序,以便让QuakeⅡ引擎能够在Android中正常工作,同时也证明了Java语言伟大的可重用特性。总而言之,本章将保持原始QuakeⅡ的C代码99%的完整性,并且不做任何改动地重用第6章中的轻量级Java封装。本章将向你展示如何对强大的工具简单地进行组合来驯服QuakeⅡ强大的OpenGL渲染器。