内 容 简 介本书通过丰富的示例游戏,详细讲述了Java游戏高级编程方面的知识。包括部署框架、Swing动画、动画库、高级图形技术、持久性机制、游戏体系结构以及一些通信和同步技术等。本书针对那些具有一定编程经验、渴望将自己独特的游戏设计思想变成部署实体的Java高级开发人员。
前 言 花代价所换来的一点才智,抵过别人传授的数倍不止。 —— 本杰明?富兰克林 本书针对的是那些想使用最新的高性能技术,创建面向Web和桌面的复杂2D计算机游戏的Java程序员。本书循序渐进地介绍了一个可重用的动画库,每一章都依赖于前面的一些章节。在需要说明这些主题的地方,都详细地介绍了每一个新库类的源代码,并且给出了实际使用这些类的示例游戏。免费许可使您可以直接修改和调整库代码和示例游戏,开发自己的游戏程序。 目的 本书也可取名为《现代Java游戏编程》。在以前出版的Java游戏编程的书籍中介绍的很多技术和主题,已被Java编程语言和它的高级类库所淘汰。这包括像线程管理、事件管理、图形用户界面、网络通信、持久性和部署等方面。在本书中,我对这些变更作了适当的注释,并简要地对这些技术作了一些对比。 虽然通过将每一帧中需要重绘像素的数量最小化就可以在Java中创建高速的动画,但是在最近发布的Java编程语言的1.4版中引入的新类,又提供了通过可移植方式直接访问视频硬件的方法。正如在本书中介绍的一样,即使每一帧中需要更新的像素很多,也可以实现高速的帧速率。在这里介绍了一个示例程序,用来演示在真彩色高分辨率模式中,成功地将全屏动画和显示器75Hz的刷新率同步。 尽管本书最初的设计是面向游戏,但是读者应该知道这里介绍的技术也可以用在其他应用方面,包括广告和仿真。嵌在Web页面中的动画调幅广告applet会立即闪现在您的大脑中。调幅广告可以使用强大的通用编程语言(例如Java)编写的这个事实,充分发掘它们超越动画的辅助功能的潜能,包括活动数据连接。在仿真领域,学生和科学家都可以从可视化上获益。当这些模型使用Java表示的时候,用户就可以与它们进行交互、更改参数并观察新的结果。 读者对象 本书专门针对具有丰富经验、正准备和渴望将他们独特的游戏设计思想转换为部署实体的Java开发人员。对这些读者而言,从想了解有趣的游戏特定逻辑以来,一直在学习Java编程语言和实现基本的基础结构代码。 同时,这些Java高级开发人员希望详细地了解可能会影响游戏性能的可重用库中的优化选项。在介绍游戏库和本书示例游戏中的这些源代码时,我假定读者已经掌握了一些基本的主题,例如Java编程语言、面向对象的编程(Object Oriented Programming,OOP)技术、图形用户界面(Graphical User Interface,GUI)组件库,以及一些设计模式等。 范围 本书简要(没有深入地)介绍了那些虽然必需但又不是专门用于Java游戏编程的技术。这包括通用的开放源代码开发工具和通用的标准以及应用编程接口(API),这些都是很多经验丰富的Java游戏程序员已经使用过的技术。在书中,还提供了在这些方面需要进一步阅读的参考书目。 本书介绍的很多可重用库都利用了在核心Java平台里可用的最新API、当前的J2SE 1.4版。本书没有介绍那些过时的API,例如AWT(Abstract Window Toolkit)。相反,深入地研究了应用现代API的具体技术,包括Java游戏编程用于动画设计的Swing。 除了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运行库环境(JRE)发布中的,而对Windows而言则不是。Java共享数据工具包(Java Shared Data Toolkit,JSDT)API,尽管也可以在网络游戏中使用,但是它们好像已经被废止了。我在游戏编程里,还没有发现确实需要使用Java高级图像(Java Advanced Imaging,JAI)的地方。 本书并没有回避将Java与平台专用代码混合的Java本地接口(JNI)API的使用,但是也不鼓励这样使用。本书中给出的所有代码都是用纯粹、可移植的Java语言编写的,它们能够在所有安装有Java虚拟机的平台上运行。作为一个开发人员,我发现不使用定制的本地库也可以实现高性能。作为一个玩家,我更加喜欢用纯Java编写的游戏,因为我不必因为安全风险而烦恼,并且我知道游戏将会运行在我喜欢的平台上,而不管这是个什么平台。 本书没有介绍使用Java 2 Micro Edition(J2ME)平台进行Java游戏开发。我希望像摩尔定律中描述的那样,硬件性能的快速发展能使J2ME很快过时。如今的手持PDA使用的微处理器的性能已经与3年以前使用的最好计算机的处理器性能一样强大了。现在在PDA上安装J2SE和运行Swing应用程序已经成为可能。如果在近几年内看到J2EE运行在手表上,我将不会感到惊奇。 在学习后面的关于多玩家联网模式的相关章节时,确实需要读者具有一些J2EE的知识。然而,这也限制使用Servlet API进行开发。更为复杂的J2EE API(例如Enterprise Java Beans(EJBs))的使用方法,本书并没有进行介绍。所有示例的网络游戏都会运行在一个简单的servlet容器以内,并且也不需要安装一个完全的应用服务器。 内容简介 在第1章“配置开发环境”中,我向读者介绍了将要在整本书中使用的代码库。描述了这个库的设计,并给出了编译示例游戏的说明。可能会在游戏开发环境中使用的一些附加代码、图形和音频文件,也在本章确定了下来,还介绍了软件开发的一些流行工具。以模板的形式给出了一个演示Java游戏编程基础知识的游戏示例。 在第2章“部署框架”中,我们关注的重点是在可以安装在多种不同类型的平台上的一个框架中部署游戏。在动画线程管理技术的相关内容中,介绍了一个被广泛使用的框架接口以及applet生命周期。在对适合于游戏的不同发布而进行不同部署的选项进行了一个简要的回顾以后,给出了允许游戏部署在不同开发环境中而不需要任何修改的一个抽象层的源代码示例。 在第3章“Swing动画”中,介绍了一个基于Swing的动画库,这个动画库会在整本书中使用。这一章主要考虑的问题是动画的性能和灵活性。在介绍核心动画引擎类的源代码时简单介绍了优化权衡。 在第4章“动画库”中,介绍了通用动画任务的一个类集合。这些类提供了很多功能,例如场景管理和Sprite实现。它们也用来介绍怎样开发与核心动画引擎类互操作的游戏特定代码。 在第5章“高级图形技术”中,介绍了高级图形技术,包括硬件加速图形、多缓冲和全屏独占模式。给出了使这些技术的使用变得更加方便的可重用类和使用这些可重用类的示例游戏。对其中的每一个技术,都介绍了关于它们使用方法的一些限制。 在第6章“持久数据”中,对在各种部署框架中加载和保存游戏数据的机制进行了对比。在这个过程中还介绍了可以用于大多数游戏编程的可重用数据持久性的类库。对更加高级的持久性需求的其他选择也进行了考虑。 在第7章“游戏体系结构”中,介绍了适合于Java游戏开发的面向对象的软件体系结构的优点。使用这种体系结构的一个示例游戏是作为新游戏开发模板进行介绍的。本章还简单介绍了一下数据驱动的设计。 在第8章“A*算法”中,介绍了现在在游戏行业中最流行和最常用的一个人工智能(AI)算法的实现。本章还介绍了使用A*算法绕过障碍物寻找路径的示例。 在第9章“HTTP隧道技术”中,介绍一个可以在大部分Java游戏部署环境里常见的安全限制以内进行操作的一个联网库。本章还给出了一个示例,在这个示例中,数据在服务器和客户机之间进行传递。 在第10章“HTTP轮询机制”中,将联网库扩展以支持在线多玩家游戏。使用轮询来同步客户机和服务器上的游戏状态。在由单玩家游戏向多玩家联网游戏的转换中,介绍了我所推荐的软件体系结构的灵活性。 在第11章“HTTP Pulling机制”中,事件驱动的消息是作为轮询的另一个选择而推荐使用的。使用在前面两章中介绍的这些类,演示了这是怎样在无符号applet的安全限制以内实现的。使用这些技术进行进一步开发的一些建议已经超出了本书的范围,这里只进行简单的介绍。 本书合作站点 本书应该保持其“高级性”。为此,我专门为这本书建立了一个Web站点。从这个站点上,您能够订阅与本书相关的电子邮件列表,包括补充的指南和勘误表。您将能够测试和运行本书所介绍的示例游戏,并下载开放源代码库和用来创建这些游戏的公共领域的多媒体文件。针对老师,我已经在Creative Commons Attribution License下发布了我在讲授游戏开发课程中使用的课程提纲、幻灯片和布置给学生的作业。我也提供了我的联系方式,这样您可以将您的建议和意见反馈给我,以便我以后进行更正。 在开始阅读第1章以前,请先访问并订阅Advanced Java Game Programming通知邮件列表。 IV Java游戏高级编程