前言
Rust是一种系统级编程语言,它既具备与C、C++类似的强大功能,又具备内存安全性,还让并发编程不再令人畏惧,同时能够大幅提升开发效率。它提供了底层硬件开发所需的功能和性能,还提供了一种安全机制来避免很多低级语言易犯的错误。正是由于这些特性,Rust逐渐成了一种非常有竞争力的开发语言,为亚马逊、谷歌、微软以及许多游戏开发公司所应用。
开发游戏是学习Rust的一个很好的方法。不要被那些AAA品质[1]游戏的规模和做工吓倒。小型独立游戏的开发是很有趣的,将游戏开发作为业余兴趣可能会开启你的职业游戏开发生涯,或者其他领域的开发生涯。每个成功的游戏开发者都是从小处着手,逐渐积累技能,直到能够开发自己梦想中的游戏。
[1] AAA品质游戏通常是指由大型工作室开发,有巨额预算资助的游戏。——译者注
本书将通过游戏开发实例引导你学习Rust。在经过一系列案例实践、构建越来越复杂的游戏之后,你将了解如何使用Rust语言进行游戏开发。本书强调务实的“做中学”方法,理论部分篇幅很短,随后便是可供尝试的具体例子。学完本书,你能够掌握Rust语言的基础知识,并为解决更复杂的游戏开发问题做好准备。
读者对象
本书假设你有一些编程经验,并会通过循循善诱的方式介绍Rust和游戏开发的概念。只要你用其他编程语言写过比“Hello, World”更复杂的程序,那么在阅读本书示例时应该会感到非常轻松。
本书适合任何想要学习Rust的读者,包括没有Rust语言基础的人,也非常适合想要尝试游戏开发的Rust开发者。本书并不是单纯的编程语言入门教程,对新入行的(游戏)开发者也可能有所帮助。
本书内容
本书将引导你亲历一个典型的游戏开发过程,并会穿插着讲解Rust的关键概念,力求在构建实际可玩游戏的过程中,让你掌握新知识,增加技能储备。
“第1章 Rust及其开发环境”:Rust之旅由此开启。本章会介绍语言工具链的安装,并在文本编辑器中编写Rust源代码。本章将指引你一步一步地创建“Hello, World”程序,并学习使用诸如Cargo和Clippy之类的Rust工具来提高工作效率。
“第2章 Rust的第一步”:介绍 Rust 开发的基础知识,通过编写一个树屋(treehouse)访客管理系统帮助你提升Rust开发技能。本章涵盖文本输入和输出、使用结构体来组织数据,以及一些Rust核心概念,例如迭代器、模式匹配、if语句、函数和循环。
前两章介绍了制作简单游戏所需的一切知识。从第3章开始,你将正式开始构建游戏。
“第3章 构建第一个Rust游戏”:引导你创建本书的第一个游戏——Flappy Dragon。在此过程中,你会用到前两章学到的知识。
“第4章 设计地下城探险类游戏”:介绍如何规划游戏。本章将介绍如何编写游戏设计文档,从而把粗略的想法转变为一个具有真实可玩性的游戏。你将设计一个Rogue风格的地下城探险类游戏,将粗略的需求逐步细化,并最终得到一个最简可行产品(Minimum Viable Product,MVP)。
“第5章 编写地下城探险类游戏”:开始构建第4章所设计的地下城探险类游戏。本章将介绍随机数、游戏地图的存储结构,以及玩家的交互控制的处理,还将在游戏地图中初步添加与怪兽相关的资源,并介绍如何实现基于图块的图形界面。
“第6章 创建地下城居民”:随着开发的深入,游戏变得越来越复杂。本章会使用实体组件系统(Entity Component Systems,ECS)来控制系统的复杂性、实现代码复用,以及管理游戏中各个实体元素之间的交互关系。本章将使用ECS来实现玩家和怪兽,通过复用不同的系统来减少需要编写的代码数量。在本章结束时,你会得到一个应用了多线程和并发技术的游戏。
“第7章 与怪兽交替前行”:在游戏中添加一个回合制框架,实现玩家和怪兽轮流移动的功能。你将了解到如何设计一个能实现特定游戏规则的游戏框架,并根据游戏的不同环节来切换不同的ECS系统,还将学习如何让怪兽在地图中随意走动。
“第8章 生命值和近身战斗”:为游戏中的实体(玩家和怪兽)赋予生命值,并在玩家角色的上方显示血条。你会了解到如何让怪兽自动搜寻玩家,如何实现一个战斗系统,从而让玩家可以消灭敌人,或者被敌人消灭。
“第9章 胜与负”:增加一个游戏结束画面,以告诉玩家输掉了游戏,当然也会添加游戏胜利的判断逻辑,以及一个祝贺玩家获胜的画面。
“第10章 视场”:在本章之前,游戏玩家的角色是全知全能的——他们可以看到完整的地图。本章介绍视场的概念,以及一种让玩家在探索的过程中逐步熟悉地图的方法。使用ECS系统,能够给怪兽施加相同的视场限制——如果怪兽不知道玩家在哪里,它们就无法“纠缠”玩家。
“第11章 更具可玩性的地下城”:介绍一种新的地图生成算法。本章还会讨论一个更高级的Rust话题——trait,以及如何通过一个通用的程序接口来实现可互换性,这是一个在团队合作开发中非常有用的技能。
“第12章 地图的主题风格”:添加新的地图渲染方法,会用到第11章介绍的trait相关的知识。你可以通过更改地图的图块素材集来把地下城风格变成森林风格或其他风格。
“第13章 背包和道具”:为游戏添加物品功能、背包管理功能,以及升级奖励机制。
“第14章 更深的地下城”:将单层地下城升级为向更深处错综蔓延的地下城。本章将介绍如何用数据表格来把玩家的经验等级和游戏难度关联起来。
“第15章 战斗系统和战利品”:为游戏增加“战利品列表”功能,以及让玩家在探索地下城的过程中不断获得更高级物品的机制。玩家会找到越来越有趣的各种宝剑——在战斗中宝剑将会体现出各自不同的威力。这里将通过更高级的战利品来平衡逐渐增加的游戏难度,同时让你了解到风险-收益曲线在游戏中的应用。
“第16章 最后的步骤和润色”:介绍如何打包并发布前面所编写的游戏,还将介绍一些让游戏变得更加与众不同的方法,并给出进阶学习游戏开发的建议。
本书未涉及的内容
本书侧重于先让你了解实际案例,再向你解释案例中所使用的各种技术的原理,以此讲授理论知识。本书不会深入探讨Rust的各个细节,而是会在引入新概念时告诉你如何去寻找相关的学习资料。
本书不会涉及游戏创意的相关内容,但无论是制作一款伟大的在线对弈游戏还是射击游戏,本书涉及的概念都会让你受益。这些概念很容易应用到其他游戏引擎中,包括Unity、Godot、Unreal和Amethyst等。掌握本书中的相关内容,有助于你更好地开始制作心目中的游戏。
如何阅读本书
如果你是Rust开发新手,那么请按顺序阅读本书的各章内容以及相关的示例。如果你已经比较熟悉Rust语言,那么可以在粗略阅读概述性内容之后直接切入游戏开发部分。即便你是资深的游戏开发者,还是可以从本书中学到很多关于Rust的知识,以及面向数据的设计模式的知识。
不要急于把全书看完,体验学习的过程同样重要。阅读的过程可能会给你带来后续制作游戏的灵感。你不妨在阅读过程中随时记录下想做的事,以及如何用书中介绍的内容去实现这些事。
体例约定
本书的代码以Rust工作区的形式给出,这种做法便于把多个Rust项目放在一起进行管理。书中的代码被划分到如下的目录中:
root /章节名称 /示例名称 /src --- 示例的源代码 /resources --- 示例所附带的其他文件 Cargo.toml --- 配置文件,用来指导Rust的Cargo构建系统构建和运行示例 /src --- 小程序源码,用来提醒你应该进入某个具体案例所在目录而不是在顶级目录中运行示例 Cargo.toml --- 配置文件,用来告诉Rust的Cargo构建系统工作区是由哪些项目组成的
你可以进入“章节名称/示例名称”目录下,然后通过运行cargo run命令来执行示例代码。
书中的代码会标明所引用的源代码路径,这些路径有时会突然切换到本章的另一个代码目录中。这样的设计可以让你在迭代开发的过程中,每一步都有可以运行的完整示例,从而使你更容易跟上本书的节奏。举个例子,你在某一章中可能会看到出自code/FirstStepsWithRust/hello_yourname项目的代码,而在同一章节稍后的地方又会发现出自code/FirstStepsWithRust/treehouse_guestlist_trim/项目的代码。
在线资源
以下罗列的是一些在线资料,希望对你学习Rust语言有所帮助。
● Rust by Example是一本很好的以案例驱动形式来介绍Rust编程语言的书。
● The Rust Programming Language [KN19] 通过提供深入的概念讲解和指导来学习Rust的细节。本书支持在线阅读。
● Rust标准库文档,它详细描述了Rust标准库中的一切内容。这是一份很好的参考资料,当你忘记标准库中某些组件的使用方法时,请查阅Rust标准库文档。
● Reddit的/r/rust和/r/rust_gamedev两个频道提供了优质的学习资源。RoguelikeDev社区则对于开发本书中介绍的地下城类型游戏非常有帮助。Reddit中还有很多指向Discord论坛的链接,你可以在那里结识很多乐于分享的技术人。
小结
无论你想专注于学习Rust还是想涉足游戏开发领域,本书都可以起到很好的帮助作用。无论是完整地开发一款新游戏,还是参与一部分功能的开发,都是令人兴奋的事情,运行游戏,看到所创建的人物动起来,那一刻的快乐是无以言表的。让我们先着手搭建Rust开发环境,然后直接进入第一行Rust代码的编写。
作者自述:我的游戏开发经历
我的成长非常幸运。我父亲教过计算机相关课程,也教了我许多计算机知识。有一天,他带了一台BBC Micro Model B计算机回到家,那真是一个改变我命运的日子!那台计算机有32KB的RAM、彩色显示器,还能从磁带驱动器加载程序!——真是不可思议。我的父母给我买了很多游戏,包括Repton这样的益智游戏和各种复刻的街机游戏,让我的游戏库不断扩大。没过多久,我就萌生了制作游戏的想法,于是父亲便耐心地引导我学习BASIC语言。客观来说,起初我编写的游戏非常糟糕,但这也无关紧要,因为我自己做出了一些东西,并且体会到了向朋友们展示成果的快乐。
早期的BASIC游戏开发经历让我走上了一条有趣的道路。之后我学习了Pascal语言,后来又学习了C和C++语言。我先后学会了为Windows和Linux开发游戏,后来参与完成了几个小组项目,并找到了一份编写商业和网络软件的工作——这很大一部分要归功于我的游戏开发经历。后来,我接触到了Rust语言,发现它是最适合我的。
虽然这本书主要介绍的是Rust和游戏开发方面的内容,但我更希望它能鼓励你去创作一些有趣的东西。