Java游戏高级编程序

付出的代价换来的一点点智慧,抵得上别人教的几倍。

本杰明?富兰克林

这本书的目标读者是Java程序员,他们希望使用最新的高性能技术为Web和桌面创建复杂的2D计算机游戏。本书一步步介绍了一个可复用的动画库,每一章都依赖于前面的章节。在需要解释这些主题的地方,详细介绍了每个新库类的源代码,并给出了使用这些类的示例游戏。免费许可证允许您直接修改和调整库代码和示例游戏,并开发自己的游戏程序。

目的

这本书也可以命名为《现代Java游戏编程》。以前出版的Java游戏编程书籍中介绍的许多技术和主题都被Java编程语言及其高级类库淘汰了。这包括线程管理、事件管理、图形用户界面、网络通信、持久性和部署等方面。在本书中,我对这些变化进行了适当的评论,并对这些技术进行了简单的比较。

虽然可以通过最小化每帧中需要重绘的像素数量来在Java中创建高速动画,但最近发布的1.4版本的Java编程语言中引入的新类提供了一种直接访问视频硬件的可移植方式。就像这本书里介绍的,即使每帧有很多像素要更新,也能达到高速帧率。这里介绍一个示例程序,演示在真彩色高分辨率模式下,全屏动画成功地与75Hz的显示器刷新率同步。

虽然这本书的最初设计是面向游戏的,但读者应该知道,这里介绍的技术也可以用于其他应用,包括广告和模拟。一个嵌入在网页中的AM动画广告小程序会立即闪现在你的脑海中。AM广告可以用强大的通用编程语言(如Java)编写,这一事实充分挖掘了它们在动画辅助功能之外的潜力,包括主动数据连接。在模拟领域,学生和科学家都可以从可视化中受益。当这些模型用Java表示时,用户可以与它们交互,改变参数并观察新的结果。

阅读器对象

本书面向有丰富经验,正在准备并渴望将自己独特的游戏设计思想转化为部署实体的Java开发者。对于这些读者来说,他们一直在学习Java编程语言和实现基本的基础设施代码,因为他们想知道有趣的特定于游戏的逻辑。

与此同时,这些高级Java开发人员希望了解更多关于可重用库中可能影响游戏性能的优化选项。在介绍游戏库中的这些源代码以及本书中的示例游戏时,我假设读者已经掌握了一些基本的主题,比如Java编程语言、面向对象编程(OOP)技术、图形用户界面(GUI)组件库以及一些设计模式。

范围

这本书简单地(没有深入地)介绍了那些对于Java游戏编程来说是必要的但不是专门使用的技术。这包括通用开源开发工具、通用标准和应用编程接口(API),这些都是很多有经验的Java游戏程序员用过的技术。在书中,还有一个在这些方面需要进一步阅读的参考书目。

本书中介绍的许多可重用库利用了核心Java平台和当前J2SE 1.4版本中可用的最新API。本书不介绍那些过时的API,比如AWT(抽象窗口工具包)。反而深入研究了应用现代API的具体技术,包括Java游戏编程对于动画设计的摇摆。

除了Java 2D和Image I/O API,Java Media API中的大部分API在本书中都没有介绍,因为我觉得它们在游戏开发中会有一些限制。在游戏中使用Java 3D、JMF(Java Media Framework)或Java Speech API会强制玩家下载并安装一个可选的包及其本地代码实现。我相信这额外的一步会让很多潜在玩家望而却步,尤其是那些遇到安装问题和下载延迟的玩家。虽然已经安装了一些J2SE内核库,但是Java Sound API仍然需要一个soundbank文件,默认情况下,对于某些操作系统,该文件包含在Java Runtime Environment (JRE)发行版中,而对于Windows则不包含。Java***共享数据工具包(JSDT)API,虽然也可以在网游中使用,但似乎已经被废止了。在我的游戏编程中,还没有发现真正需要用到Java高级成像(JAI)的地方。

这本书没有避免使用Java本地接口(JNI)API,它将Java与特定于平台的代码混合在一起,但也不鼓励这样做。本书给出的所有代码都是用纯可移植的Java语言编写的,可以运行在所有安装了Java虚拟机的平台上。作为一名开发人员,我发现不使用定制的本地库也能获得高性能。作为一个玩家,我更喜欢纯Java编写的游戏,因为我不用担心安全风险,而且我知道游戏会在我喜欢的平台上运行,不管是什么平台。

本书不介绍使用Java 2 Micro Edition(J2ME)平台进行Java游戏开发。我希望如摩尔定律所述,硬件性能的飞速发展会让J2ME很快被淘汰。今天手持PDA中使用的微处理器的性能与三年前使用的最好的计算机一样强大。现在可以在PDA上安装J2SE和运行Swing应用程序了。如果我近年来看到J2EE在手表上跑步,我不会感到惊讶。

读者在学习以下关于多人联网模式的章节时,有必要对J2EE有所了解。然而,这也限制了Servlet API在开发中的使用。本书不介绍更复杂的J2EE API(如企业Java bean(EJB))的使用。所有示例在线游戏都将在一个简单的servlet容器中运行,不需要安装完整的应用服务器。