Hi there 👋

  • 欢迎来到我的Blog,我是 Fred
  • 目前是一个独立开发者
  • Let’s make something fun.

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

游戏开发中的平滑移动

这篇博客,聊一聊在游戏开发中,控制角色或者其他物体的平滑移动。现实中,一个物体,从静止加速到匀速运动状态,或者从匀速运动状态变为静止状态,都会有一个过程。就像人走路,或者汽车开动。 一个物体在运动状态下,会有一个速度变量,也就是我们期望的速度。而从静止到运动状态的过程,会有一个加速度。 而游戏开发中,要做到一个物体平滑的运动,也就是模拟出这个从静止,通过加速度,达到期望速度的过程。 游戏是按帧运行的,在初始的时候,目标运动速度为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.x = Input.GetAxis("Horizontal"); playerInput.y = Input.GetAxis("Vertical"); Vector3 desiredVelocity = new Vector3(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.gen(); let z_offset: f64 = rng.gen(); let center = Vec3::new(a as f64 + 0....

December 11, 2021 · 2 min · fred

Rust 光线追踪 13: 散焦模糊

散焦模糊,通俗来讲就是在聚焦区域外的东西,都是模糊的。通常这种效果被称为 Depth Of Field(DOF),也就是景深。最终效果如下 ...

December 10, 2021 · 2 min · fred

Rust 光线追踪 12: 正交相机

正交相机所看到的东西大小,与远近无关,只与正交相机的视野(FOV)有关。FOV越大,能看到的世界范围就大,也就是能看到更多的东西,而FOV越小,能看到的世界范围就越小,也就是只能看到较少的东西。 由于FOV越小,看到的范围就越小,从而,相机的上下界,所发出的射线,所能覆盖的范围,就小。也就是相当于所有的射线,都集中在世界中一个小范围,从这个小范围中取得颜色,填充画布(最后渲染的图片),所以看到的东西就大。而如果FOV很大,射线所能覆盖的世界范围就大,用这个大范围来填充画布,自然同一个物体就会看起来小。 可以想象一个两个盒子,一个大的,假设口径是50厘米,扣在一把键盘上,可以扣住整个键盘,相当于摄像机看到了整个键盘。而将一个1厘米口径的盒子,扣在键盘上,可能只能覆盖其中一个键,也就是相机只能看到这一个键范围的东西。但最后都会将扣到的东西填充到画布上,所以,就相当于FOV越小,看到的东西就越大。 添加相机FOV逻辑 在本文中,相机的FOV,我们使用角度来表示,上图中,$\theta$ 就是相机的开口大小,而 $h = \tan(\frac{\theta}{2})$,$2 * h$就是视口的高度,而视口的宽度,通过自定义的宽高比,来动态计算出来。 下面修改 camera.rs 的代码,添加 fov 和 宽高比。 // src/camera.rs impl Camera { pub fn new(vfov: f64, aspect_ratio: f64) -> Self { let theta = vfov * std::f64::consts::PI / 180.0; let h = (theta / 2.0).tan(); let viewport_height = 2.0 * h; let viewport_width = aspect_ratio * viewport_height; let focal_length = 1.0; let origin = Vec3::zero(); let horizontal = Vec3::new(viewport_width, 0.0, 0....

December 8, 2021 · 2 min · fred