本書詳細綜述了應用在許多重要視頻游戲編程中的算法和技術。書中采用了一種獨立于平臺和結構的方法,能協助開發幾乎任何風格、語言和框架的游戲,并展現2D和3D圖像、物理、人工智能、相機等工作的基本技術。書中的每個概念都是用C#、Java或 C++程序員直觀明白的偽代碼闡述的,并且作者已經改進和證實過這些偽代碼。本書最后作者詳細分析了兩個完整的游戲,清楚展現了前面章節講到的很多技術和算法。
1.本書全面介紹游戲行業中會用到的算法和技術,包括2D、3D圖形學,物理,人工智能,攝像機等多個方面。
2.采用了獨特的與平臺架構無關的方法來展開開發,適用于任何游戲、風格、語言、框架。
3.每個概念的展示都使用了偽代碼,并經過驗證,容易被程序員們理解。
4.本書最后以兩款完整游戲作為總結,使用了很多書中介紹的算法和技術,全部源代碼都可下載。
5.請回顧每一章課后習題,能鞏固所學,助你前進。
劉瀚陽,騰訊互娛高級工程師,Life-long級別的游戲玩家。興趣使然,大學本科就選擇了游戲專業,畢業后一直專注于游戲研發。參與過游戲引擎、大型商業MMORPG、中小型手游的開發。擅長游戲架構設計與開發,代碼寫得賊溜,略懂產品。一直在游戲行業中默默前進,希望有一天也能做出一款偉大的游戲。
Sanjay Madhav 是南加利福尼亞大學的講師,在那里他教授了幾門與游戲編程相關的課程。而在全職加入南加利福尼亞大學之前,他作為程序員在許多公司工作過,包括Electronic Arts、Neverso 及Pandemic Studios。雖然他在很多系統上都有著豐富的開發經驗,但是他*感興趣的還是游戲機制的開發。他所參與的游戲包括《榮譽勛章:太平洋突襲》(Tony Hawk’s Project 8)、《指環王:征服》(Lord of the Rings: Conquest)和The Saboteur。
從2008 年開始,Sanjay 在南加利福尼亞大學兼職,當時他還是全職游戲程序員當中的一員。在2009 年年末Pandemic Studios 關閉之后,他決定專注于教越來越重要的游戲程序員。他的主要課程是面向本科生的游戲編程課程,而且已經連續教了10 個學期。
目錄
第1章 游戲編程概述1
游戲編程的發展2
Atari時期(1977―1985年) 2
NES和SNES 時期(1985―1995年) 3
PS和PS2時期(1995―2005年) 3
Xbox360、PS3和Wii時期(2005―2013年) 3
游戲的未來4
游戲循環4
傳統的游戲循環4
多線程下的游戲循環6
時間和游戲8
真實時間和游戲時間8
通過處理時間增量來表示游戲邏輯8
游戲對象10
游戲對象的類型10
游戲循環中的游戲對象11
總結13
習題13
相關資料14
游戲編程的發展14
游戲循環14
游戲對象14
第2章 2D 圖形 15
2D渲染基礎16
CRT顯示器基礎16
像素緩沖區和垂直同步17
精靈18
繪制精靈18
動畫精靈20
精靈表單23
滾屏24
單軸滾屏24
無限滾屏26
平行滾屏27
四向滾屏28
磚塊地圖29
簡單的磚塊地圖29
斜視等視角磚塊地圖31
總結32
習題32
相關資料33
Cocos2D 33
SDL 33
第3章 游戲中的線性代數 34
向量35
加法36
減法37
長度、單位向量和正規化38
標量乘積39
點乘40
問題舉例:向量反射41
叉乘43
問題舉例:旋轉一個2D 角色45
線性插值46
坐標系47
矩陣48
加法/減法48
標量乘法49
乘法49
逆矩陣50
轉置50
用矩陣變換3D 向量51
總結52
習題52
相關資料53
第4章 3D圖形54
基礎55
多邊形55
坐標系55
模型坐標系56
世界坐標系56
視角/攝像機坐標系60
投影坐標系62
光照與著色64
顏色64
頂點屬性65
光照67
Phong光照模型68
著色70
可見性71
再探畫家算法72
深度緩沖區73
再探世界變換74
四元數75
3D游戲對象的表示77
總結77
習題77
相關資料78
第5章 游戲輸入 79
輸入設備80
數字輸入80
模擬輸入82
基于事件的輸入系統84
基礎事件系統85
一個更復雜的系統87
移動設備輸入89
觸屏和手勢89
加速器和陀螺儀91
其他移動設備輸入92
總結92
習題92
相關資料93
第6章 聲音94
基本聲音95
原始數據95
聲音事件95
3D聲音98
監聽者和發射者98
衰減100
環繞聲100
數字信號處理101
常見數字信號處理效果102
區域標記102
其他聲音話題103
多普勒效應103
聲音遮擋104
總結105
習題106
參考資料106
第7章 物理107
平面、射線和線段108
平面108
射線和線段109
碰撞幾何體110
包圍球110
軸對齊包圍盒111
朝向包圍盒111
膠囊體112
凸多邊形113
組合碰撞幾何體113
碰撞檢測113
球與球的交叉113
AABB與AABB交叉114
線段與平面交叉115
線段與三角片交叉117
球與平面交叉119
球形掃掠體檢測120
響應碰撞124
優化碰撞125
基于物理的移動126
線性力學概覽127
可變時間步長帶來的問題128
力的計算128
歐拉和半隱式歐拉積分129
Verlet積分法129
其他積分方法130
角力學130
物理中間件130
總結131
習題131
相關資料131
第8章 攝像機 132
攝像機的類型133
固定攝像機133
第一人稱攝像機134
跟隨攝像機134
場景切換攝像機135
透視投影135
視場136
寬高比137
攝像機的實現138
基礎的跟隨攝像機138
彈性跟隨攝像機139
旋轉攝像機142
第一人稱攝像機144
樣條攝像機146
攝像機支持算法149
攝像機碰撞149
揀選149
總結151
習題151
相關資料151
第9章 人工智能152
“真”AI 與游戲AI 153
尋路153
搜索空間的表示154
可接受的啟發式算法156
貪婪最佳優先算法157
A*尋路161
Dijkstra算法163
基于狀態的行為164
AI的狀態機164
基礎的狀態機實現165
狀態機設計模式167
策略和計劃168
策略168
計劃169
總結170
習題170
相關資料172
通用AI 172
尋路172
狀態172
第10章 用戶界面 173
菜單系統174
菜單棧174
按鈕175
打字176
HUD元素177
路點箭頭177
準心180
雷達181
其他需要考慮的UI 問題186
支持多套分辨率186
本地化187
UI中間件189
用戶體驗189
總結189
習題189
相關資料190
第11章 腳本語言和數據格式191
腳本語言192
折中192
腳本語言的類型193
Lua194
UnrealScript 195
可視化腳本系統196
實現一門腳本語言197
標記化197
正則表達式198
語法分析199
代碼的執行和生成200
數據格式202
折中202
二進制格式203
INI 203
XML 203
JSON 204
案例學習:《魔獸世界》中的UI Mod 205
布局和事件205
行為206
問題:玩家自動操作206
問題:UI 兼容性206
結論207
總結207
習題207
相關資料208
第12章 網絡游戲 209
協議210
IP 210
ICMP 211
TCP 212
UDP 214
網絡拓撲215
服務器/客戶端216
點對點218
作弊219
信息作弊219
游戲狀態作弊220
中間人攻擊220
總結221
習題221
相關資料222
第13章 游戲示例:橫向滾屏者(iOS)223
概覽224
Objective-C 224
Cocos2D 225
代碼分析226
AppDelegate 226
MainMenuLayer 227
GameplayScene 227
ScrollingLayer 227
Ship 228
Projectile 229
Enemy 229
ObjectLayer 229
練習230
總結231
第14章 游戲示例:塔防(PC/Mac) 232
概覽233
C# 233
XNA 235
MonoGame 235
代碼分析236
設置236
單件236
游戲類237
游戲狀態237
游戲對象238
關卡239
計時器239
尋路240
攝像機和投影241
輸入241
物理242
本地化242
圖形242
聲音243
用戶界面243
練習245
總結246
附錄A 習題答案247
附錄B 對開發者有用的工具260