本書主要介紹用C 進行3D電子游戲編程的方法,并深入探討游戲開發(fā)人員在實際工作中所使用的相關技術和系統(tǒng)。全書分為14章和1個附錄(附錄A)。第1~5章主要介紹2D電子游戲的內容和電子游戲編程的核心概念;第6~14章主要介紹并講解3D電子游戲編程的內容,其中第8章的內容既適用于2D環(huán)境下的電子游戲編程,也適用于3D環(huán)境下的電子游戲編程;附錄A涵蓋一些C 中的重要概念,包括引用、隊列、指針、動態(tài)分配等。 本書以實際游戲項目為主線,詳細講解了開發(fā)相應項目所需的知識及開發(fā)設計過程中采用的實現(xiàn)方法。 本書適合使用C 語言進行電子游戲開發(fā)的初級或中級開發(fā)人員閱讀,也可供使用其他語言開發(fā)游戲(或使用其他游戲開發(fā)框架開發(fā)游戲)的技術人員參考,還可作為高等院校相關專業(yè)的參考用書(本書所涵蓋內容相當于大學課程設置中一個半學期的教學量)。
許多領先的游戲開發(fā)工作室均以C 作為主要編程語言,多用它來開發(fā)龐大的代碼庫以及維護和改進游戲程序。在招聘相關開發(fā)人員時,他們也會著重考量應聘者對C 的掌握程度。 1. 本書是作者基于自己在美國南加州大學開設的游戲編程課程編寫的。 2. 使用應用廣泛的人工智能算法構建更加智能的游戲。 3. 著重介紹實用的實踐方法,注重揭示游戲開發(fā)背后的數(shù)學原理。
Sanjay Madhav畢業(yè)于美國南加州大學,獲得了該校的計算機科學學士學位和碩士學位,目前在南加州大學攻讀計算機科學博士學位。自2008年起,他一直在南加州大學任教,主講多門編程和電子游戲編程課程。在此之前,他曾在多個電子游戲開發(fā)公司工作。他所服務過的公司有Electronic Arts、Neversoft和Pandemic Studios,所參與開發(fā)的游戲包括《榮譽勛章之血戰(zhàn)太平洋(Medal of Honor Pacific Assault)》《托尼霍克極限滑板8(Tony Hawks Project 8)》《指環(huán)王:征服(Lord of the Rings: Conquest)》和《破壞者(The Saboteur)》。Sanjay還是《Game Programming Algorithms and Techniques》的作者和《Multiplayer Game Programming》的共同作者。
第 1章 游戲編程概述 1
1.1 設置開發(fā)環(huán)境 1
1.1.1 Microsoft Windows 1
1.1.2 Apple macOS 2
1.2 獲取本書的源代碼 2
1.3 C 標準庫以外的程序庫 2
1.4 游戲循環(huán)和Game類 3
1.4.1 關于幀的詳解 3
1.4.2 實現(xiàn)一個骨骼Game類 5
1.4.3 Main函數(shù) 8
1.4.4 基本輸入處理 9
1.5 基本的2D圖形 11
1.5.1 顏色緩沖區(qū) 12
1.5.2 雙緩沖區(qū) 13
1.5.3 實現(xiàn)基本的2D圖形 15
1.5.4 繪制墻壁、一個球和一支球拍 17
1.6 更新游戲 19
1.6.1 真實時間和游戲時間 19
1.6.2 根據(jù)增量時間的游戲邏輯 19
1.6.3 更新球拍的位置 21
1.6.4 更新球的位置 22
1.7 游戲項目 25
1.8 總結 25
1.9 補充閱讀材料 25
1.10 練習題 26
1.10.1 練習題1 26
1.10.2 練習題2 26
第 2章 游戲對象和2D圖形 27
2.1 游戲對象 27
2.1.1 游戲對象的類型 27
2.1.2 游戲對象模型 28
2.1.3 將游戲對象融入游戲循環(huán)中 32
2.2 精靈 34
2.2.1 加載圖像文件 34
2.2.2 繪制精靈 36
2.2.3 動畫精靈 39
2.3 滾動背景 41
2.4 游戲項目 43
2.5 總結 44
2.6 補充閱讀材料 45
2.7 練習題 45
2.7.1 練習題1 45
2.7.2 練習題2 45
2.7.3 練習題3 46
第3章 向量和基礎物理 47
3.1 向量 47
3.1.1 獲得兩點之間的向量:減法 48
3.1.2 向量縮放:標量乘法 49
3.1.3 合并兩個向量:加法 49
3.1.4 確定距離:長度 50
3.1.5 確定方向:單位向量和標準化 51
3.1.6 將角度轉換為前向向量 52
3.1.7 將前向向量轉換為角度:反正切 52
3.1.8 確定兩個向量之間的角度:點積 53
3.1.9 計算法線:叉積 54
3.2 基本運動 56
3.2.1 創(chuàng)建一個BasicMoveComponent類 56
3.2.2 創(chuàng)建一個InputComponent類 59
3.3 牛頓物理學 62
3.3.1 線性力學概述 62
3.3.2 用歐拉積分計算位置 63
3.3.3 關于可變步長的問題 63
3.4 基本碰撞檢測 64
3.4.1 圓與圓的交集 64
3.4.2 創(chuàng)建一個CircleComponent子類 65
3.5 游戲項目 66
3.6 總結 68
3.7 補充閱讀材料 68
3.8 練習題 68
3.8.1 練習題1 69
3.8.2 練習題2 69
3.8.3 練習題3 70
第4章 人工智能 71
4.1 狀態(tài)機行為 71
4.1.1 設計狀態(tài)機 71
4.1.2 基本狀態(tài)機的實現(xiàn) 72
4.1.3 以類表示的狀態(tài) 73
4.2 尋路 76
4.2.1 圖形 77
4.2.2 廣度優(yōu)先搜索 78
4.2.3 heuristics函數(shù) 81
4.2.4 貪婪最佳優(yōu)先搜索 83
4.2.5 A*搜索 87
4.2.6 迪杰斯特拉算法 89
4.2.7 跟隨路徑 90
4.2.8 其他圖形表示法 91
4.3 游戲樹 92
4.3.1 極大極小算法 93
4.3.2 處理不完整的游戲樹 95
4.3.3 -剪枝算法 96
4.4 游戲項目 98
4.5 總結 99
4.6 補充閱讀材料 100
4.7 練習題 100
4.7.1 練習題1 100
4.7.2 練習題2 101
第5章 開放圖形庫(OpenGL) 102
5.1 初始化OpenGL 102
5.1.1 設置OpenGL窗口 102
5.1.2 OpenGL上下文和初始化GLEW 104
5.1.3 渲染幀 105
5.2 三角形基礎 105
5.2.1 為何選擇多邊形 105
5.2.2 標準化設備坐標 106
5.2.3 頂點和索引緩沖區(qū) 106
5.3 著色器 110
5.3.1 頂點著色器 111
5.3.2 片段著色器 111
5.3.3 編寫基本著色器 111
5.3.4 加載著色器 113
5.3.5 繪制三角形 117
5.4 變換基礎 119
5.4.1 對象空間 120
5.4.2 世界空間 120
5.4.3 變換為世界空間 121
5.5 矩陣與變換 124
5.5.1 矩陣乘法 124
5.5.2 使用矩陣來變換點 124
5.5.3 變換為世界空間,再現(xiàn) 126
5.5.4 將世界變換添加到Actor類 128
5.5.5 從世界空間變換到剪輯空間 130
5.5.6 更新著色器以使用變換矩陣 131
5.6 紋理映射 135
5.6.1 加載紋理 136
5.6.2 更新頂點格式 139
5.6.3 更新著色器 140
5.6.4 Alpha混合 143
5.7 游戲項目 145
5.8 總結 145
5.9 補充閱讀材料 146
5.10 練習題 146
5.10.1 練習題1 146
5.10.2 練習題2 146
第6章 3D圖形 147
6.1 3D中的Actor變換 147
6.1.1 3D變換矩陣 147
6.1.2 歐拉角 148
6.1.3 四元數(shù) 149
6.1.4 運行中新的Actor變換 151
6.2 加載3D模型 152
6.2.1 選擇網格模型格式 153
6.2.2 更新頂點屬性 155
6.2.3 加載gpmesh文件 156
6.3 繪制3D網格 157
6.3.1 變換到剪輯空間,重訪 158
6.3.2 走出畫家算法,進入Z緩沖 161
6.3.3 BasicMesh著色器 164
6.3.4 MeshComponent類 164
6.4 光照 167
6.4.1 再訪頂點屬性 167
6.4.2 光照的類型 167
6.4.3 Phong反射模型 169
6.4.4 實現(xiàn)光照 171
6.5 游戲項目 175
6.6 總結 175
6.7 補充閱讀材料 176
6.8 練習題 176
6.8.1 練習題1 176
6.8.2 練習題2 177
第7章 音頻 178
7.1 引導音頻 178
7.1.1 FMOD 179
7.1.2 安裝FMOD軟件 179
7.1.3 創(chuàng)建一個音頻系統(tǒng) 180
7.1.4 儲存庫和事件 182
7.1.5 SoundEvent類 185
7.2 3D位置音頻 188
7.2.1 設置基本偵聽器 189
7.2.2 向SoundEvent類添加位置功能 191
7.2.3 創(chuàng)建AudioComponent類,使角色和聲音事件相關聯(lián) 192
7.2.4 第三人稱游戲中的偵聽器 193
7.2.5 多普勒效應 194
7.3 混合和效果 195
7.3.1 總線 196
7.3.2 快照 196
7.3.3 阻塞 197
7.4 游戲項目 198
7.5 總結 198
7.6 補充閱讀材料 199
7.7 練習題 199
7.7.1 練習題1 199
7.7.2 練習題2 199
第8章 輸入系統(tǒng) 200
8.1 輸入設備 200
8.1.1 輪詢 200
8.1.2 正沿和負沿 201
8.1.3 事件 203
8.1.4 基本InputSystem架構 203
8.2 鍵盤輸入 205
8.3 鼠標輸入 208
8.3.1 鼠標按鍵和鼠標位置 208
8.3.2 相對移動 210
8.3.3 鼠標滾動輪 211
8.4 控制器輸入 212
8.4.1 啟用單一控制器 212
8.4.2 按鍵 213
8.4.3 模擬搖桿和扳機 215
8.4.4 過濾二維中的模擬搖桿 217
8.4.5 支持多個控制器 219
8.5 輸入映射 220
8.6 游戲項目 221
8.7 總結 222
8.8 補充閱讀材料 223
8.9 練習題 223
8.9.1 練習題1 223
8.9.2 練習題2 223
第9章 相機 224
9.1 第 一人稱相機 224
9.1.1 基本的第 一人稱移動 224
9.1.2 無俯仰角度的相機 226
9.1.3 加入俯仰角度的相機 226
9.1.4 第 一人稱模型 228
9.2 跟拍相機 229
9.2.1 基本跟拍相機 229
9.2.2 添加彈簧 231
9.3 軌道相機 233
9.4 樣條曲線相機 236
9.5 逆投影 239
9.6 游戲項目 241
9.7 總結 242
9.8 補充閱讀材料 242
9.9 練習題 242
9.9.1 練習題1 243
9.9.2 練習題2 243
第 10章 碰撞檢測 244
10.1 幾何(體)類型 244
10.1.1 線段 244
10.1.2 平面 247
10.1.3 包圍體 248
10.2 相交測試 252
10.2.1 包含點測試 252
10.2.2 包圍框測試 254
10.2.3 線段相交測試 257
10.2.4 動態(tài)對象 263
10.3 向游戲代碼添加碰撞 265
10.3.1 BoxComponent類 266
10.3.2 PhysWorld類 267
10.3.3 使用SegmentCast函數(shù)的球彈碰撞檢測 269
10.3.4 在PhysWorld類中測試BoxComponent組件間碰撞 270
10.3.5 玩家與墻壁的碰撞檢測 272
10.4 游戲項目 274
10.5 總結 275
10.6 補充閱讀材料 276
10.7 練習題 276
10.7.1 練習題1 276
10.7.2 練習題2 277
10.7.3 練習題3 277
第 11章 用戶界面 278
11.1 字體渲染 278
11.2 用戶界面屏幕 281
11.2.1 用戶界面屏幕棧 282
11.2.2 暫停菜單 284
11.2.3 按鈕 286
11.2.4 對話框 289
11.3 平視顯示器元素 291
11.3.1 添加十字準線 291
11.3.2 添加雷達 293
11.4 本地化 296
11.4.1 使用Unicode 297
11.4.2 添加文本映射 297
11.4.3 其他本地化問題 299
11.5 支持多個分辨率 300
11.6 游戲項目 300
11.7 總結 301
11.8 補充閱讀材料 301
11.9 練習題 302
11.9.1 練習題1 302
11.9.2 練習題2 302
11.9.3 練習題3 302
第 12章 骨骼動畫 303
12.1 骨骼動畫的基礎 303
12.1.1 骨架和姿勢 304
12.1.2 反向綁定姿勢矩陣 307
12.1.3 動畫數(shù)據(jù) 307
12.1.4 蒙皮 308
12.2 實現(xiàn)骨骼動畫 309
12.2.1 使用帶有骨骼蒙皮的頂點屬性進行繪制 310
12.2.2 加載骨架數(shù)據(jù) 314
12.2.3 加載動畫數(shù)據(jù) 315
12.2.4 蒙皮頂點著色器程序 319
12.2.5 更新動畫 321
12.3 游戲項目 323
12.4 總結 324
12.5 補充閱讀材料 325
12.6 練習題 325
12.6.1 練習題1 325
12.6.2 練習題2 325
第 13章 中間圖形 327
13.1 提高紋理質量 327
13.1.1 紋理采樣、再訪 328
13.1.2 紋理分級細化 330
13.1.3 各向異性過濾 331
13.2 向紋理進行渲染 332
13.2.1 創(chuàng)建紋理 333
13.2.2 創(chuàng)建一個Framebuffer對象 333
13.2.3 渲染到Framebuffer對象 335
13.2.4 在HUD中繪制后視鏡紋理 337
13.3 延遲著色 338
13.3.1 創(chuàng)建G-Buffer類 339
13.3.2 寫入G緩沖區(qū) 342
13.3.3 全局光照 344
13.3.4 添加點光源 348
13.3.5 改進和問題 353
13.4 游戲項目 354
13.5 總結 354
13.6 補充閱讀材料 354
13.7 練習題 355
13.7.1 練習題1 355
13.7.2 練習題2 355
第 14章 級別文件和二進制數(shù)據(jù) 357
14.1 級別文件加載 357
14.1.1 加載游戲的全局屬性 358
14.1.2 加載角色 362
14.1.3 加載組件 366
14.2 保存級別文件 370
14.2.1 保存級別文件的全局屬性 371
14.2.2 保存級別文件的角色和組件 372
14.3 二進制數(shù)據(jù) 374
14.3.1 保存二進制文件 375
14.3.2 加載二進制的網格文件 377
14.4 游戲項目 379
14.5 總結 380
14.6 補充閱讀材料 381
14.7 練習題 381
14.7.1 練習題1 381
14.7.2 練習題2 382
附錄A 中級C 回顧 383