第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
· · · · · · (
收起)