关键字


GameMaker Studio 2 中,要让某些事情变得更容易,你可以在你的脚本和动作中使用一种 关键字(keywords)。这些关键字主要用于标识实例,每个关键字都将在下面的文本中进行了解释。请注意,所有关键字在内部都是用负整数值表示,因此在为变量赋值时必须小心,因为你可能会在之后的使用中获得意外结果,GameMaker Studio 2 可能会将这个值解释其它的一些东西。你还应该注意,完全不推荐 使用值代替代码中的关键字,它可能会在以后引起问题。

关键字 描述
self 正在执行当前代码块的实例。    -1

self can be used to identify the calling instance of the current block of code, as it always the unique ID for the instance currently in scope. 比如:

var val = 100;
with (instance_create_layer(x, y, "Instances", obj_Fire))
  {
  self.val = val;
  }

In this example you can see that we have a local variable called val and we want it to set the instance variable with the same name in the newly created object instance. To identify the instance variable correctly and tell GameMaker Studio 2 to set it in the instance calling the code block, we use the self keyword. In most cases you can also use the id keyword instead of self, but self offers certain benefits. To start with, it is faster for the compiler to retrieve the instance ID value using self rather than id, as the id value goes through the instance lookup table. Secondly, for those people making extensions, it is very useful to ensure the correct scoping of variables, since it is possible that a project which uses an extension may have a global scope variable with the same name as a variable in the extension.


关键字 描述
other 碰撞事件中涉及的另一个实例,或者来自 with 函数的其它实例。    -2

这个特别的 关键词 other 有两种不同的方式可用于引用特定的实例:在 with 函数使用(解释在 这里)或者用在 碰撞事件 中(这是本节要解释的内容)。

碰撞事件只能在两个实例之间发生。多个实例之间 可能会有 多个碰撞,但在 GameMaker Studio 2 中他们都是在 1 对 1 的基础上解决的,使用的是具有碰撞事件的实例和涉及的 “other” 实例。想象一下,你有一个玩家物体(player object),多个敌人物体和多个子弹物体,敌人可以向你射击。你可以为每个敌人分配一个子弹实例,但在创建时会为其随机分配一个不同的伤害变量,例如:

var nnn;
nnn = instance_create_layer(x, y, "Bullets", obj_Bullet);
nnn.damage = 5 + irandom(5);
nnn.speed = 8;
nnn.direction = point_direction(x, y, obj_Player.x, obj_Player.y);

了解我们如何使用 访问变量 这部分中概述的点方法(如 nnn.speed)设置它的变量?这将为子弹物体提供不同的伤害值。但玩家物体怎么样?它将如何检测它必须承受的损害?通过在碰撞事件中使用 other

hp -= other.damage;
if hp <= 0 instance_destroy();

上面的代码将从玩家的 “hp” 变量中减除存储在 other 实例的碰撞 “damage” 变量中的值,然后它将检查 “hp” 是否低于或等于 0。如果是,那么它将破坏玩家物体。请注意,other 以这种方式使用 仅适用于碰撞事件,并且另一个实例必须检查变量(译者注:比如确认是否有这个变量),否则将抛出错误。但是,你可以赋值给变量,甚至创建一个新的(译者注:新的变量),在碰撞事件中使用 other 也是如此:

other.mana + = 10; //将 10 添加到另一个实例的 “mana” 变量中
other.hit = true; / /将另一个实例变量 “hit” 设置为 true,如果该变量尚不存在则创建它


关键字 描述
all 当前在房间中活动的所有实例。    -3

此关键字用于告诉 GameMaker Studio 2 一个函数将被应用或检查,包括房间内的所有活动实例(不会检查或访问已停用的实例)。你 不能 使用 all 在其它实例中通过点方法访问或设置变量(请参阅 这里),但你可以在调用 with() 时使用它, 例如:

with (all)
   {
   speed = 0;
   }

上面的代码会将房间中所有实例的速度设置为 0。你也可以在函数中使用 all 来定位或检查房间中的所有实例,例如:

inst = instance_position(mouse_x,mouse_y,all); //检查房间中一个位置的任何活动实例

if collision_line(x, y, mouse_x, mouse_y, all, false, true) {} //检查沿线碰撞的所有实例

mp_grid_add_instances(grid, all, false);                       //将房间中的所有实例添加到运动规划网格中

all 是一个非常有用的关键字,可以在代码和动作(action)中的许多情况下使用,通常可以减少需要编写的代码量以实现所需的效果。


关键字 描述
noone 没有实例。    -4

这可能看起来很奇怪,但是在编写游戏时很多时候你会发现需要检查在某个位置或碰撞中是否找不到实例...... 在这些情况下,你将使用此关键字来检查没有实例的情况,如下所示:

if instance_nearest(x, y, obj_enemy) != noone
   {
//做一些事情,因为附近有敌人的实例
   }

在这个例子中,函数 instance_nearest() 将返回 noone 或找到的距离最近的实例的唯一 ID。基本上,只要你想要检查一个实例,你就可以得到任何一个 noone 或返回唯一的实例 ID。

It is worth noting that the keyword struct is a reserved keyword for possible future additions to GML and as such it cannot be used as a variable or script name, and it won't be colour coded in the IDE either.