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