Roguelike In Rust 01: 前言

这个教程是免费和开源的,所有的代码都使用 MIT 协议,可以无限制的免费使用。希望这个系列的教程可以帮助大家做出更优秀的游戏。 每一年,有一些大神都会在 r/roguelikedev 上启动一个周二教程系列,以此来鼓励更多的程序员加入 Roguelike 游戏开发者行列中。大多数的编程语言已经被使用过了,所以在今年,我决定使用 Rust。我不是很想用默认的引擎 libtcod,所以我自己写了一个,名为 RLTK。刚开始的时候并不是很好,但是也让我学到了很多,如果你有兴趣,代码在此 -> rustyroguelike 上面的 rustyroguelike 代码是使用 Python 和 libtcod 来实现的。 我一直很想使用一下 Entity Component System。而 Rust 有一个很好的库 Specs。我已经在之前的游戏中使用过 ECS 的理念,所以再次使用 ECS,一切就很自然了。在 reddit 上,ECS 也是一个一直以来有争议的方向。所以我希望这次的教程可以让大家理解 ECS 的利弊。 注意:这个系列的教程并不是面向 Rust 0 基础的朋友,至少要有一点 Rust 的语言基础才行。 萌一小栈 欢迎关注微信公众号 萌一小栈,博客文章同步推送

February 2, 2022 · 1 min · fred

Gameplay 02 游戏中的跳跃

游戏中的跳跃,就是以某一个速度起跳,克服重力。而以不同的速度,起跳的最高点是不一样的,很难去量化,所以我们可以定义每次起跳的最大高度,然后求出起跳速度,即可做到一切可控。 自由落体公式 $h = \frac{1}{2}gt^2$。速度 $v = gt$,这个是瞬时速度,但是自由落体的速度是均匀变化的,所以平均速度就是下落高度中间时刻的速度,所以才得出 $h = \frac{1}{2}gt^2$。 我们的目标是求出跳跃的速度。 首先,假设我们以一个初始速度 $j$ 来跳跃,这个是一个向上的速度,但是因为重力的存在,所以我们的跳跃速度会因为重力的向下抵消,而逐渐趋向于 0。当 $j$ 慢慢被抵消到 0 时,我们也就达到了以 $j$ 这个速度来跳跃所能到达的最大高度。 对于任意时刻 $t$,速度 $v = j - gt$,当 $j - gt = 0$ 时,也就是我们所能到达的最大高度。所以,到达最大高度的时间为 $t = \frac{j}{g}$。 根据上面的公式,我们可以知道,在以 $j$ 来跳跃的整个过程中,任意时刻的高度为 $h = jt - \frac{gt^2}{2}$。 由于我们上面已经知道了,在 $t = \frac{j}{g}$ 时,我们将达到最大跳跃高度。将 $\frac{j}{g}$ 带入到任意时刻的高度公式中 $h = jt - \frac{gt^2}{2}$。我们可以得到 $h = j(\frac{j}{g}) - \frac{g(\frac{j}{g})^2}{2}$。 化简上面的公式将得到 $h = \frac{j^2}{g} - \frac{\frac{j^2}{g}}{2} = \frac{j^2}{g} - \frac{j^2}{2g} = \frac{j^2}{2g}$。...

January 22, 2022 · 1 min · fred

This Week In Moeif 30

下个周计划去做个小手术,把额头上的小脂肪瘤干掉,应该可以直接在门诊做。上海的医保也可以直接用了。 从下一期开始,我要考虑一下改变一下周记的模板,看看如何改成内容叠加式,这样最后就知道这一年干了什么。 ...

January 16, 2022 · 1 min · fred

This Week In Moeif 29

这周主要在加速开发码农游戏,其他的事情都暂缓了。 这周注册了一个新的域名,国内的,这样可以备案,可是域名拼错了…,不过也无所谓,反正不对外,只是在代码中使用。似乎找到了一个国内和国内访问腾讯云都很快的方法,就是国内直连,国外使用 Cloudflare 加速,等后面有了服务器的逻辑可以测一下。 考虑了一下下一个项目的事情,准备下一个项目海外版增加内购,国内还是暂时以广告为主,暂时这样计划着。 看了一下Godot,编辑器确实很快,但是从产品开发上,还是Unity更保险一些,一方面比较熟悉,一方面各种支持和资源很丰富。目前确实没有转引擎的必要。 项目进度 游戏码农:那些打工的日子 这周完成了资产模块的逻辑和UI,投资模块的逻辑和UI。投资模块的价格数据,使用了市场上真实的数据,目前只加了一个数据源,后面会再加几个,增加可靠性。另外,这个项目的软著终于有动静了,目前处于待发放的状态,也就是通过了,估计下周能邮出。 本周电影 这周忙到没时间看电影 本周书籍 《愿你迷路到我身旁》 《游戏设计艺术》(阅读中) 下周初步计划 继续逻辑编写

January 9, 2022 · 1 min · fred

