Roguelike In Rust 04: 地图与行走

接着上一节的内容,这一节将创建地图,然后玩家可以在地图中行走。地图分为可行走区域和不可行走区域。我们可以认为地图是由一个一个的格子组成。 先看一下最终的效果 ...

February 8, 2022 · 4 min · 猫猫

我的独立游戏下载量和广告收入情况

经过了几个月的开发,我的游戏终于上线了。这篇博客来聊一下目前这个游戏的下载量和广告收入情况。 《游戏码农:那些打工的日子》是一个轻松的模拟经营文字游戏,游戏的主角是一个普普通通的小码农,刚刚来到一线城市,开始自己的职业打工生涯。游戏拥有丰富的玩法,轻松的升级体验,多种不同的赚钱方式,实现财富自由,指日可待。 目前已经上线 AppStore,TapTap,好游快爆等平台。 AppStore: https://apps.apple.com/cn/app/id1607035933 TapTap: https://www.taptap.com/app/230651 好游快爆:https://www.3839.com/a/141332.htm 下图是 Android 平台的广告收入情况 下图是 iOS 平台的广告收入情况 通过上面的广告收数据可以知道,从 2022.01.27 到 2022.02.05 这几天,Android 平台一共收入了 111 块钱,而 iOS 共收入了 70 块。 下面是各个渠道的下载量统计 从上线以来,目前总玩家数有2982,期中日活玩家平均不到200。在渠道统计中有一个为 Development 的渠道,占了总玩家数的大部分,但是,这个渠道的包不是我发的,而是被破解了广告的一个包,所以其实真正导致收入的玩家数,是很少的。 综上,这个游戏从玩法上来说,玩家粘性一般。从收入上来说,也是几乎可以忽略了。假设包没有被破解,可能收入会翻倍,不过那也没多少,和之前打工时的工资,根本无法比。 猫语互动 欢迎关注微信公众号 猫语互动,博客文章同步推送

February 6, 2022 · 1 min · 猫猫

游戏码农:那些打工的日子

经过了几个月的开发,我的游戏终于上线了。 《游戏码农:那些打工的日子》是一个轻松的模拟经营文字游戏,游戏的主角是一个普普通通的小码农,刚刚来到一线城市,开始自己的职业打工生涯。游戏拥有丰富的玩法,轻松的升级体验,多种不同的赚钱方式,实现财富自由,指日可待。 目前已经上线 AppStore,TapTap,好游快爆等平台。 AppStore: https://apps.apple.com/cn/app/id1607035933 TapTap: https://www.taptap.com/app/230651 好游快爆:https://www.3839.com/a/141332.htm 找工作 游戏开始需要完善简历信息,然后选择中意的公司进行投递和面试,拿到 Offer 后,不同的公司,给出的薪资略有差距,需要仔细考虑。 租房子 压一付一的租房模式,大大缓解了刚开始打工的年轻人,到底是住的远一点,舒服一点,便宜一点。还是住的近一点,老破小,还贵。 点外卖还是自己做饭 自己做饭,需要先购买食材,然后根据菜谱来做,挑战很大,但是成本低。点外卖,省力,就是花钱有点多。 学习 想要提高自己的专业经验,光打工是不够的,还得多多学习。 休息 在家里的时候,可以打打游戏,看看小说,睡睡觉,打工也是一个长期的活,同时也要照顾好自己噢。 通勤 打车很舒服,消耗体力也小,坐地铁便宜,但是人挤人,应该怎么选择呢?似乎还得看看自己的存款 上班 认认真真完成工作,也别忘记偶尔摸个鱼,或者钱很多可以把自己的工作任务偷偷外包给同事。 投资 光靠打工是很难实现财富自由的,还是投资吧,股票、基金、贵金属等等,多种投资模式自己选择,真实的市场波动。 资产 有些东西可能平时用不着,但是很贵。 赚钱小游戏 偶尔休闲一下,打两把小游戏,顺便赚点钱,当然,也可能输。 猫语互动 欢迎关注微信公众号 猫语互动,博客文章同步推送

February 4, 2022 · 1 min · 猫猫

Roguelike In Rust 03: 实体和组件

对于游戏开发者,可能或多或少听说过或者使用过 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...

February 3, 2022 · 6 min · 猫猫

Roguelike In Rust 02: Hello Rust

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....

February 2, 2022 · 1 min · 猫猫

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 · 猫猫

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 · 猫猫

This Week In Moeif 30

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

January 16, 2022 · 1 min · 猫猫

This Week In Moeif 29

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

January 9, 2022 · 1 min · 猫猫

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.x = Input.GetAxis("Horizontal"); playerInput.y = Input.GetAxis("Vertical"); Vector3 desiredVelocity = new Vector3(playerInput.x, playerInput.y, 0....

January 6, 2022 · 1 min · 猫猫