簡介
本書通過豐富的示例遊戲,詳細講述了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 MediaFramework)或者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 CommonsAttribution License下發布了我在講授遊戲開發課程中使用的課程提綱、幻燈片和布置給學生的作業。我也提供了我的聯繫方式,這樣您可以將您的建議和意見反饋給我,以便我以後進行更正。
在開始閱讀第1章以前,請先訪問http://www.croftsoft.com/library/books/ajgp,並訂閱Advanced Java Game Programming通知郵件列表。
IV
Java遊戲高級編程
目錄
第1章配置開發環境 1
1.1升級到Java 1.4 1
1.2核心類 1
1.3線上運行Demo版程式 2
1.4深入遊戲庫 3
1.4.1croftsoft目錄 3
1.4.2arc目錄 4
1.4.3bin目錄 4
1.4.4doc目錄 4
1.4.5ext目錄 5
1.4.6lib目錄 5
1.4.7lic目錄 5
1.4.8res目錄 5
1.4.9src目錄 6
1.4.10tmp目錄 6
1.5XML簡介 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章部署框架 28
2.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.6applet簽名 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.1MultiAppletStup 48
2.4.2MultiAppletNews 50
2.4.3Lifecycle 54
2.4.4LifecycleWindowListener 54
2.4.5MultiApplet 58
2.4.6CroftSoftCollection 65
2.5小結 67
2.6參考文獻 68
第3章Swing動畫 69
3.1ComponentAnimator 69
3.1.1更新和繪製階段 70
3.1.2精靈的定義 70
3.1.3ExampleAnimator 71
3.2RepaintCollector 73
3.2.1Swing串列化 73
3.2.2動畫的問題 73
3.2.3RepaintCollector 75
3.2.4SimpleRepaintCollector 75
3.2.5BooleanRepaintCollector 77
3.2.6CoalescingRepaintCollector 78
3.2.7其他實現 81
3.3LoopGovernor 81
3.3.1固定的延遲 82
3.3.2幀速率同步 84
3.3.3SamplerLoopGovernor 85
3.3.4WindowedLoopGovernor 85
3.4AnimatedComponent 90
3.5小結 98
3.6參考文獻 98
第4章動畫庫 99
4.1ComponentPainter實現 99
4.1.1NullComponentPainter 99
4.1.2ArrayComponentPainter 99
4.1.3ColorPainter 101
4.1.4SpacePainter 103
4.1.5TilePainter 106
4.2ComponentUpdater 實現 114
4.2.1NullComponentUpdater 114
4.2.2ArrayComponentUpdater 115
4.2.3EdgeScrollUpdater 115
4.3ComponentAnimator實現 120
4.3.1NullComponentAnimator 120
4.3.2TileAnimator 120
4.3.3FrameRateAnimator 122
4.3.4CursorAnimator 126
4.4Sprite實現 131
4.4.1Sprite 131
4.4.2AbstractSprite 132
4.4.3IconSprite 135
4.4.4BounceUpdater 137
4.4.5IconSequenceUpdater 141
4.5小結 143
第5章高級圖形技術 144
5.1硬體加速圖像 144
5.1.1Image 144
5.1.2BufferedImage 145
5.1.3VolatileImage 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.2FullScreenToggler 161
5.3.3配置幀 165
5.3.4改變顯示模式 165
5.3.5DisplayModeLib 166
5.3.6GraphicsDeviceLib 166
5.3.7消除鋸齒 167
5.3.8BufferStrategyAnimatedComponent 168
5.3.9FullScreenDemo 170
5.3.10使用獨占模式的顧慮 177
5.4小結 177
5.5參考文獻 177
第6章持久數據 178
6.1數據格式 178
6.1.1對象串列化 178
6.1.2屬性 181
6.1.3XML 182
6.1.4瓦片地圖圖像 190
6.1.5隨機種子 193
6.2持久性機制 195
6.2.1JAR資源檔案 196
6.2.2用戶主目錄檔案 197
6.2.3JNLP持久性 200
6.2.4applet持久性 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章遊戲體系結構 218
7.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.1AnimationInit 264
7.6.2AnimatedApplet 265
7.7小結 269
7.8參考文獻 269
第8章A*算法 270
8.1cartographer271
8.2NodeInfo 272
8.3astar273
8.4AStarTest 279
8.5SpaceTester 283
8.6GridCartographer 283
8.7GradientCartographer 286
8.8TankConsole 289
8.9TankOperator 290
8.10StateSpaceNode 291
8.11TankCartographer 292
8.12DefaultTankOperator 293
8.13PlayerTankOperator 297
8.14小結 299
8.15參考文獻 300
第9章HTTP隧道技術 301
9.1測試示例 302
9.2可重用的客戶端代碼 303
9.2.1Encoder 304
9.2.2Parser 304
9.2.3StreamLib 304
9.2.4StringCoder 305
9.2.5HttpLib 306
9.2.6Queue 308
9.2.7ListQueue 309
9.2.8Loopable 312
9.2.9LOOPER313
9.2.10HttpMessagePusher 315
9.3遊戲特定的客戶端代碼 318
9.4可重用的伺服器端代碼 323
9.4.1Server 323
9.4.2HttpGatewayServlet 324
9.5遊戲特定的伺服器端代碼 327
9.6打包WAR 330
9.6.1web.xml 330
9.6.2build.xml 331
9.7小結 332
9.8參考文獻 332
第10章HTTP輪詢機制 333
10.1測試示例程式 333
10.2可重用的客戶端代碼 334
10.2.1SerializableCoder 334
10.2.2HttpMessagePoller 335
10.2.3Consumer 340
10.2.4QueuePuller 340
10.2.5HttpMessageClient 342
10.3遊戲特定的客戶端代碼 345
10.3.1Request 345
10.3.2AbstractRequest 346
10.3.3FireRequest 346
10.3.4MoveRequest 347
10.3.5ViewRequest 348
10.3.6GameData 348
10.3.7Synchronizer 350
10.3.8NetController 354
10.3.9NetMain 356
10.4可重用的伺服器端代碼 357
10.4.1XmlBeanCoder 358
10.4.2SerializableLib 359
10.5遊戲特定的伺服器端代碼 360
10.5.1GameInit 360
10.5.2Player 362
10.5.3NetGame 363
10.5.4MarsServer 370
10.5.5MarsServlet 376
10.6小結 378
10.7參考文獻 378
第11章HTTP Pulling機制 379
11.1測試示例 379
11.2可重用的客戶端代碼 381
11.2.1Authentication 381
11.2.2Id 381
11.2.3LongId 382
11.2.4ModelId 383
11.2.5SeriModelId 383
11.3遊戲特定的客戶端代碼 384
11.3.1Request 384
11.3.2CoalesceableRequest 384
11.3.3ChatController 385
11.3.4Response 386
11.3.5CreateUserConsumer 386
11.3.6Event 387
11.3.7ChatClient 387
11.3.8ChatSynchronizer 393
11.3.9ChatPanel 395
11.3.10ChatApplet 398
11.4伺服器端代碼 400
11.4.1User 400
11.4.2UserStore 401
11.4.3PullServer 402
11.4.4MoveServer 403
11.4.5SeriChatGame 404
11.4.6ChatServer 409
11.5跟蹤訊息 411
11.5.1多玩家聯網模式 412
11.5.2單玩家本地模式 413
11.6擴展示例 414
11.7小結 414
11.8參考文獻 415
附錄A原始碼索引 416
附錄BCVS簡介 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