方法变量

方法变量本质上是一个被分配了一个函数的变量,将该函数 "绑定 "到一个实例上,使你能够使用该变量来引用该函数--就像你使用运行时函数名来引用GML内置函数一样。使用的变量在范围上可以是局部实例全局(关于变量范围的更多信息见这里)。

另请参阅:脚本函数与方法对比

创建方法

创建方法变量的语法如下:

name = function( parameter1, parameter2, ... )
{
    statement1;
    statement2;
    ...
}

function name( parameter1, parameter2, ... )
{

    statement1;
    statement2;
    ...
}

注意要在 GML Visual 中创建函数,请使用声明新函数。启用其"Temp"选项来创建方法变量(上面显示的第一个语法)。

然而,一般来说,你会用第一种形式来定义方法,而用第二种形式来定义脚本函数,因为第二种形式也会给函数名分配一个脚本索引,而第一种形式则是一个 "真 "方法(如果用来定义脚本函数,需要使用global前缀)。

注意您可以通过在项目中同时使用这两个表单,然后在每个表单上调用运行时函数typeof()来检查此问题。一个将被分类为"数字"-因为它返回脚本索引Id-,而另一个将被分类为"方法"。

因此,请记住,一般来说,当我们谈论方法和方法变量时,我们总是指那些没有用脚本索引定义过的函数。

下面您可以看到使用不同范围创建方法变量的三个简单示例:

// Local
var _debug = function(message)
{
    show_debug_message(message);
}

// Instance
do_maths = function(val1, val2, val3)
{
    return (val1 * val2) - val3;
}

// Global
global.pd = function(_x1, _y1, _x2, _y2);
{
    return point_distance(_x1, _y1, _x2, _y2);
}

请注意,在上面的代码中,作为函数输入给出的各种参数都被命名了,这些名称应该在函数中用来指代不同的输入。另请注意,您可以使用return语句从函数返回一个值以供代码的其他地方使用,默认情况下,定义了no返回值的函数将返回undefined

注意 虽然变量会在选择的作用域中,但实际的函数会被绑定到它最初定义的作用域中。例如,脚本函数都是全局范围和 "非绑定"(即:它们不与任何实例相关联),但如果你有一个脚本函数,在其中创建了另一个函数作为方法变量,然后你从一个实例中调用这个脚本函数,脚本中使用的函数将作为一个方法绑定到实例变量。一般来说,这不是你需要考虑的问题,但对于使用方法变量的更复杂的操作来说,这是值得考虑的。这也适用于使用其他结构,比如with--当你在with里面创建一个方法变量时,该函数将被绑定到当前范围内的实例。

创建方法变量后,可以像使用运行时函数或脚本函数一样使用,例如:

create_vec = function(_x1, _y1, _x2, _y2);
{
    var _array;
    _array[0] = point_distance(_x1, _y1, _x2, _y2);
    _array[1] = point_direction(_x1, _y1, _x2, _y2);
    return _array;
}

vec = create_vec(x, y, mouse_x, mouse_y);

在函数中创建的变量将遵循与正常情况相同的规则,并且将根据使用的关键字或函数调用的范围来确定范围。在上面的示例中,我们使用var,因此数组变量位于函数的局部范围内。如果不使用关键字,则会在调用函数的实例范围内创建变量。

方法与脚本函数一样,也可以采用可选参数,这些参数在未传入时具有默认值:

create_attachment = function(_attachment, _x = x, _y = y)
{
    return instance_create_layer(_x, _y, layer, _attachment);
}

上面的函数接受三个参数,其中最后两个是可选的。如果在调用函数时未传入这些坐标,则默认情况下它们将使用实例的xy坐标。

请注意,如果未传入参数并且没有默认值,则它将等于undefined

方法还可以利用静态变量,静态变量在每次函数调用过程中都保持其值。请阅读此页面了解更多信息。

下面我们列出了一些与方法变量关联的帮助器函数: