
內容簡介
本書主要介紹基於Rust語言開發遊戲的方法,還介紹了適用於Unity、Unreal等遊戲引擎的技巧。
本書先設置開發環境,然後引導讀者製作自己的Flappy Bird,借實例講解Rust語言的基礎知識。全書引導讀者逐步完成一個《地下城爬行者》(Dungeon Crawler)遊戲項目,通過實戰幫助讀者掌握Rust的相關知識,掌握用Bevy開發遊戲的方法,以及在不影響程序調試的情況下運行遊戲係統,對所開發的遊戲進行優化。
本書適合所有對Rust語言感興趣的讀者閱讀,也適合從事遊戲開發的讀者參考。
作者簡介
赫伯特·沃爾弗森(Herbert Wolverson)是一名非常有經驗的程序員,主要從事遊戲開發工作。他在遊戲開發社區非常活躍,為多個開源項目做過貢獻。
目錄
第一部分 初識Rust第1章Rust及其開發環境2
1.1 安裝Rust2
1.1.1 在MicrosoftWindows上安裝Rust3
1.1.2 在其他操作係統上安裝Rust3
1.1.3 完成安裝3
1.1.4 驗證安裝是否成功4
1.1.5 測試Rust能否正常使用5
1.1.6 版本更新5
1.2 安裝並配置開發環境6
1.3 用Cargo管理項目7
1.3.1 為代碼選擇一個主目錄7
1.3.2 用Cargo來開啟一個新項目7
1.3.3 運行Hello,World8
1.3.4 與版本控製係統的集成8
1.4 創建第一個Rust程序9
1.4.1 Cargo的元數據9
1.4.2 Hello,World程序10
1.5 用Cargo來構建、檢查並運行項目11
1.6 修正代碼格式12
1.7 用Clippy來發現常見錯誤13
1.8 用Cargo進行包管理15
1.9 小結16
第2章Rust的第一步17
2.1 創建一個新的項目17
2.2 捕捉用戶輸入17
2.2.1 提示訪客輸入姓名18
2.2.2 用變量存儲姓名18
2.2.3 接收鍵盤輸入19
2.2.4 讀取用戶輸入20
2.2.5 用占位符實現格式化打印21
2.2.6 完整的問候程序21
2.3 將輸入處理邏輯移入函數22
2.4 修剪輸入數據23
2.5 在數組中存儲字符串24
2.5.1 聲明一個數組25
2.5.2 在數組中查找元素26
2.6 用結構體來組織數據27
2.7 用向量來存儲數量可變的數據32
2.7.1 派生調試信息32
2.7.2 用向量代替數組33
2.7.3 用break跳出循環34
2.7.4 為向量添加新元素34
2.8 用枚舉體來實現分類36
2.8.1 枚舉體36
2.8.2 使用枚舉類型和整數類型的數據成員37
2.8.3 將枚舉類型賦值給變量38
2.8.4 枚舉體的匹配38
2.9 小結41
第3章構建第一個Rust遊戲42
3.1 理解遊戲循環42
3.1.1 什麼是bracket-lib以及bracket-terminal44
3.1.2 創建一個使用bracket-lib的新項目45
3.1.3 Hello,bracketTerminal46
3.1.4 存儲狀態46
3.1.5 Codepage437:由IBM擴展的ASCII字符集50
3.2 創建不同的遊戲模態50
3.2.1 根據當前模態做出反應51
3.2.2 play()函數的樁形式52
3.2.3 主菜單52
3.2.4 遊戲結束菜單54
3.2.5 完整的遊戲控製流54
3.3 添加遊戲角色55
3.3.1 渲染遊戲角色56
3.3.2 墜向不可避免的死亡56
3.3.3 扇動翅膀57
3.3.4 實例化玩家57
3.3.5 常量58
3.3.6 完善遊戲程序的play()函數59
3.3.7 扇動翅膀60
3.4 創建障礙物並實現計分邏輯60
3.4.1 渲染障礙物61
3.4.2 一頭撞到牆上62
3.4.3 記錄得分和障礙物的狀態63
3.4.4 在play()函數中加入障礙物和計分邏輯64
3.4.5 將得分顯示在遊戲結束畫麵上64
3.4.6 在重玩遊戲時重置得分和障礙物65
3.4.7FlappyDragon遊戲效果65
3.5 小結65
第二部分 開發地下城探險類遊戲
第4章設計地下城探險類遊戲68
4.1 設計文檔必備的幾個段落標題68
4.1.1 為遊戲命名68
4.1.2 遊戲的簡要介紹68
4.1.3 遊戲劇情69
4.1.4 基本的遊戲流程69
4.1.5 最簡可行產品69
4.1.6 延展目標70
4.2 小結70
第5章編寫地下城探險類遊戲72
5.1 將代碼劃分為模塊72
5.1.1 crate與模塊72
5.1.2 新建一個空的地圖模塊73
5.1.3 模塊的作用域74
5.2 用prelude模塊來管理導入項74
5.3 存儲地下城地圖76
5.3.1 圖塊在程序中的表示方法77
5.3.2 創建一個空地圖77
5.3.3 為地圖建立索引78
5.3.4 渲染地圖79
5.3.5 使用地圖模塊的API80
5.4 加入探險家81
5.4.1 擴展地圖的API接口81
5.4.2 創建玩家角色的數據結構82
5.4.3 渲染玩家角色83
5.4.4 移動玩家角色83
5.4.5 使用玩家模塊的API84
5.5 創建地下城85
5.5.1 編寫地圖生成器模塊86
5.5.2 用石牆把地圖填滿87
5.5.3 開鑿房間87
5.5.4 開鑿走廊88
5.5.5 建造地圖並放置玩家角色91
5.5.6 使用MapBuilder組件的API91
5.6 Graphics,Camera,Action92
5.6.1 地下城所使用的
ProgrammerArt92
5.6.2 圖層94
5.6.3 製作攝像機95
5.6.4 用攝像機來渲染地圖97
5.6.5 將玩家角色關聯到
攝像機98
5.6.6 清理圖層,並關聯函數和攝像機98
5.7 小結99
第6章創建地下城居民100
6.1 名詞解釋100
6.2 用組件編排出實體101
6.3 安裝並使用Legion102
6.3.1 將Legion添加到prelude中103
6.3.2 刪除一些老代碼103
6.3.3 創造遊戲世界104
6.4 編排出玩家角色105
6.5 使用係統來實現複雜的邏輯107
6.5.1 多個文件組成的模塊108
6.5.2 理解什麼是查詢109
6.5.3 將處理玩家輸入作為一個係統111
6.5.4 批量渲染114
6.5.5 地圖渲染係統115
6.5.6 實體渲染係統116
6.6 添加怪獸119
6.7 碰撞檢測121
6.8 小結123
第7章與怪獸交替前行124
7.1 讓怪獸隨機遊走124
7.2 在回合製的遊戲中移動Entity127
7.2.1 存儲回合狀態127
7.2.2 輪番上陣128
7.2.3 拆分調度器129
7.2.4 結束玩家的回合131
7.3 發送意圖消息133
7.3.1 實體還可以當作消息來
使用133
7.3.2 接收消息並進行移動133
7.3.3 簡化玩家輸入處理邏輯135
7.3.4 怪獸的移動消息137
7.4 小結137
第8章生命值和近身戰鬥138
8.1 為實體賦予生命值138
8.2 添加平視顯示係統139
8.2.1 添加另一個渲染圖層139
8.2.2 渲染平視顯示區141
8.2.3 為怪獸添加名字143
8.2.4 為怪獸添加名稱和生命值143
8.2.5 用懸浮提示來區分怪獸145
8.2.6 注冊各個係統147
8.3 實現戰鬥功能148
8.3.1 刪除碰撞檢測係統148
8.3.2 表示攻擊意圖148
8.3.3 玩家主動攻擊149
8.3.4 創建戰鬥係統151
8.3.5 怪獸的反擊153
8.3.6 運行各個係統154
8.4 將等待作為一種策略155
8.5 小結157
第9章勝與負158
9.1 創造更聰明的怪獸158
9.1.1 標記新的行為159
9.1.2 通過trait來支持尋路160
9.1.3 映射地圖160
9.1.4 在地圖中導航161
9.1.5 具備熱成像追蹤能力的怪獸164
9.1.6 定位玩家角色165
9.1.7 迪傑斯特拉圖165
9.1.8 追殺玩家角色167
9.1.9 縮減玩家角色的生命值169
9.2 實現遊戲結束畫麵170
9.2.1 增加表示遊戲結束的回合狀態170
9.2.2 檢測遊戲何時結束171
9.2.3 顯示遊戲結束畫麵172
9.3 尋找亞拉的護身符173
9.3.1 構建護身符173
9.3.2 安放護身符174
9.3.3 判斷玩家是否勝利177
9.3.4 恭賀玩家取得勝利178
9.4 小結181
第10章視場182
10.1 定義實體的視場182
10.1.1 圖塊的透明度183
10.1.2 用HashSet來整理數據183
10.1.3 用組件來存儲可見圖塊的集合184
10.1.4 計算視場187
10.1.5 渲染視場189
10.1.6 隱藏實體191
10.1.7 更新視場192
10.2 限製怪獸的視場193
10.3 添加空間記憶195
10.3.1 逐步揭示地圖195
10.3.2 更新地圖196
10.3.3 渲染記憶中的地圖196
10.3.4 視場的其他用途198
10.4 小結199
第11章更具可玩性的地下城200
11.1 創建trait200
11.1.1 拆分地圖建造器201
11.1.2 用MapBuilder來提供地圖建造服務201
11.1.3 定義代表架構的trait202
11.1.4 用參考實現來測試trait203
11.1.5 調用空地圖的架構205
11.1.6 修改房間生成器206
11.2 用元胞自動機算法來創建地圖207
11.2.1 元胞自動機理論207
11.2.2 實現元胞自動機208
11.2.3 生成一些隨機噪聲209
11.2.4 計算鄰居的數量209
11.2.5 用迭代消除混亂210
11.2.6 放置玩家角色211
11.2.7 在沒有房間的情況下生成怪獸213
11.2.8 建造地圖214
11.2.9 調用基於元胞自動機的地圖架構214
11.3 用Drunkard’sWalk算法來創建地圖215
11.3.1 編寫初始代碼216
11.3.2 用喝醉的礦工開鑿洞穴216
11.3.3 評估地圖建造的完成度217
11.3.4 一直挖到地圖生成完畢218
11.3.5 激活新的地圖類型220
11.3.6 隨機挑選架構220
11.4 在地圖中使用預製區域221
11.4.1 手工打造的地下城221
11.4.2 放置金庫222
11.5 小結226
第12章地圖的主題風格227
12.1 為地下城引入主題風格227
12.1.1 用trait實現地下城主題風格228
12.1.2 創建一片森林229
12.2 使用主題風格進行渲染230
12.2.1 挑選一個主題風格231
12.2.2 使用選中的主題風格232
12.2.3 根據主題風格來渲染地圖233
12.3 釋放想象力235
12.4 小結235
第13章背包和道具236
13.1 設計物品236
13.1.1 用組件來描述物品236
13.1.2 生成藥水和地圖237
13.2 管理背包239
13.2.1 撿起物品240
13.2.2 顯示背包物品241
13.2.3 發送物品激活消息243
13.2.4 激活物品245
13.2.5 應用治療特效245
13.2.6 迭代物品並應用效果246
13.2.7 處理療傷事件247
13.2.8 添加到調度器248
13.2.9 去掉通過休息恢複生命值249
13.3 小結250
第14章更深的地下城251
14.1 為地圖添加樓梯251
14.1.1 生成並渲染樓梯251
14.1.2 更新地下城的行走邏輯252
14.1.3 生成樓梯並替代護身符253
14.2 追蹤遊戲關卡255
14.2.1 關卡切換狀態256
14.2.2 切換關卡257
14.2.3 找到玩家角色258
14.2.4 標記需要保留的實體258
14.2.5 刪除其餘的實體259
14.2.6 將視場設置為髒259
14.2.7 創建新地圖260
14.2.8 將玩家角色放置在新地圖中260
14.2.9 創建亞拉的護身符或者樓梯260
14.3 在平視顯示區中顯示當前關卡261
14.4 小結262
第15章戰鬥係統和戰利品263
15.1 設計數據驅動的地下城263
15.1.1 讀取地下城的數據265
15.1.2 擴展Spawner模塊266
15.1.3 映射並加載模板266
15.1.4 用數據驅動的方式生成實體268
15.1.5 新春大掃除272
15.2 擴展戰鬥係統274
15.2.1 由武器和爪子造成的傷害274
15.2.2 傷害值組件276
15.2.3 產生一些傷害277
15.2.4 探險家不是八爪魚278
15.3 添加更多寶劍279
15.4 小結280
第16章最後的步驟和潤色281
16.1 打包遊戲以進行分發281
16.1.1 開啟發布模式和鏈接時
優化281
16.1.2 分發遊戲282
16.2 開發屬於自己的地下城探險類遊戲283
16.3 更多內容283
16.4 小結284
第三部分 其他資源
附錄AASCII/Codepage437對照表286
附錄B簡短的遊戲設計文檔287
附錄CRust語法速查表294
······
最後修改:2024 年 12 月 28 日
© 允許規範轉載
