內容簡介
本書主要介紹用C++進行3D電子遊戲編程的方法,並深入探討遊戲開發人員在實際工作中所使用的相關技術和系統。全書分為14章和1個附錄(附錄A)。第1~5章主要介紹2D電子遊戲的內容和電子遊戲編程的核心頸凝概念;第6~14章主要介紹並講解3D電子遊戲編程的內容,其中第8章的內容既適用於2D環境下的電子遊戲編程,也適用於3D環境棕厚悼驗下的電子遊戲編芝辣棕程;附錄A涵蓋一些C++中的重要概念,包括引用、佇列、指針、動態分配等。
本書以實際遊戲項目為主線,詳細講解了開發相應項目所需的知識及開發設計過程中採用的實現方法。
本書適合使用C++語言進行電子遊戲開發的初級或中級開發人員閱讀,也可供使用其他語言開發遊戲(或使用其他遊戲開發框架開發遊戲)的技術人員參考寒糊獄阿,還可作為高等院校相關專業的參考用書(本書所涵蓋內容相當於大學課程設定中一個半學期的教學量)。
圖書目錄
第 1章 遊戲編程概述 1
1.1 設定開發環境 1
1.1.1 Microsoft Windows 1
1.1.2 Apple macOS 2
1.2 獲取本書的原始碼 2
1.4 遊戲循環和Game類 3
1.4.1 關於“幀”的道白鍵詳解 3
1.4.2 實現一個骨骼Game類 5
1.4.4 基本輸入處理 9
1.5 基本的2D圖形 11
1.5.1 顏色緩衝區 12
1.5.2 雙緩衝區 13
1.5.3 實現基本的2D圖形 15
1.5.4 繪製牆壁、一個球和一支球拍 17
1.6 更新遊戲 19
1.6.1 真實時間和遊戲時間 19
1.6.2 根據增量時間的遊戲邏輯 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 將遊戲對象融入遊戲循環中 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 創建一個BasicMoveComponent類 56
3.2.2 創建一個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 創建一個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 狀態機行為 71
4.1.1 設計狀態機 71
4.1.2 基本狀態機的實現 72
4.1.3 以類表示的狀態 73
4.2 尋路 76
4.2.1 圖形 77
4.2.2 廣度優先搜尋 78
4.2.3 heuristics函式 81
4.2.4 貪婪最佳優先搜尋 83
4.2.5 A*搜尋 87
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 頂點和索引緩衝區 106
5.3 著色器 110
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 變換為世界空間,再現 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.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 四元數 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 實現光照 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 創建一個音頻系統 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 創建AudioComponent類,使角色和聲音事件相關聯 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章 輸入系統 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 動態對象 263
10.3 向遊戲代碼添加碰撞 265
10.3.1 BoxComponent類 266
10.3.2 PhysWorld類 267
10.3.3 使用SegmentCast函式的球彈碰撞檢測 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 動畫數據 307
12.1.4 蒙皮 308
12.2 實現骨骼動畫 309
12.2.1 使用帶有骨骼蒙皮的頂點屬性進行繪製 310
12.2.2 載入骨架數據 314
12.2.3 載入動畫數據 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.2 向紋理進行渲染 332
13.2.1 創建紋理 333
13.2.2 創建一個Framebuffer對象 333
13.2.3 渲染到Framebuffer對象 335
13.2.4 在HUD中繪製後視鏡紋理 337
13.3 延遲著色 338
13.3.1 創建G-Buffer類 339
13.3.2 寫入G緩衝區 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章 級別檔案和二進制數據 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.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
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 創建一個BasicMoveComponent類 56
3.2.2 創建一個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 創建一個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 狀態機行為 71
4.1.1 設計狀態機 71
4.1.2 基本狀態機的實現 72
4.1.3 以類表示的狀態 73
4.2 尋路 76
4.2.1 圖形 77
4.2.2 廣度優先搜尋 78
4.2.3 heuristics函式 81
4.2.4 貪婪最佳優先搜尋 83
4.2.5 A*搜尋 87
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 頂點和索引緩衝區 106
5.3 著色器 110
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 變換為世界空間,再現 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.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 四元數 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 實現光照 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 創建一個音頻系統 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 創建AudioComponent類,使角色和聲音事件相關聯 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章 輸入系統 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 動態對象 263
10.3 向遊戲代碼添加碰撞 265
10.3.1 BoxComponent類 266
10.3.2 PhysWorld類 267
10.3.3 使用SegmentCast函式的球彈碰撞檢測 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 動畫數據 307
12.1.4 蒙皮 308
12.2 實現骨骼動畫 309
12.2.1 使用帶有骨骼蒙皮的頂點屬性進行繪製 310
12.2.2 載入骨架數據 314
12.2.3 載入動畫數據 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.2 向紋理進行渲染 332
13.2.1 創建紋理 333
13.2.2 創建一個Framebuffer對象 333
13.2.3 渲染到Framebuffer對象 335
13.2.4 在HUD中繪製後視鏡紋理 337
13.3 延遲著色 338
13.3.1 創建G-Buffer類 339
13.3.2 寫入G緩衝區 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章 級別檔案和二進制數據 357
14.1 級別檔案載入 357
14.1.1 載入遊戲的全局屬性 358
14.1.2 載入角色 362
14.1.3 載入組件 366
14.2 保存級別檔案 370
14.2.1 保存級別檔案的全局屬性 371