《Rust游戏开发实战》封面

内容简介

本书主要介绍基于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 日