用户:
爵士OIer查看:15 回复:20 评论:15 创建时间:2021-05-15T11:34:41
既然官方有邀我了,那么我在百忙之中抽出时间来写了这篇教程。
基础的内容大家都讲得差不多了,来点进阶的。
一、路径判定
原为我在JROI和慕斯谈论有关内容时的极其简单的成果(逃
考虑这一个问题,我们的角色需要高速俯冲,需要判定有没有碰到敌人。
我想大家都会想到这样的积木:

然而这会有一个显然的问题。
当我们的角色需要调整到大小比较小的时候,由于步长过长,有的时候角色会直接“穿过”敌人而无法判定。
这个时候我们就需要对角色“路径”而非“位置”进行判定。
以上面的例子为例,我们从左到右横坐标增量为 800,那么我们判定路径是否经过目标时,只需要判断目标是否在可攻击到的区间内即可。
具体来说,如果满足以下三个条件,即判定为攻击到了:
1. 角色x坐标 > 目标x坐标:表明冲过了目标
2. 角色x坐标 - 800 < 目标x坐标:表明从目标的左边开始向右冲
这两个条件满足了在横向上,攻击区间覆盖了目标。
积木如下:

如果游戏是考虑高度的,那么假设两个角色能够相互碰到需要满足纵坐标之差小于等于 80,只需额外满足
3. | 角色x坐标 - 目标x坐标 | < 80:纵向上攻击区间覆盖了目标。
即可判定为攻击到了。
应用
冲锋,子弹,火球等。
二、血条的实现
血条的实现其实是很简单的。
我们知道,血条的每个单位长度都对应着一格的血量。
因此我们设血量为x,总血量为s,总长度为 l,当前长度n,首先有个简单的比例式:
x : n = s : l
等式的左右两边都等于一个单位长度。
现在我们经过简单的变形,把 n 求出来。上等式变形为
n = l * (x / s)
也就是说,我们的血条长度等于总长度诚意当前血量与总血量的比值。
因此我们有如下积木:

(由于我的血条一开始画长了,所以这里乘了个15。本来的宽度是100%的。)
应用
进度条、血条。
三、随机化行为
假如我们要飞在空中的敌人,我们该如何安排他们的飞行路径?
我不会用各种智能的方法去控制(而且大多数时候也不需要),因此我就省事一点(逃
前在进阶Kitten串讲第二期中我谈到了正弦波的路径,这次我们用随机化来执行。
首先我们需要做到飞行路径和速度的随机化。
这是很容易实现的,我们有如下积木:

同时敌人不可能一直朝着一个方向。
因此我们随机化他们的朝向:

下面来几个技能的实现。
随机类技能
这里随便什么技能都可以,但前提是敌人随机释放。
具体做法就是等待一个随机的时间然后给他放出去。
随机分身
也是同上的,重复执行等待随机的时间,克隆自己。
给出示例积木作为参考:

关于随机化这里就讲这么多,其余由大家探索。
随机化算法更多是用来求解一类最优性问题或可行解,例如模拟退火算法,
还有些随机化算法是降低正确性以提高效率。
四、非线性前进速度
我在进阶Kitten串讲介绍了加速度的概念。
对于非线性的前进速度,这里随手举二次的速度为例。
比如一个物体的运动路程关于时间的函数为y=x²,那么这个物体在t=0.5和t=1间的平均速度可表示为下图:

现在我们就像要求t=0.5时的瞬时速度,怎么办?
我们想:如果我们选取的另一个时间点无限接近0.5,那么最终求得的平均速度也无限接近与瞬时速度。然后我们求个极限就可以。
我们设y=f(x),时间t的增加量为dx,于是增加的路程为f(x+dx)-f(x),增加的时间为dx,这样,两者相除求极限即可。
如下:

我们还有另一种求极限的方法:洛必达法则。

总结一下,我们求瞬时速度的方法:

由此我们得到一般的情况:
设速度为 v=at²+bt+c,对其求导之后得到加速度为2at+b。
控制线性的加速度是容易办到的。接下来我们对加速度进行有限积分即可得到非线性速度。
应用
持续前进,气功等。
五、参考系变换
如果我们的角色要一直前进,不如让背景一直退后。
这是一个非常有用的方法。下面结合“四”的内容,给出一个示例程序。
相关积木如下:


附 教程相关作品取材
https://shequ.codemao.cn/work/53478829
https://shequ.codemao.cn/work/44836261
https://shequ.codemao.cn/work/6517598
总结
本期的教程大家或许已经强烈的感受到了数学的参与其中。
数学是算法和数据结构的基础,因此学好数学是编程的前提。
imgsrc="https://static.codemao.cn/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E7%82%B9%E8%B5%9E.gif"alt="emotion_编程猫_点赞"
点赞0
评论