标题：Java游戏高级编程
基本信息
Java游戏高级编程——游戏开发经典丛书  图书作者： [美]David Wallace Croft 著 彭晖 译 
出版社： 清华大学出版社 
ISBN： 7302110832 
出版时间： 2005-8第1版 
印刷时间： 2005-8第1次印刷 
开 本： 16 
价 格(元)： 58
前 言
花代价所换来的一点才智，抵过别人传授的数倍不止。 
—— 本杰明?富兰克林 
本书针对的是那些想使用最新的高性能技术，创建面向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游戏高级编程
目 录
第1章 配置开发环境 11.1 升级到Java 1.4 1 
1.2 内核类 1 
1.3 在线运行Demo版程序 2 
1.4 深入游戏库 3 
1.4.1 croftsoft目录 3 
1.4.2 arc目录 4 
1.4.3 bin目录 4 
1.4.4 doc目录 4 
1.4.5 ext目录 5 
1.4.6 lib目录 5 
1.4.7 lic目录 5 
1.4.8 res目录 5 
1.4.9 src目录 6 
1.4.10 tmp目录 6 
1.5 XML简介 6 
1.6 使用Ant编译 7 
1.7 使用开放源代码 10 
1.7.1 学习版权的基本知识 10 
1.7.2 选择一个许可 11 
1.7.3 重命名修改后的代码 12 
1.7.4 共享源代码 13 
1.8 为游戏获取多媒体资源 13 
1.8.1 图片资源 13 
1.8.2 音频资源 14 
1.9 基本示例 15 
1.9.1 修改源代码 15 
1.9.2 修改构建文件 26 
1.10 小结 27 
1.11 参考文献 27 
第2章 部署框架 282.1 部署为applet 28 
2.1.1 实现生命周期方法 28 
2.1.2 管理applet动画线程 30 
2.1.3 读取JAR文件 34 
2.1.4 使用插件升级客户端 36 
2.1.5 了解存在的限制 38 
2.1.6 applet签名 38 
2.1.7 缓存applet 39 
2.2 部署为可执行JAR 39 
2.2.1 生成清单文件 39 
2.2.2 对不安全性进行保护 40 
2.3 用Java Web Start进行部署 40 
2.3.1 准备发布文件 41 
2.3.2 访问默认浏览器 43 
2.3.3 使用反射进行动态链接 46 
2.4 将多个applet部署为一个applet 47 
2.4.1 MultiAppletStup 48 
2.4.2 MultiAppletNews 50 
2.4.3 Lifecycle 54 
2.4.4 LifecycleWindowListener 54 
2.4.5 MultiApplet 58 
2.4.6 CroftSoftCollection 65 
2.5 小结 67 
2.6 参考文献 68 
第3章 Swing动画 693.1 ComponentAnimator 69 
3.1.1 更新和绘制阶段 70 
3.1.2 精灵的定义 70 
3.1.3 ExampleAnimator 71 
3.2 RepaintCollector 73 
3.2.1 Swing串行化 73 
3.2.2 动画的问题 73 
3.2.3 RepaintCollector 75 
3.2.4 SimpleRepaintCollector 75 
3.2.5 BooleanRepaintCollector 77 
3.2.6 CoalescingRepaintCollector 78 
3.2.7 其他实现 81 
3.3 LoopGovernor 81 
3.3.1 固定的延迟 82 
3.3.2 帧速率同步 84 
3.3.3 SamplerLoopGovernor 85 
3.3.4 WindowedLoopGovernor 85 
3.4 AnimatedComponent 90 
3.5 小结 98 
3.6 参考文献 98 
第4章 动画库 994.1 ComponentPainter实现 99 
4.1.1 NullComponentPainter 99 
4.1.2 ArrayComponentPainter 99 
4.1.3 ColorPainter 101 
4.1.4 SpacePainter 103 
4.1.5 TilePainter 106 
4.2 ComponentUpdater 实现 114 
4.2.1 NullComponentUpdater 114 
4.2.2 ArrayComponentUpdater 115 
4.2.3 EdgeScrollUpdater 115 
4.3 ComponentAnimator实现 120 
4.3.1 NullComponentAnimator 120 
4.3.2 TileAnimator 120 
4.3.3 FrameRateAnimator 122 
4.3.4 CursorAnimator 126 
4.4 Sprite实现 131 
4.4.1 Sprite 131 
4.4.2 AbstractSprite 132 
4.4.3 IconSprite 135 
4.4.4 BounceUpdater 137 
4.4.5 IconSequenceUpdater 141 
4.5 小结 143 
第5章 高级图形技术 1445.1 硬件加速图像 144 
5.1.1 Image 144 
5.1.2 BufferedImage 145 
5.1.3 VolatileImage 145 
5.1.4 自动图像 146 
5.1.5 兼容图像 146 
5.1.6 缓存算法 149 
5.2 多缓冲和多线程 150 
5.3 全屏独占模式 160 
5.3.1 启用全屏模式 160 
5.3.2 FullScreenToggler 161 
5.3.3 配置帧 165 
5.3.4 改变显示模式 165 
5.3.5 DisplayModeLib 166 
5.3.6 GraphicsDeviceLib 166 
5.3.7 消除锯齿 167 
5.3.8 BufferStrategyAnimatedComponent 168 
5.3.9 FullScreenDemo 170 
5.3.10 使用独占模式的顾虑 177 
5.4 小结 177 
5.5 参考文献 177 
第6章 持久数据 1786.1 数据格式 178 
6.1.1 对象串行化 178 
6.1.2 属性 181 
6.1.3 XML 182 
6.1.4 瓦片地图图像 190 
6.1.5 随机种子 193 
6.2 持久性机制 195 
6.2.1 JAR资源文件 196 
6.2.2 用户主目录文件 197 
6.2.3 JNLP持久性 200 
6.2.4 applet持久性 203 
6.2.5 稳固持久性 206 
6.2.6 嵌入式数据库 211 
6.2.7 服务器端的持久性 212 
6.3 数据完整性 214 
6.3.1 消息摘要 214 
6.3.2 散列缓存 215 
6.4 小结 217 
6.5 参考文献 217 
第7章 游戏体系结构 2187.1 接口 218 
7.2 继承 218 
7.3 目标Mars 221 
7.4 模型-视图-控制器 221 
7.4.1 模型 222 
7.4.2 多重接口继承 224 
7.4.3 视图 234 
7.4.4 控制器 240 
7.5 复合MVC 243 
7.5.1 复合模型 243 
7.5.2 复合视图 254 
7.5.3 复合控制器 260 
7.5.4 将三者进行组合 260 
7.6 数据驱动设计 264 
7.6.1 AnimationInit 264 
7.6.2 AnimatedApplet 265 
7.7 小结 269 
7.8 参考文献 269 
第8章 A*算法 2708.1 Cartographer 271 
8.2 NodeInfo 272 
8.3 AStar 273 
8.4 AStarTest 279 
8.5 SpaceTester 283 
8.6 GridCartographer 283 
8.7 GradientCartographer 286 
8.8 TankConsole 289 
8.9 TankOperator 290 
8.10 StateSpaceNode 291 
8.11 TankCartographer 292 
8.12 DefaultTankOperator 293 
8.13 PlayerTankOperator 297 
8.14 小结 299 
8.15 参考文献 300 
第9章 HTTP隧道技术 3019.1 测试示例 302 
9.2 可重用的客户端代码 303 
9.2.1 Encoder 304 
9.2.2 Parser 304 
9.2.3 StreamLib 304 
9.2.4 StringCoder 305 
9.2.5 HttpLib 306 
9.2.6 Queue 308 
9.2.7 ListQueue 309 
9.2.8 Loopable 312 
9.2.9 Looper 313 
9.2.10 HttpMessagePusher 315 
9.3 游戏特定的客户端代码 318 
9.4 可重用的服务器端代码 323 
9.4.1 Server 323 
9.4.2 HttpGatewayServlet 324 
9.5 游戏特定的服务器端代码 327 
9.6 打包WAR 330 
9.6.1 web.xml 330 
9.6.2 build.xml 331 
9.7 小结 332 
9.8 参考文献 332 
第10章 HTTP轮询机制 33310.1 测试示例程序 333 
10.2 可重用的客户端代码 334 
10.2.1 SerializableCoder 334 
10.2.2 HttpMessagePoller 335 
10.2.3 Consumer 340 
10.2.4 QueuePuller 340 
10.2.5 HttpMessageClient 342 
10.3 游戏特定的客户端代码 345 
10.3.1 Request 345 
10.3.2 AbstractRequest 346 
10.3.3 FireRequest 346 
10.3.4 MoveRequest 347 
10.3.5 ViewRequest 348 
10.3.6 GameData 348 
10.3.7 Synchronizer 350 
10.3.8 NetController 354 
10.3.9 NetMain 356 
10.4 可重用的服务器端代码 357 
10.4.1 XmlBeanCoder 358 
10.4.2 SerializableLib 359 
10.5 游戏特定的服务器端代码 360 
10.5.1 GameInit 360 
10.5.2 Player 362 
10.5.3 NetGame 363 
10.5.4 MarsServer 370 
10.5.5 MarsServlet 376 
10.6 小结 378 
10.7 参考文献 378 
第11章 HTTP Pulling机制 37911.1 测试示例 379 
11.2 可重用的客户端代码 381 
11.2.1 Authentication 381 
11.2.2 Id 381 
11.2.3 LongId 382 
11.2.4 ModelId 383 
11.2.5 SeriModelId 383 
11.3 游戏特定的客户端代码 384 
11.3.1 Request 384 
11.3.2 CoalesceableRequest 384 
11.3.3 ChatController 385 
11.3.4 Response 386 
11.3.5 CreateUserConsumer 386 
11.3.6 Event 387 
11.3.7 ChatClient 387 
11.3.8 ChatSynchronizer 393 
11.3.9 ChatPanel 395 
11.3.10 ChatApplet 398 
11.4 服务器端代码 400 
11.4.1 User 400 
11.4.2 UserStore 401 
11.4.3 PullServer 402 
11.4.4 MoveServer 403 
11.4.5 SeriChatGame 404 
11.4.6 ChatServer 409 
11.5 跟踪消息 411 
11.5.1 多玩家联网模式 412 
11.5.2 单玩家本地模式 413 
11.6 扩展示例 414 
11.7 小结 414 
11.8 参考文献 415附录附录A 源代码索引 416 
附录B CVS简介 420 
B.1 检出代码 420 
B.2 创建自己的项目 421 
B.3 并行程序设计 423 
B.3.1 实施代码所有权 423 
B.3.2 互相监视 424 
B.3.3 创建分支 425 
B.4 参考文献 425