Gameplay 01 游戏开发中的平滑移动

这篇博客,聊一聊在游戏开发中,控制角色或者其他物体的平滑移动。现实中,一个物体,从静止加速到匀速运动状态,或者从匀速运动状态变为静止状态,都会有一个过程。就像人走路,或者汽车开动。 一个物体在运动状态下,会有一个速度变量,也就是我们期望的速度。而从静止到运动状态的过程,会有一个加速度。 而游戏开发中,要做到一个物体平滑的运动,也就是模拟出这个从静止,通过加速度,达到期望速度的过程。 游戏是按帧运行的,在初始的时候,目标运动速度为0,随着每一帧的流逝,目标速度会不断累加一帧中的加速度,当累加到期望速度时,则会以期望速度来运动。 代码如下,这里是在 Unity 中实现的,但是原理对于所有游戏引擎通用 using System.Collections; using System.Collections.Generic; using UnityEngine; public class MovingSphere : MonoBehaviour { // 用户设定最大期望速度 [SerializeField, Range(0f, 100f)] private float maxSpeed = 10f; // 用户设定最大加速度 [SerializeField, Range(0f, 100f)] private float maxAcceleration = 10f; // 当前的运动速度 private Vector3 velocity; // Update is called once per frame void Update() { // 通过读取用户输入,来确定期望速度向量(向量包含了大小和方向) Vector2 playerInput; playerInput....

January 6, 2022 · 1 min · fred

This Week In Moeif 28

现在已经 2022 年了,本来想跨年夜去外滩,看了一下新闻,好像也没什么活动,就在家里待着了。这个周又开始运动了,跑步加跳绳,保持健康。这周是单调的一周。这周还把博客使用 Cloudflare 加速了,能明显感觉也访问速度的提升。 项目进度 游戏码农:那些打工的日子 这周完成了外卖和自己做饭界面的UI及逻辑,下周开始添加学习内容的模块。这周的内容比较单调,好像也没做什么特别的事情。软件著作权还没有下来,这次真是好慢。 本周电影 寂静之海 고요의 바다 (2021) 本周书籍 《愿你迷路到我身旁》(阅读中) 下周初步计划 继续逻辑编写

January 2, 2022 · 1 min · fred

This Week In Moeif 27

又是一周结束了,时间过的好快啊。这周在焦虑和烦躁中度过。上海也开启了冬天模式,很冷,还没有取暖设备,买了一个取暖器,也做不到整屋加热,不过还好距离过年也就剩一个多月了,可以回北方了。好像已经两个周没有出去跑步了… ...

December 26, 2021 · 1 min · fred

This Week In Moeif 26

对于下一个游戏产品,有了一点点的方向,还没有深入去考虑。 ...

December 20, 2021 · 1 min · fred

This Week In Moeif 25

这周开始学习画像素画了,还不是很熟练,不过每天会多少画几分钟,使用数位板。以前使用数位板不太习惯,慢慢的对于它的控制会越来越顺手。 另外,这周完成了 Ray Tracing in One Weekend 系列的博客Rust重实现。接下来就要开始第二篇章了。 今天上海下雨了,下个周的温度,可能会冷很多。 项目进度 游戏码农:那些打工的日子 这周主要完成了头像自定义模块,简历完善模块,招聘信息模块,以及添加了能用的提示消息界面。确定了核心玩法界面的基本结构,参考了其他同类型的游戏对于时间上的处理逻辑。基本上确定了由事件来驱动整个游戏的进程,如果没有事件填充,那么时间就会停止,这样避免了很多以前想不到解决方案的问题,只是这样唯一的问题是没法一直挂机,可能过一段时间就需要操作一下。另外确定的小玩法有赛车,地下搏击俱乐部这两个。整理了一下游戏的核心,就是围绕着金钱,健康,快乐的循环。 本周电影 花与罪 (2021) 你 第一季 You Season 1 (2018) 本周书籍 《无后为大》(阅读中) 《重构:改善即有代码的设计》(阅读中) 下周初步计划 游戏码农逻辑编写

December 12, 2021 · 1 min · fred

Rust 光线追踪 14: 最终汇总效果

这一节没有新的知识,只是将之前知识汇总起来,然后生成一张最终的图,最终生成的图如下 首先,将创建世界及添加物体的代码从 main 函数中删除,然后抽象成一个函数 random_scene,在这个函数中,会随机生成一些球体,并且根据规则,随机使用我们的已有的三个材质。 // src/main.rs fn random_scene() -> HittableList { let mut world = HittableList::new(); let ground_material = Lambertian::new(Color::new(0.5, 0.5, 0.5)); world.add(Box::new(Sphere::new( Vec3::new(0.0, -1000.0, 0.0), 1000.0, ground_material, ))); let mut rng = rand::thread_rng(); // 生成一些小球 for a in -11..11 { for b in -11..11 { let choose_mat: f64 = rng.gen(); let x_offset: f64 = rng....

December 11, 2021 · 2 min · fred