【QA】2018第2周

好不容易凑了三个问题来做本期QA,希望派得上用场:)

在游戏过程中新建自定义变量

这个问题来自群里的"萌新"
这个需求是,在游戏运行的过程中生成了一个随机字符串,如何用这个字符串作为变量名来定义一个新的变量。
第一反应是此处该用"ds_map",因为映射表中的数据类似变量的定义是一对一对的键值对,我们可以用任何字符串作为键名(key)来新增一条数据,然后同时赋一个特定的键值(value),不过最后居然发现在GameMaker Studio 2中真的有方法在游戏过程去检测和新建变量。

//全局变量方法
variable_global_exists——某个全局变量是否存在
variable_global_get——获取某个全局变量的值
variable_global_set——设定一个全局变量并赋值
//对象变量方法
variable_instance_exists——某个对象变量是否存在
variable_instance_get——获取某个对象变量的值
variable_instance_set——设定一个对象变量并赋值
variable_instance_get_names——获取某个实例所有变量名称

使用以上方法可以在游戏中检测某个变量是否存在,如果不存在就可以以这个变量名新建你需要的变量了

不过这些方法基本上是出于兼容老版本的一些脚本,以及支持拖拽编程的代码转换而存在的,感觉YoYo官方并不是很推荐使用的样子,诸君自行判断是否合用

mp_linear_step的碰撞检测

这个问题来自QQ群的“回忆如同倒影”
他在自己的demo中使用"mp_linear_step()"这个方法去移动对象到指定的坐标,但是却发现一旦与其它对象的碰撞体相遇就会自动停止,而他自己并没有创建任何碰撞事件的检测。
其实这个方法属于“Motion Planning(移动规划)”中的一个方法,通常用来事先规划NPC和敌人的运动路径,这个方法默认就会检测运动路上是否遭遇碰撞,一旦遭遇就停住,该方法有四个参数,分别是:

  • 目标位置的x坐标
  • 目标位置的y坐标
  • 每一帧的移动距离(像素单位)
  • 碰撞检测条件(true为检测所有碰撞,false为仅检测solid属性的对象)

所以问题就在这最后一个参数上,一旦设为“true(或1)”就会默认与所有带碰撞遮罩的对象发生碰撞了。
如果没有这种碰撞检测需求的话,此处用"move_towards_point( x, y, sp )"这个方法即可

clamp的使用

这个问题同样来自QQ群的“萌新”同学:)
相信很多朋友都有这样的需求,就是要让一个变量递增或者递减,但是又不希望这个数值超出特定的范围。
有些朋友可能会单独设定"min"和"max"的变量值,然后用“if/else”去进行对比和判断,当数值超出范围以后单独进行处理。
其实GMS2内置了一个函数可以做这样的处理

clamp(val,min,max)

我们只需要传入我们要限制的变量以及范围的最小值和最大值,就能确保无论我们如何去修改这个变量都不会超出给定的范围了,比如官方的例子

speed = clamp(speed,1,10)

这就可以确保"speed"这个变量的值无论如何变化,最小都不会小于1,最大都不会大于10。

2018-01-10 15:06
Comments
Write a Comment