访问其它实例的变量


在专属于 变量 的这一节,你会发现怎样创建,以及在单个实例中创建和使用变量,或者全局变量,但是如果你想在一个实例中访问另外一个不同的实例的变量会怎么样?在很多情况下你想要做到这一点,比如和子弹物体的一次碰撞中,你可能想要通过访问了弹的变量知道子弹造成了多少伤害,或者你想要在谜题中让所有的球停下来,或者你想要将主角移动到特定地点,或任何你可能会在其它游戏中遇到的任何情况。幸好 GML 语言有方法可以实现这个。

在另外一个实例中访问或者更改一个变量,最通常的一个方法是使用物体的名字作为标识符,然后使用一个点 “.”(译者注:英文点)告诉 GameMaker Studio 2 之后使用的变量是在那个物体中指定或者改变。实际看起来是这样的:

obj_ball.speed = 0;

上述代码中你在设定 “obj_ball” 的一个实例的移动速度。然而如果房间里有给定物体的多个实例,那么它将应用于所有的实例 - 除非你在使用 JS 平台,或者 HTML5 平台,那种情况它将只会影响一个,但是你不会知道它影响的是哪一个 - 如果你需要访问一个物体的所有实例,应该使用 with,这会 100% 兼容所有的平台。一般情况下,只有在房间中有一个物体实例时才会使用此格式,或者(将在下一部分看到) 当你有一个特定 实例 ID 时。

当你知道房间里有多个实例时,你可以访问物体的单个实例,使用唯一的 实例名称 告诉 GameMaker Studio 2 具体想要访问哪个实例。该 实例名称常量 是添加到游戏中房间的每个实例的唯一标识常量。当你在房间编辑器中将实例放入的房间时,此实例名称将显示在实例属性窗口中(双击编辑器中的实例时显示),并可用在“.”的左侧:

inst_4DB70D2.speed = 0;

你也可以在点的左边使用 变量只要这个变量存储有效的 实例ID。以下示例说明了这一点。

// 示例 1 var inst = instance_position(mouse_x, mouse_y, all);
if instance_exists(inst)
   {
   inst.speed = 0;
   }

// 示例 2
var new_inst = instance_create_layer(random(room_width), random(room_height), "Enemies", obj_E_Parent);
new_inst.direction = point_direction(new_inst.x, new_inst.y, x, y);
new_inst.target = id;

请注意,你不能使用特殊 关键字all” 来用这种方法定位所有实例,但是你 可以 使用关键字 “other” 和“self”,这没有问题。例如,在碰撞事件中使用 other

// 示例 3 other.hp -= 10;
if other.hp <= 0
   {
   other.sprite_index = spr_E_Dead;
   }

注意,示例 1 中的代码块有一个 instance_exists() 调用。这是因为如果实例不存在,使用 “.” 方法访问或更改另一个实例的值都将产生错误并使游戏崩溃,并且这种情况下有这个可能性。但是,我们不需要在示例 2 和示例 3 中进行检查,因为我们 知道 实例就在那里,在示例 2 中我们创建了它,在示例 3 中,它是碰撞事件中的另一个实例。但是,如果实例有 任何 会销毁、停用或以其它方式从房间中移除的可能性,你应该 始终 在使用前用 instance_exists() 函数,还有 instance_number() 函数检查一下。

这些都是在其他实例中读取、更改和设置变量的完全有效的方法,并且它有效是因为 “.” 实际上是一个 操作符。它将一个值作为左操作数,将一个变量(地址)作为右操作数,并在指定的物体或实例中返回此特定变量的地址。所有物体名称、常量、ID 等......只是代表值,这些可以像任何其他值一样处理。