2024三掌柜赠书活动第二十五期:Rust 游戏开发实战

目录

目录

前言

Rust语言概念

[关于《Rust 游戏开发实战》](#关于《Rust 游戏开发实战》)

Rust系统编程的核心点

Rust开发的关键技术和工具

内容简介

作者简介

书中前言/序言

内容介绍

[《Rust 游戏开发实战》全书速览](#《Rust 游戏开发实战》全书速览)

图书目录

结束语


前言

技术圈最近的编程语言新秀当属Rust莫属,Rust是一种现代化的系统编程语言,具有强大的性能、内存安全和并发性,它旨在提供高效的低级控制和抽象,使开发人员能够编写高性能、可靠且安全的系统级应用程序。据悉在 Stack Overflow 的年度开发者调查报告中,Rust 连续多年被评为"最受喜爱的编程语言",越来越多的大公司如谷歌、微软、腾讯等都开始将Rust运用于各类项目中。以及随着游戏行业的蓬勃发展,游戏开发技术也在不断进步,在众多编程语言中,Rust因其高效、安全和并发性强的特点,逐渐在游戏开发领域崭露头角。本文将通过实战的方式,介绍Rust在游戏开发中的应用,帮助读者掌握Rust游戏开发的基本流程和关键技术。

Rust语言概念

作为开发者想必都知道,Rust是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust在语法上和C++类似,设计者想要在保证性能的同时提供更好的内存安全。据悉 Rust最初是由Mozilla研究院的Graydon Hoare设计创造,然后在Dave Herman, Brendan Eich以及很多其他人的贡献下逐步完善的,Rust的设计者们通过在研发Servo网站浏览器布局引擎过程中积累的经验优化了Rust语言和Rust编译器。

还有就是Rust编译器是在MIT License 和 Apache License 2.0双重协议声明下的免费开源软件,另外,Rust已经连续七年(2016,2017,2018,2019,2020, 2021, 2022)在Stack Overflow开发者调查的"最受喜爱编程语言"评选项目中折取桂冠。以及Rust旨在解决C++等语言中的内存安全和并发问题,同时保持高性能,Rust的内存安全特性通过所有权和借用检查机制实现,而并发性则通过轻量级线程和消息传递实现,这些特性使得Rust成为游戏开发领域的理想选择。

关于《Rust 游戏开发实战》

接下来给大家推荐一本关于Rust学习必备的书籍,这是一本关于Rust游戏开发实战的干货图书,一经上市就登上了京东"计算机与互联网"图书排行榜前列。另外,关注本文博主,点赞+收藏本文,且在本文评论区评论"我要入门Rust游戏编程",将选取三名幸运读者送出纸质版《Rust 游戏开发实战》一本,截止时间:2024.06.27。入手《Rust 游戏开发实战》传送门:《Rust游戏开发实战 Unity游戏开发基础与实战Unreal游戏设计教程书籍Rust程序设计计算机软件开发书》【摘要 书评 试读】- 京东图书,个人觉得这本书非常的不错,是一本不可多得的好书,值得拥有去学习。

Rust系统编程的核心点

  1. 内存安全:Rust的所有权系统和借用检查器能够在编译时防止常见的内存错误,如空指针引用、数据竞争等。
  2. 零成本抽象:Rust提供了高级抽象和模块化的编程机制,同时保证在运行时不引入额外的开销。
  3. 高性能:Rust的运行时性能接近于C/C++,并且具备对内存分配和线程管理的精细控制。
  4. 并发性:Rust的并发模型允许开发人员编写安全的并发代码,包括线程安全、跨线程通信等。

Rust开发的关键技术和工具

  1. unsafe关键字:Rust提供了unsafe关键字,用于处理需要绕过编译时检查的底层操作,如访问原始指针和调用不安全的函数。
  2. FFI(Foreign Function Interface):Rust支持与其他语言进行无缝集成,可以直接调用C语言函数和使用C语言的数据结构。
  3. Cargo构建系统:Cargo是Rust的默认构建系统,提供了便捷的项目管理、依赖管理和构建工具等功能。

另外的,Rust游戏开发环境搭建,这包括安装Rust编译器、集成开发环境(IDE)以及相关的游戏开发库。常见的Rust IDE有Visual Studio Code、CLion等,而游戏开发库则有如ggez、Amethyst等。这些库提供了丰富的游戏开发功能,如渲染、输入处理、音频等。

内容简介

本书主要介绍基于Rust语言开发游戏的方法,还介绍了适用于Unity、Unreal等游戏引擎的技巧。 本书先设置开发环境,然后引导读者制作自己的Flappy Bird,借实例讲解Rust语言的基础知识。全书引导读者逐步完成一个《地下城爬行者》(Dungeon Crawler)游戏项目,通过实战帮助读者掌握Rust的相关知识,掌握用Bevy开发游戏的方法,以及在不影响程序调试的情况下运行游戏系统,对所开发的游戏进行优化。 本书适合所有对Rust语言感兴趣的读者阅读,也适合从事游戏开发的读者参考。

作者简介

赫伯特·沃尔弗森(Herbert Wolverson)是一名非常有经验的程序员,主要从事游戏开发工作。他在游戏开发社区非常活跃,为多个开源项目做过贡献。

书中前言/序言

【译者序】"重温儿时游戏梦",我感觉这本书的作者是挺讲情怀的,这也是我看完这本书以后感觉它与众不同的一点。这本书不是死板的教程,更像是作者在给你讲故事,讲怎么做好一个游戏,怎么在此过程中学习Rust编程,有点"边玩边学"的感觉。

内容介绍

本书以《地下城爬行者》这款游戏的开发过程,为我们讲述 Rust 的语言特性与游戏开发技巧。

书中先是说明了 Rust 开发环境的搭建和基础语法的学习,使读者能够快速理解并运用 Rust 的核心概念,如所有权、借用和模式匹配。接着介绍 Cargo 作为包管理工具和构建工具的使用,以及 Clippy 等代码分析工具,帮助读者提高编码效率和代码质量。

书中还深入介绍了实体组件系统(ECS),说明如何使用 ECS 来管理游戏逻辑,实现代码复用,并简化复杂系统的开发。探索 Rust 的高级特性,如 trait 和泛型,展示如何通过它们实现代码的模块化和可重用性。

在游戏设计环节,通过创建游戏设计文档,将游戏概念具体化,引导读者规划和设计游戏,包括游戏机制和最简可行产品(MVP)的确定。

编码实践从最简单的"Hello, World"程序开始,以层层推进的方式构建具有图形界面的完整游戏。

书中详细讲解如何实现游戏的关键机制,包括玩家控制、回合制移动、战斗系统、生命值管理,以及游戏的胜利和失败条件。介绍如何设计和实现不同主题的地图,以及如何通过地图生成算法创造出具有挑战性的地下城环境。

说明如何为游戏添加背包系统、道具管理和升级奖励机制,增加游戏的深度和可玩性。在游戏开发接近尾声时,讨论如何打包和发布游戏,同时提供进阶开发技巧和建议。

怎么样,学完这本书,你是不是体会到了 Rust 的强大之处?现在你不仅轻松掌握了 Rust,第一个游戏也开发成功!

《Rust 游戏开发实战》全书速览

图书目录

第一部分 初识Rust

第 1章 Rust及其开发环境 2

1.1 安装Rust 2

1.1.1 在Microsoft Windows上安装Rust 3

1.1.2 在其他操作系统上 安装Rust 3

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,World 8

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-terminal 44

3.1.2 创建一个使用bracket-lib的新项目 45

3.1.3 Hello,bracket Terminal 46

3.1.4 存储状态 46

3.1.5 Codepage 437: 由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.7 Flappy Dragon游戏效果 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 使用地图模块的API 80

5.4 加入探险家 81

5.4.1 扩展地图的API接口 81

5.4.2 创建玩家角色的数据结构 82

5.4.3 渲染玩家角色 83

5.4.4 移动玩家角色 83

5.4.5 使用玩家模块的API 84

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组件的API 91

5.6 Graphics,Camera,Action 92

5.6.1 地下城所使用的Programmer Art 92

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 安装并使用Legion 102

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 在回合制的游戏中移动Entity 127

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 创建trait 200

11.1.1 拆分地图建造器 201

11.1.2 用MapBuilder来提供地图 建造服务 201

11.1.3 定义代表架构的trait 202

11.1.4 用参考实现来测试 trait 203

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's Walk算法来创建地图 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

第三部分 其他资源

附录A ASCII/Codepage 437对照表 286

附录B 简短的游戏设计文档 287

附录C Rust语法速查表 294

结束语

通过上面的介绍,想必大家都知道Rust是一种强大的系统编程语言,具备内存安全、高性能和并发性等关键特点,尤其是Rust在游戏开发中的强大功能和灵活性,Rust不仅提供了高效的性能和安全的内存管理机制,还通过丰富的游戏开发库和工具链降低了游戏开发的门槛,开发人员可以编写可靠、高效且安全的游戏应用程序。上文简要介绍了Rust开发的基本概念、核心特点、关键技术和实践案例,并展望了Rust系统编程的挑战和未来发展方向。希望本文对读者了解Rust开发的基本概念和游戏应用场景有所帮助,并激发对Rust的兴趣和探索,通过介绍,读者可以深入了解Rust系统编程的更多细节,并将其应用于实际的游戏开发中,从而构建高性能、可靠和安全的软件系统。在未来,随着Rust社区的不断壮大和技术的不断发展,Rust在游戏开发领域的应用将会更加广泛和深入。

相关推荐
码农飞飞2 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货2 小时前
Rust 的简介
开发语言·后端·rust
qq_172805593 小时前
RUST学习教程-安装教程
开发语言·学习·rust·安装
monkey_meng3 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
新知图书4 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
fqbqrr8 小时前
2411rust,实现特征
rust
码农飞飞8 小时前
详解Rust枚举类型(enum)的用法
开发语言·rust·match·枚举·匹配·内存安全
一个小坑货14 小时前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet2714 小时前
【Rust练习】22.HashMap
开发语言·后端·rust
VertexGeek16 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust