全局变量

全局变量是一种声明后不属于任何特定实例但可供所有实例访问的变量。就像局部变量一样,全局变量必须使用标识符声明,但与局部变量不同的是,全局变量会保留在内存中直到游戏结束。因此,您可以创建一个全局变量来跟踪(例如)玩家拥有的子弹数量,然后在游戏中的不同点、代码中的任何位置随时更新此变量。对变量所做的任何更改都是"全局"的,因为访问该变量的所有实例都将受到更改的影响。让我们看一个例子:

global.food = 5;

我们首先编写global关键字,然后编写点.来声明food变量,以告诉GameMaker该变量的作用域是全局的。从现在开始,每当我们需要以任何方式访问或更改此变量时,我们都需要使用此表单。

因此,我们创建了一个名为food的新变量,并将其声明为全局变量。现在,任何实例、结构或函数都可以以任何方式使用和更改此变量,并且所有其他实例将"看到"此变量。例如,我们可以有一个不同的食物对象与玩家碰撞,在碰撞事件中我们有:

global.food +=1;

我们还有另一个对象可以绘制此值,如下所示:

draw_text(32, 32, "food = " + string(global.food));

使用全局变量,我们可以更改值并查看引用此变量的所有对象实例中反映的那些更改。对于local变量,您必须注意不要将全局变量命名为与任何实例变量相同的名称,因为这可能会导致问题,并使错误因变量重叠而渗入游戏,有时这可能是一个很难调试的问题。一般来说,您应该有一个在游戏开始时声明所有全局变量的单个对象(例如,放置在游戏第一个房间中的第一个对象实例的房间开始事件)或一个将所有变量声明在一起的单个脚本函数,因为这样,如果您需要检查变量名称或编辑值,就可以方便地返回并一次性引用所有变量。

注意在脚本编辑器中,您处于全局范围内,因此可以省略global.前缀。然而,为了清楚起见,无论如何包含它都是好的。

全局结构

全局变量存储在结构体中,您可以像访问任何其他结构体一样访问该结构体。要引用此结构,您可以使用global关键字。

例如,要显示您定义的所有全局变量和脚本函数,您可以使用以下代码:

show_debug_message(global);

内置全局变量

GameMaker也有一组"内置"全局变量,因此您应该了解它们,因为您可能会为实例变量之一命名相同的名称,或者希望自己的全局变量具有相同的名称并想知道为什么你会收到错误!然而,它们很容易被发现,因为它们在代码编辑器中以不同的颜色显示,并且也会出现在底部的自动完成栏中。大多数内置全局变量都有非常具体的用途,并在手册的相应部分中列出 - 但是有两个经常使用的重要变量未在其他地方列出:

您还应该注意三个已弃用的内置全局变量(这些变量仅旨在支持GameMaker早期版本的旧项目,不应在新版本中使用项目):

最后,有两个变量可以在脚本函数和方法中使用:

globalvar

已弃用globalvar声明已弃用,仅支持旧版用途。您应该始终使用global.前缀显式引用全局范围。

创建全局变量的第二种形式是使用globalvar声明来声明它们,就像使用var声明来声明局部变量一样。

这个(废弃的)声明的使用方法如下。

globalvar food;
food = 5;

以这种方式声明后,变量food现在被视为全局变量,不需要global.前缀 - 这也意味着在代码中识别全局变量要困难得多,而且获取变量也容易得多当您在不同对象或已安装的扩展中使用相同的变量名称时,会发生重叠。一旦以这种方式声明,全局变量将按如下方式访问:

food += 2;

或:

draw_text(32, 32, "food = " + string(food));

正如您可以看到的那样,由于没有任何可以表明变量在范围内是全局的,因此您可能正在设置自己,以便在游戏中出现许多细微的问题,这就是为什么应该避免此声明的原因。

有几个函数可以帮助您处理全局变量,您可以在以下页面中找到这些函数: