游戲編程權威指南(第4版)

游戲編程權威指南(第4版)
定價:594
NT $ 517
 

內容簡介

游戲編程的用戶需求和發展速度近年來很快,閱讀游戲開發類圖書的需求也越來越大。本書是一本游戲開發指南,是開發、部署、運行商業游戲的讀物。

全書分為4個部分共24章。首部分是游戲編程基礎,主要介紹了游戲編程的定義、游戲架構等基礎知識。第二部分是讓游戲跑起來,主要介紹了初始化和關閉代碼、主循環、游戲主題和用戶界面等。第三部分是核心游戲技術,主要介紹了一些更為復雜的代碼示例,如3D編程、游戲音頻、物理和AI編程等。第四部分是高級知識和綜合應用,主要介紹了網絡編程、多道程序設計和用C#創建工具等,並利用前面所講的知識開發出一款簡單的游戲。

本書適合游戲開發人員、游戲架構設計人員和游戲引擎用戶參考閱讀,也適合想要進入游戲開發領域的讀者閱讀。

Mike McShaffry又名「Mike先生」,在剛會敲鍵盤時就開始了游戲編程。從大學畢業后他就加入了Origin Systems公司,和Warren Spector和Richard Garriott(又名「不列顛之王」)一起開發了「創世紀」系列,包括「網絡創世紀」。從那之后,他開發了很多游戲,包括:「Magnadoodle」(PC);為微軟開發了一洗類棋牌類游戲;「神偷:致命陰影」(Xbox/PC);為美國軍方開發的24藍;「蘑菇人:孢子大戰」(Wii);「捉鬼敢死隊」(Wii/PS2);「Cook or Be Cooked」(Wii);「星球大戰:原力釋放2」(Wii);「雷神托爾」(Wii/3DS);「慣性:超速逃逸」(iOS/Android)。Mike現在是Red Fly工作室的執行制片人。

David 「Rez」 Graham是一名自學成才的程序員,他從1996年就開始在地下室里編寫游戲了。2005年,他獲得了Super-Ego Games的一份編程工作,他開發了幾個迷你游戲並擔任「芭比高校生冒險日記」(PC)的AI工作。他還參與開發了一款喜劇冒險游戲:「明爭暗斗」(PS3)。2008年,Rez跳槽到「Planet Moon」,參與開發了「Brain Quest」(Game Boy DS)和「描繪生命:下一章」(Wii)。2010年,Rez跳槽到「PlayFirst」的公司,他參與開發了「瘋狂烹飪」(iPad平台),並成為「婚禮進行曲」(iPhone4平台)的主工程師。Rez現在待在EA,他擔任的是「模擬人生」系列游戲的AI程序員。他已經參與了2款游戲的發行,包括「模擬人生:中世紀」和「模擬人生中世紀:貴族與海盜」擴展包。他現在是一款即將發行的「模擬人生」游戲的主AI程序員。
 

目錄

第1章 什麼是游戲編程 1
1.1好的方面 1
1.1.1工作 2
1.1.2游戲玩家 2
1.1.3同事 3
1.1.4工具—軟件開發工具包(SDK) 4
1.1.5硬件 5
1.1.6平台 6
1.1.7展會 9
1.2不好的地方 9
1.2.1游戲編程很難 10
1.2.2零碎文件 10
1.2.3那不是bug—而是特性 11
1.2.4工具 12
1.3黑暗的一面 13
1.3.1命中移動的目標 13
1.3.2加班模式(和加班大餐) 13
1.3.3呸!胡扯 15
1.3.4操作系統地獄 15
1.3.5雇員流動的性質 16
1.4這一切都是值得的,對嗎 16

第2章 游戲中有什麼 18
2.1游戲架構 18
2.2使用游戲架構 20
2.3應用層 22
2.3.1讀取輸入 22
2.3.2文件系統和資源緩存 22
2.3.3內存管理 23
2.3.4初始化、主循環和關閉 23
2.3.5其他應用層代碼 24
2.4游戲邏輯 25
2.4.1游戲狀態和數據結構 25
2.4.2物理學和碰撞 26
2.4.3事件 26
2.4.4進程管理器 27
2.4.5命令解釋器 28
2.5人類玩家的游戲視圖 28
2.5.1圖形顯示 29
2.5.2音頻 30
2.5.3用戶界面表示 31
2.5.4進程管理器 31
2.5.5選項 31
2.5.6多人游戲 31
2.6AI代理的游戲視圖 31
2.7網絡游戲架構 32
2.7.1遠程游戲視圖 33
2.7.2遠程游戲邏輯 33
2.8必須使用DirectX嗎 34
2.8.1DirectX的設計理念 34
2.8.2Direct3D或OpenGL 35
2.8.3DirectSound還是 35
2.8.4DirectInput或自己實現 36
2.9其他內容 36
2.10補充書目 36

第3章 拯救了我的編碼趣聞和風格 37
3.1通用編碼風格 38
3.1.1大括號 38
3.1.2一致性 39
3.2智能代碼設計實踐 40
3.2.1避免隱藏代碼和重要操作 41
3.2.2類結構:保持簡單 42
3.2.3繼承VS.組合 42
3.2.4變壞的虛函數 43
3.2.5使用接口類 44
3.2.6考慮使用工廠 45
3.2.7封裝變化的組件 46
3.2.8使用流來初始化對象 46
3.3智能指針和裸指針 47
3.3.1引用計數 48
3.3.2C++的shared_ptr 49
3.4正確使用內存 52
3.4.1了解不同類型的內存 53
3.4.2優化內存訪問 55
3.4.3內存對齊 56
3.4.4虛擬內存 57
3.4.5編寫自己的內存管理器 58
3.5各種有用的東西 59
3.5.1一個很棒的隨機數生成器 60
3.5.2集合的偽隨機遍歷 61
3.5.3內存池 62
3.6開發出適合自己的風格 67
3.7補充書目 68

第4章 生成游戲 69
4.1一個小動機 69
4.2創建項目 70
4.2.1生成配置 70
4.2.2創建堅不可摧的目錄結構 71
4.2.3將游戲引擎和工具放在何處 73
4.2.4設置VisualStudio生成選項 74
4.2.5多平台項目 76
4.3源代碼庫和版本控制 77
4.3.1微軟VisualSourceSafe的相關歷史 79
4.3.2Subversion和TortoiseSVN 79
4.3.3Perforce軟件的Perforce 80
4.3.4Avid的AlienBrain 81
4.3.5使用源代碼控制分支 81
4.4生成游戲:一門黑色藝術 84
4.4.1自動化生成 85
4.4.2生成計算機 85
4.4.3自動化生成腳本 85
4.5創建生成腳本 87
4.5.1標准生成 87
4.5.2里程碑生成 88
4.5.3多個項目和共享代碼 90
4.5.4最后的建議 91

第5章 游戲初始化和關閉 92
5.1初始化10192
5.2C++初始化的一些陷阱 93
5.3游戲的應用層 95
5.3.1WinMain:Windows入口點 95
5.3.2應用層:GameCodeApp 97
5.3.3InitInstance():檢查系統資源 97
5.3.4檢查游戲的多個實例 98
5.3.5檢查硬盤空間 99
5.3.6檢查內存 99
5.3.7計算CPU速度 100
5.3.8你擁有的是個垃圾袋嗎 101
5.3.9初始化資源緩存 101
5.3.10加載文本字符串 102
5.3.11腳本管理器和事件系統 104
5.3.12初始化DirectX並創建窗口 104
5.3.13創建游戲邏輯和游戲視圖 105
5.3.14設置游戲保存目錄 105
5.3.15預加載從緩存中選定的資源 106
5.4收尾工作:干凈漂亮地退出 107
5.4.1我怎樣才能離開呢 107
5.4.2強制關閉模態對話框 109
5.4.3關閉游戲 110
5.4.4游戲機怎麼樣 110
5.5進入和退出 111

第6章 游戲主體和組件架構 112
6.1初次嘗試創建游戲主體 112
6.2組件架構 115
6.3創建主體和組件 116
6.4定義主體和組件 120
6.5存儲並訪問主體 122
6.6將它們組合起來 123
6.7數據共享 124
6.7.1直接訪問 125
6.7.2事件 125
6.7.3兩全其美 126

第7章 主循環的控制 127
7.1組織主循環 127
7.1.1硬編碼的更新 127
7.1.2多線程主循環 128
7.1.3一種混合技術 129
7.1.4簡單的協同式多任務處理器 131
7.1.5非常簡單的進程示例:DelayProcess 135
7.1.6Process派生類的使用 137
7.2良好地適應操作系統 137
7.3使用DirectX11框架 138
7.3.1渲染和呈現顯示 138
7.3.2用於更新和渲染的回調函數 139
7.4我現在可以制作游戲了嗎 141

第8章 游戲數據的加載與緩存 142
8.1游戲資源:格式和存儲要求 143
8.1.13D對象網格和環境 143
8.1.2動畫數據 145
8.1.3地圖/關卡數據 146
8.1.4紋理數據 146
8.1.5位圖顏色深度 147
8.1.6聲音和音樂數據 149
8.1.7視頻和預渲染的過場動畫 150
8.2資源文件 152
8.2.1將資源打包到一個文件中 153
8.2.2打包資源的其他好處 153
8.2.3數據壓縮和性能 154
8.2.4Zlib:開源壓縮 154
8.3資源高速緩存 158
8.3.1IResourceFile接口 161
8.3.2ResHandle:跟蹤加載的資源 161
8.3.3IResourceLoader接口和DefaultResourceLoader 163
8.3.4ResCache:簡單的資源高速緩存 163
8.3.5將資源緩存入DirectX等 169
8.3.6世界設計和高速緩存預測 170
8.4我的緩存不夠用了 173

第9章 輸入設備編程 174
9.1獲取設備狀態 174
9.2使用XInput或DirectInput 177
9.3一些安全提示 179
9.4使用雙軸控制器 182
9.4.1捕獲桌面上的鼠標 182
9.4.2使用鼠標拖拽 184
9.5使用游戲控制器 186
9.5.1非靈敏區 187
9.5.2正常輸入 189
9.5.3單桿、雙桿、紅色拉桿和藍色拉桿 190
9.5.4增加控制值 190
9.6使用鍵盤 191
9.6.1Mike的鍵盤窺探器 191
9.6.2GetAsyncKeyState()和其他函數 195
9.6.3處理Windows中的Alt鍵 195
9.7什麼?沒有跳舞毯 195

第10章 用戶界面編程 197
10.1DirectX的文本助手和對話框資源管理器 197
10.2人類的游戲視圖 198
10.3WASD移動控制器 206
10.4屏幕元素 208
10.5自定義的MessageBox對話框 210
10.6模態對話框 215
10.7控件 218
10.8控件識別 219
10.9命中測試和焦點順序 221
10.10控件狀態 222
10.11更多控件屬性 223
10.11.1熱鍵 223
10.11.2工具提示 223
10.11.3上下文相關幫助 224
10.11.4可拖拽 224
10.11.5聲音和動畫 224
10.12最后的用戶界面提示 225

第11章 游戲事件管理 226
11.1游戲事件 226
11.1.1事件和事件數據 227
11.1.2事件監聽器委托 230
11.1.3事件管理器 231
11.1.4示例:將所有內容整合在一起 238
11.2哪些游戲事件是重要的 239
11.3事件和進程的區別 241
11.4補充書目 241

第12章 使用Lua編寫腳本 242
12.1游戲編程語言的簡史 242
12.1.1匯編語言 243
12.1.2C/C++ 244
12.1.3腳本語言 245
12.2使用腳本語言 246
12.2.1快速原型法 246
12.2.2專注於設計 247
12.2.3速度和內存成本 247
12.2.4它們之間的界限是什麼 247
12.3腳本語言集成策略 248
12.3.1自己進行編寫 248
12.3.2使用現有的語言 248
12.3.3選擇一種腳本語言 249
12.3.4Python 249
12.3.5Lua 249
12.4Lua速成課程 250
12.4.1注釋 250
12.4.2變量 250
12.4.3函數 252
12.4.4表 253
12.4.5流程控制 255
12.4.6操作符 257
12.4.7接下來是什麼 257
12.5Lua中的面向對象編程 258
12.5.1元表 259
12.5.2創建一個簡單的類抽象 261
12.6內存管理 263
12.7將Lua綁定到C++ 263
12.7.1LuaCAPI 263
12.7.2tolua++ 263
12.7.3luabind 264
12.7.4LuaPlus 264
12.8LuaPlus速成課程 264
12.8.1LuaState 264
12.8.2LuaObject 265
12.8.3表 266
12.8.4全局 267
12.8.5函數 268
12.8.6從Lua調用C++函數 269
12.9將所有內容整合在一起 271
12.9.1管理Lua狀態 271
12.9.2腳本導出 273
12.9.3進程系統 274
12.9.4事件系統 282
12.9.5腳本組件 287
12.10Lua開發和調試 289
12.11結語 289
12.12補充書目 289

第13章 游戲音頻 290
13.1聲音的工作原理 290
13.1.1數字錄音和重現 291
13.1.2聲音文件 293
13.1.3線程和同步的簡介 293
13.2游戲語音系統架構 294
13.2.1聲音資源和句柄 295
13.2.2IAudioBuffer接口和AudioBuffer類 303
13.2.3IAudio接口和Audio類 305
13.2.4DirectSound實現 308
13.2.5聲音進程 317
13.2.6啟動音效 321
13.3其他技術難題 322
13.3.1聲音和游戲對象 322
13.3.2定時和同步 322
13.3.3混合問題 324
13.4一些隨記 326
13.4.1數據驅動的聲音設置 326
13.4.2背景環境聲音和音樂 327
13.4.3語音 328
13.5結語 330

第14章 3D圖形基礎 331
14.13D圖形流水線 331
14.23D數學101332
14.2.1坐標和坐標系 333
14.2.2向量數學 335
14.3C++數學類 340
14.3.1向量類 340
14.3.2矩陣數學 341
14.3.3四元數數學 351
14.3.4變換 358
14.3.5幾何體 360
14.3.6光照、法線和顏色 361
14.3.7材質 363
14.3.8貼有紋理的頂點 365
14.3.9紋理 365
14.3.10二次采樣 365
14.3.11mip映射 367
14.3.12ID3D11Device和ID3D11DeviceContext簡介 367
14.3.13在D3D11中加載紋理 368
14.3.14三角形網格 370
14.4你還在嗎 373

第15章 3D頂點和像素着色器 374
15.1頂點着色器和着色器語法 375
15.2編譯頂點着色器 379
15.3頂點着色器的C++輔助類 380
15.4像素着色器 386
15.5像素着色器的C++輔助類 387
15.6使用着色器輔助類進行渲染 390
15.7着色器—這只是一個開始 391
15.8補充書目 391

第16章 3D場景 392
16.1場景圖基礎 392
16.1.1ISceneNode接口類 392
16.1.2SceneNodeProperties和RenderPass 394
16.1.3SceneNode—一切都是從這里開始的 396
16.1.4Scene類 401
16.2特殊的場景圖節點 408
16.2.1獨立渲染通道的實現 408
16.2.2一個簡單的攝像機 411
16.2.3在場景中放入燈光 413
16.2.4天空的渲染 416
16.2.5在場景中使用網格 420
16.3遺漏的內容 424
16.4還沒滿足 425
16.5補充書目 425

第17章 碰撞和簡單的物理學 426
17.1物理學中的數學知識 427
17.1.1米、英尺、肘尺還是Kellicam 427
17.1.2距離、速度和加速度 427
17.1.3質量、加速度和力 428
17.1.4轉動慣量、角速度和扭矩 431
17.1.5距離和交集的計算 431
17.2選擇一種物理SDK 432
17.3對象屬性 434
17.4碰撞體 435
17.4.1良好的碰撞幾何體的要求 436
17.4.2可見幾何體VS碰撞幾何體 437
17.4.3人類角色的碰撞體 437
17.4.4特殊對象:樓梯、門道和樹 439
17.5碰撞系統的使用 439
17.6集成一個物理SDK 441
17.6.1BulletSDK的組件 444
17.6.2初始化 445
17.6.3關閉 446
17.6.4物理系統的更新 447
17.6.5創建簡單的物理對象 449
17.6.6凸面網格的創建 451
17.6.7觸發器的創建 452
17.6.8力和力矩的應用 453
17.6.9物理調試渲染器 454
17.6.10接收碰撞事件 455
17.6.11物理SDK集成的最后內容 457
17.7等一下,我還有話要說 458

第18章 游戲AI簡介 459
18.1AI技術 459
18.1.1硬編碼AI 460
18.1.2隨機化 461
18.1.3加權隨機 462
18.2有限狀態機 463
18.3決策樹 467
18.4模糊邏輯 471
18.5效用理論 474
18.6以目標為導向的行動計划 477
18.7路徑查找 478
18.7.1A*(A—Star) 479
18.7.2動態規避 481
18.8補充書目 482

第19章 多玩家游戲的網絡編程 483
19.1互聯網的工作原理 483
19.1.1Winsock還是Berkeley 484
19.1.2Internet地址 484
19.1.3域名系統 486
19.1.4有用的程序和文件 487
19.2套接字API 488
19.2.1套接字效用函數 488
19.2.2域名服務(DNS)函數 490
19.2.3套接字初始化和關閉 491
19.2.4創建套接字和設置套接字選項 491
19.2.5服務器函數 495
19.2.6套接字讀取和寫入 498
19.3使用套接字制作一款多玩家游戲 499
19.3.1數據包類 500
19.3.2核心套接字類 501
19.3.3用於監聽的套接字類 506
19.3.4套接字管理器類 508
19.4核心客戶端類 515
19.5核心服務器端類 516
19.6將套接字連接到事件系統中 517
19.7如果真的這麼簡單就好了 522

