Roguelike In Rust 05: 生成地牢
这一节我们将会创建一个地牢,地牢由不同的房间组成,房间与房间之间是联通的,玩家可以行走。下面是最终运行效果图。 ...
这一节我们将会创建一个地牢,地牢由不同的房间组成,房间与房间之间是联通的,玩家可以行走。下面是最终运行效果图。 ...
接着上一节的内容,这一节将创建地图,然后玩家可以在地图中行走。地图分为可行走区域和不可行走区域。我们可以认为地图是由一个一个的格子组成。 先看一下最终的效果 ...
对于游戏开发者,可能或多或少听说过或者使用过 ECS 的结构。现在大多数游戏使用的还是面向对象的模式,面向对象编程并没有什么问题,但是在游戏开发过程中,当游戏不断的超出原有的设计时,从整个工程的扩展来说,ECS 拥有更好的扩展性。 下面是一个面向对象的例子 BaseEntity Monster MeleeMob OrcWarrior ArcherMob OrcArcher BaseEntity 是一个基类,包含了基本的数据和代码,用于表示地图上的一个实体。Monster 是一个怪物,MeleeMob 是一个近战单位,它会发现近处的目标,然后干掉它。ArcherMob 是一个可以远程攻击的单位。完成这样一个实体逻辑,可能首先需要按照不同的单位,将逻辑分开,并且抽出共同的逻辑,放到基类中。如果这时增加了一个兽人的逻辑,它即可以近战,又可以远程,并且在完成某些任务时,会变得更友好,怎么办?那就改逻辑呗,继续抽象,分离和整理代码。有很多已经上线的游戏是这样做的。但是,如果使用 ECS,这样的扩展会变得更加容易。 Entity Component 的模式会消除面向对象模式中的层级结构,取而代之的是使用 Components 来描述一切东西,例如一个兽人,一只狼,一瓶药水等等。Component 只是数据,给一个实体,添加多个 Component。 例如,我们可以创建一个实体,然后赋予它一些 Components,Position,Renderable,MelleAI,RangedAI,Hostile,Friendly 等等。对于近战单位,可以给它 MelleAI,Renderable 等。对于远程单位,可以给它 RangedAI,Renderable。对于兽人,在完成任务前,它有 Hostile 组件,而完成任务后,会变得更加友好,那就移除 Hostile 然后添加 Friendly。可以按照游戏逻辑随意地去组合。 ECS 中的 “S” 叫做 System。System 会从 Components 中读取数据,然后执行自己的逻辑代码。例如在单位的显示逻辑中,用于显示的 System 会从单位的 Position 和 Renderable 组件中拿取数据,然后用于在地图上显示实体。 对于小型游戏来说,在使用 ECS 时可能会感觉比面向对象写了更多的代码,前期确实是这样,但是对于后期添加逻辑,ECS 就变得容易了很多。 使用 ECS 很重要的一点就是要知道 ECS 只是处理组合的一种方式,但并不是唯一的方式。对于实现功能来说,并没有什么唯一的方式,在了解了原理后,按照自己的习惯和喜好来就行。 接着上一节的 hellorust 工程,使用 Specs 库 cargo add specs cargo add specs-derive Cargo.toml...
Rust 算是一个新兴的语言,近两年非常火了,但是他首次出现是在 2010 年。Rust 有非常好用的工具 cargo 和 rustup。 如果要学习 Rust 这门编程语言,也有很多优秀的教程。 The Rust Programming Language Book Learn Rust by Example 24 Days of Rust Rust’s Ownership Model for Javascript Developers Rust 编辑器可以使用 VSCode 在终端中使用命令 cargo new hellorust 可以创建一个名为 hellorust 的工程。src/main.rs 是起始文件。Cargo.toml 是工程的配置文件,里面包含了一些其他库的引用信息。 此时 src/main.rs 的代码如下 fn main() { println!("Hello, world!"); } fn 是函数的关键字 main 是主函数名,也就是整个程序的起始函数。 println! 是一个打印宏 使用命令 cargo run 可以编译并运行工程。 一些有用的 cargo 命令 cargo init 初始化一个新的工程 cargo build 会下载所有的依赖库,并且编译整个项目 cargo update 会根据 Cargo....
这个教程是免费和开源的,所有的代码都使用 MIT 协议,可以无限制的免费使用。希望这个系列的教程可以帮助大家做出更优秀的游戏。 每一年,有一些大神都会在 r/roguelikedev 上启动一个周二教程系列,以此来鼓励更多的程序员加入 Roguelike 游戏开发者行列中。大多数的编程语言已经被使用过了,所以在今年,我决定使用 Rust。我不是很想用默认的引擎 libtcod,所以我自己写了一个,名为 RLTK。刚开始的时候并不是很好,但是也让我学到了很多,如果你有兴趣,代码在此 -> rustyroguelike 上面的 rustyroguelike 代码是使用 Python 和 libtcod 来实现的。 我一直很想使用一下 Entity Component System。而 Rust 有一个很好的库 Specs。我已经在之前的游戏中使用过 ECS 的理念,所以再次使用 ECS,一切就很自然了。在 reddit 上,ECS 也是一个一直以来有争议的方向。所以我希望这次的教程可以让大家理解 ECS 的利弊。 注意:这个系列的教程并不是面向 Rust 0 基础的朋友,至少要有一点 Rust 的语言基础才行。 猫语互动 欢迎关注微信公众号 猫语互动,博客文章同步推送