实例关键字

为了简化GameMaker中的某些操作,您可以在代码中使用多个实例关键字之一(无论是GML Code还是GML Visual)。这些关键字用于标识实例和结构。下面的文字中对每一项进行了解释。

注意给定的关键字在内部由负整数值表示,因此在针对这些关键字或使用这些关键字分配或检查变量值时必须小心,因为稍后您可能会得到意外的结果,因为GameMaker将您使用的值解释为其他值。您还应该注意,完全不建议在代码中直接使用整数值而不是关键字,并且可能会在以后引起问题。

selfself 自身

关键字描述
selfThis keyword refers to the current scope, which is the instance or struct that is executing the current block of code.

self可用于标识当前代码块中范围内的当前结构或实例。例如:

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

在此示例中,您可以看到我们有一个名为 val本地 变量,我们希望它在新创建的对象实例中设置同名的 instance 变量。为了正确识别实例变量并告诉 GameMaker 在调用代码块的实例中设置它,我们使用 self 关键字。在大多数情况下,您还可以使用 id 内置实例变量来代替 self,但 self 具有一定的优势。首先,编译器使用 self 识别实例 (或结构) 比使用 id 更快,因为 id 值会遍历实例查找表,而 self 才不是。其次,对于那些进行扩展的人来说,确保变量的正确作用域非常有用,因为使用扩展的项目可能具有全局作用域变量或与扩展中的变量同名的变量。

注意self 关键字 不是 实例或结构的实际 ID 值的快捷方式,只能在上述上下文中使用。如果您需要实例的 ID ,则需要使用 self.id,例如:

var myID = id;
with (all)
{
    if (self.id == myID)
    {
        // do something
    }
}

selfstructs的使用方式相同,用于引用结构体的成员变量。它还可以在构造函数中使用来引用从构造函数生成的结构。

你也可以将 self 作为值分配给一个变量。self 所引用的内容仅在你用它查找变量时确定。例如:

创建事件

my_val = 5;
the_thing = self;

the_struct = 
{
    a: 4,
    b: 5
}

with(the_struct)
{
    a = other.the_thing.my_val;
}

show_debug_message(the_struct);  // { a : 5, b : 5 }

当创建对象的实例时执行此代码。该实例接收分配了值5的变量my_val和分配了值self的变量the_thing。它还接收变量the_struct,其中变量a设置为4b设置为5。接下来,使用with语句将范围更改为结构体的范围。在大括号{ }之间,范围是结构体的范围。然后执行以下代码行:

a = other.the_thing.my_val;

变量 athe_struct 的一个现有变量,因此可以在 with 中直接赋值。可以通过逐一检查点运算符来找到右侧表达式所引用的内容。other 指的是之前的作用域,即进入 with 语句之前的实例作用域。实例的 the_thing 变量存储了 self 的值,self 引用的是 current 作用域,而这个作用域刚刚被确定为实例的作用域。它的 my_val 变量存储了值 5,这个值最终被分配给结构体的变量 a。因此,the_struct 的最终值为 {a : 5, b : 5}

请注意,执行以下操作:

with(the_struct)
{
    a = the_thing.my_val;
}

会引发错误,因为此处是在the_struct的"self"上查找my_val。但是,the_struct没有my_val变量!

 

 

otherother 另一个

关键字描述
otherThis keyword refers to the "other" instance involved in a collision event, or to the instance or struct that's executing a with statement or calls a function.
More generally, other always refers to the scope through which the current scope was accessed or, put differently, the scope you were previously in or the scope where you came from.

特殊关键字other有多种方式用于引用特定实例或结构:它可以在with语句、碰撞事件中使用,或在一个函数中。本节将解释最后两个用例。

注意如果您没有处于碰撞事件中并且不使用点符号.with语句更改范围,则其他仅指当前作用域,即它与self指的是同一事物。

碰撞事件

碰撞事件只能发生在两个实例之间。可以在多个实例之间有多个碰撞,但GameMaker会以1对1的方式解决这些冲突,具有冲突事件的"self"实例和与其冲突的"other"实例。

想象一下,你有一个玩家实例,多个敌人实例和多个子弹实例,敌人可以向你开火。您可以为每个敌人指定一个项目符号实例,但在创建时会随机指定不同的损坏变量,例如:

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

您可以看到我们如何使用点符号设置其变量,如其他实例中的寻址变量一节所述。这将为每个项目符号实例提供不同的损坏值,但玩家如何检测它在被子弹击中时必须承受的损坏?

为此,玩家需要与obj_Bullet发生碰撞事件,并在该事件中使用other从碰撞项目符号实例读取变量:

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

上述代码将从玩家的 hp 变量中扣除 other 实例的 damage 变量中存储的金额,然后检查 hp 是否低于或等于为 0。如果是,那么它将销毁玩家实例。请注意,另一个实例必须检查该变量,否则将引发错误。

注意 碰撞事件是唯一对 other 关键字具有特殊含义的事件。在所有其他事件和脚本中,other 的行为将由其使用的上下文 (例如 with() 块、函数、结构声明等) 定义。

您可以在碰撞事件中使用其他为变量指定值,甚至创建新值,如下所示:

// add ten to the other instance's "mana" variable
other.mana += 10;
// set the other instance variable "hit" to true, creating the variable if it doesn't already exist
other.hit = true;

结构声明

结构体声明内的作用域不会更改,因此other引用与self相同的作用域(当前作用域),即初始化该结构体的结构体或实例:

var _struct =
{
    parent_instance : other
}

show_debug_message(_struct.parent_instance == self);
// This prints '1' (true) meaning that both sides refer to the same instance

但是,您不需要使用other从实例中读取变量,因为您直接引用的任何变量都将从该实例的作用域中读取,如手册本节中所述。只有当您希望存储对该实例的结构的引用时,才需要使用此方法。

实例方法

在另一个实例的方法中使用other会引用调用该方法的实例。

例如,假设Object2有一个引用selfother的方法。然后在Object1中调用该方法。由于方法是在Object2中创建的,所以它与绑定 并始终使用Object2 实例作为“self”,无论哪个实例调用它。在这种情况下,调用实例变成 other

// In Object2
my_method = function()
{
    show_debug_message(object_get_name(self.object_index));
    show_debug_message(object_get_name(other.object_index));
}

// In Object1
Object2.my_method();

这将导致实例首先打印自己的对象名(" Object 2"),然后打印调用实例的对象名(" Object 1")。

这同样适用于绑定到结构的方法。

构造函数

在构造函数中使用时,other将引用调用该函数的实例或结构,但不建议将其用于一般用途,因为构造函数需要使用的任何外部数据都应作为参数传入。

 

allall 全部

关键字描述
allAll instances currently active in the room.

该关键字用于告诉 GameMaker 要应用某个函数,或者检查房间内的所有活动实例 (不会检查或访问停用的实例)。您 不能 使用 all 来使用 point 方法访问或设置其他实例中的变量 (请参阅 此处 ),但您 可以 在使用 with 时使用它, 例如:

with (all)
{
    speed = 0;
}

上述代码将房间中所有实例的速度设置为0。您还可以在函数内使用all来锁定或检查房间中的所有实例,例如:

// Check a point for any active instance in the room
inst = instance_position(mouse_x, mouse_y, all);

// Check all instances for a collision along a line
if collision_line(x, y, mouse_x, mouse_y, all, false, true) {}

// Add all instances in the room into a motion planning grid
mp_grid_add_instances(grid, all, false);

all是一个非常有用的关键字,可以在代码和操作中的许多情况下使用,通常会减少需要编写的代码量以达到所需的效果。

 

noonenoone

关键字描述
nooneNo instance at all.

这可能看起来很奇怪,但很多时候,在对游戏进行编程时,您会发现需要检查在某个位置、碰撞等情况下是否没有找到实例。在这些情况下,您将使用此关键字来检查任何内容,例如这:

if (instance_nearest(x, y, obj_enemy) != noone)
{
    //do something as there is an enemy instance near
}

在此示例中,函数instance_nearest将返回noone或最近找到的实例。基本上,任何时候您需要检查实例时,都可能会得到noone或返回一个实例。

这也可以与with语句结合使用:

with (instance_nearest(x, y, obj_enemy))
{
    //do something as there is an enemy instance near
}

如果函数返回一个实例,那么大括号 { } 之间的代码将会执行一次。如果函数返回 noone,那么代码将不会执行。

您还可以将noone作为值分配给变量来存储此类函数的结果:

创建事件

ins_last_collided_with = noone;

碰撞事件

ins_last_collided_with = other.id;