第20章 多道程序設計簡介 523
20.1多道程序設計是什麼 523
20.2創建線程 525
20.3進程同步 527
20.3.1測試與置位、信號量和互斥 528
20.3.2Windows臨界區 528
20.4有趣的線程問題 530
20.5線程安全 531
20.6GameCode4中的多線程類 531
20.6.1RealtimeProcess類 532
20.6.2從實時進程發送事件 534
20.6.3接收實時進程中的事件 537
20.7Zip文件的后台解壓縮 538
20.8進一步工作 540
20.9關於硬件 541
20.10關於未來 541
20.11補充書目 542

第21章 「茶壺大戰」游戲 543
21.1制作游戲 544
21.2核心類的創建 545
21.2.1茶壺大戰的應用層 545
21.2.2游戲邏輯 546
21.2.3人類玩家的游戲視圖 553
21.3游戲事件 556
21.4游戲玩法 556
21.4.1關卡的加載 557
21.4.2主體管理器 558
21.4.3發送和接收事件 560
21.4.4進程 562
21.5留給讀者的練習 563

第22章 C#中簡單的游戲編輯器 565
22.1為什麼要使用C# 565
22.2如何將編輯器組合起來 565
22.3編輯器架構 566
22.3.1應用層 566
22.3.2編輯器的邏輯類 567
22.3.3編輯器視圖 568
22.3.4訪問游戲引擎的函數 569
22.3.5創建DLL 578
22.3.6編輯器架構的封裝 578
22.4C#編譯器應用程序 579
22.4.1托管代碼和非托管代碼之間的區別 580
22.4.2NativeMethods類 581
22.4.3Program類 582
22.4.4MessageHandler類 583
22.5C#編輯器用戶界面 585
22.5.1EditorForm類 585
22.5.2ActorComponentEditor類 595
22.6后續工作 603
22.7補充材料 604

第23章 對游戲進行調試和分析 605
23.1處理錯誤的藝術 606
23.2調試基礎 607
23.2.1調試器的使用 609
23.2.2安裝Windows符號文件 611
23.2.3對全屏游戲進行調試 612
23.2.4遠程調試 613
23.2.5對小存儲器轉儲文件(Minidump)進行調試 615
23.3圖形調試和着色器調試 616
23.4調試技術 617
23.4.1調試是一次實驗 617
23.4.2重現bug 619
23.4.3降低復雜度 620
23.4.4設置下一條語句 620
23.4.5匯編級調試 621
23.4.6給代碼添加調料 623
23.4.7提取調試信息 624
23.4.8Lint和其他代碼分析器 625
23.4.9Nu—Mega的BoundsChecker和運行時分析器 625
23.4.10消失的bug 625
23.4.11調整數值 626
23.4.12caveman調試 626
23.4.13當一切方法都失敗時 627
23.5創建錯誤日志系統 628
23.6不同類型的bug 633
23.6.1內存泄漏和堆損壞 634
23.6.2游戲數據損壞 637
23.6.3堆棧損壞 638
23.6.4剪切和粘貼bug 639
23.6.5空間不足 639
23.6.6只在發布模式(ReleaseMode)中出現的bug 640
23.6.7惹是生非的多線程 640
23.6.8奇怪的bug 641
23.7性能分析 642
23.7.1性能的測量 642
23.7.2代碼的優化 642
23.7.3折中方案 643
23.7.4過度優化 644
23.8結束小思 644
23.9補充書目 644

第24章 駛向結束 645
24.1問題的整理 645
24.1.1質量 646
24.1.2代碼 650
24.1.3內容 653
24.2應付大麻煩 655
24.2.1項目進度嚴重拖延 655
24.2.2人事相關問題 661
24.2.3競爭對手會置你於死地 662
24.2.4到底有沒有出路 663
24.2.5最后一個建議:不要驚慌 664
24.3光明就在前方—畢竟這不是一場訓練 664
24.3.1測試存檔 664
24.3.2補丁build或產品演示 665
24.3.3事后分析 665
24.3.4如何利用你的時間 666
網路書店 類別 折扣 價格
  1. 新書
    87
    $517