Approach - GMS中常用脚本介绍(1/5)
这两天Shaun Spaldiing做了个视频介绍一些常用并且实用性比较强的脚本,觉得还蛮有用的,所以就也用文字详细说明一下,一共5个脚本,今天先介绍第一个:)
原版的介绍视频已经上传到B站——GMS中5个常用脚本 By @Shaun Splading
Approach
PS. Shaun Splading做的视频里右下角的致谢名单的方法名好像写错了,Wave()是后一个脚本名了
这个脚本其实不算复杂,如果有些代码基础大概就能看明白,但这是一个设定让某个数值向一个目标值增加/减少的方法。
在脚本中我们设定了三个参数:
- "a" :需要修改的初始值
- "b" :需要修改的最终结果值
- "amount" :修改的单位
在代码注释部分举了一些常见的例子
// Speed = Approach (speed , max_speed , acceleration) ; // hp = Approach(hp , 0 , damage_amount) ; // hp = Approach(hp , max_hp , heal_amount) ; // x = Approach(x , target_x , move_speed) ; // y = Approach(y , target_y , move_speed) ;
用伪代码表示大概如下:
速度 = Approach(速度 , 最大速度 , 加速度)
//当前速度以加速度为单位不停增加直到达到最大速度为止
血量 = Approach(血量 , 0 , 伤害值)
//当前血量以伤害值为单位不停减少直到为0
血量 = Approach(血量 , 最大血量 , 治疗量)
//当前血量以治疗量为单位不停增加直到满血为止
x坐标 = Approach(当前x坐标 , 目标x坐标 , 移动速度)
//当前x坐标以移动速度为单位不停移动至目标x坐标位置
y坐标 = Approach(当前y坐标 , 目标y坐标 , 移动速度)
//当前y坐标以移动速度为单位不停移动至目标y坐标位置
由上这几个例子我们大概就能了解这个方法的常用场景,就是当你某个值需要以特定的单位修改成另一个值,并且不能超出那个值的范围时可以使用该方法,比如血量降低到0,绝对不能出现血量变成负数的情况。
下面我们就来看一下具体的方法:
if (argument0 < argument1) { argument0 += argument2 ; if (argument0 > argument1) return argument1 ; } else { argument0 -= argument2 ; if (argument0 < argument1) return argument1 ; } return argument0 ;
最上面是声明方法名称、参数的,我们会在文末进行介绍,首先我们要清楚一个概念,当GMS2中自定义脚本需要传入参数时,默认是使用"argument0"、"argument1"这样的格式,最后一位数字序号从0开始分别代表传入的第一个数以此类推,因此在代码中我们看见"argument"这样的格式内容就都是我们传递进这个方法的参数,在上文我们说过这个方法我们将传入三个参数,因此从0-2三个参数请大家自己对应一下。
然后这个方法中使用了一个if/else的条件判断:
首先在开头if的条件判断的是参数1是否小于参数2(即初始值是否小于目标值)
如果满足该条件则进入if后的代码,参数1以参数3为单位递增
然后这个if方法中还有一个if判断,这次判断的条件是参数1是否大于参数2(即经过递增操作初始值是否大于目标值)
如果满足则直接把参数2作为最终结果返回
后一个判断就是为了保证初始值经过递增修改,返回的结果也绝对不能超出目标值的范围,因此直接将目标值作为结果返回。
else中的代码基本类似,只是将递增的操作改为了递减。
另外在最后还有一行"return argument0 ",其实是无论如何都不会被触发的,但是出于语法的完整性这里还是需要这样一行内容。
参数及方法名声明
在脚本文件的最上面我们会看到一些用三个斜杠“///”开头的内容,这些不是注释,而是声明脚本方法的属性,只有经过了这样的声明,最后我们在其他代码中调用该方法时才能获得GMS2的自动代码补齐和高亮提示(如下图),这样可以方便我们在写代码时更容易回忆起某些脚本的使用方法。
脚本完整代码
/// Approach(a, b,amount) ///@description Approach (a,b,amount) ///@param a ///@param b ///@param amount //Moves "a" towards "b" by "amount" and returns the result //Nice because it will not overshoot "b" ,and works in both directions //Examples: // Speed = Approach (speed , max_speed , acceleration) ; // hp = Approach(hp , 0 , damage_amount) ; // hp = Approach(hp , max_hp , heal_amount) ; // x = Approach(x , target_x , move_speed) ; // y = Approach(y , target_y , move_speed) ; if (argument0 < argument1) { argument0 += argument2 ; if (argument0 > argument1) return argument1 ; } else { argument0 -= argument2 ; if (argument0 < argument1) return argument1 ; } return argument0 ;