常量

常量(constant)是一种变量,在游戏开始时被设置一次,然后永远不会改变。事实上,常量值在被声明后不能被改变。这使它们成为保存整个游戏中用于识别特殊数据的数值的理想选择。

在GameMaker语言中,有两种类型的用户定义常量:枚举,,下面将对这两种类型进行解释。还要注意,始终相同的任何值都被归类为常量,而与数据类型无关,例如字符串或数字3。

注意 GameMaker 语言也有许多用于标识特定事物的内置常量值。在 GML 参考 部分中需要它们的运行时函数的相应页面上概述了这些内容。

Macros 宏

虽然不完全是变量,但宏在使用方式上与它们相似,即:它们是命名的值,你可以在整个代码中使用它们来替换硬编码的值。基本上,宏是一个持有表达式的命名变量。你可以用脚本编辑器来定义你自己的宏,然后在你的代码和动作中使用它们,就像它们是普通变量一样,唯一不同的是,它们不能在游戏中被改变

宏的语法结构如下所示:

#macro <NAME> <VALUE>

例如,假设您定义以下宏"TOTAL_WEAPONS":

#macro TOTAL_WEAPONS 10

宏语法...

必须正确使用上面显示的语法来定义宏。您不能使用等号(如在变量中)或在末尾放置分号(如在常规语句中)。这样做会导致您的宏定义无效。

例如,这不是定义宏的正确方法:

#macro TOTAL_WEAPONS = 10;

删除等号符号和冒号将使其成为有效的宏定义。

注意建议的 GML 命名约定建议使用UPPERCASE_NAMING作为常量,但您也可以使用小写字母或您认为合适的任何其他命名约定喜欢。

然后您可以在代码中这样使用它:

pos++;

if (pos >= TOTAL_WEAPONS)
{
    pos = 0;
}

请注意,你将无法更改常量的值,所以像这样的代码会导致游戏崩溃:

TOTAL_WEAPONS = 11;

你可以在代码或脚本中的任何地方定义宏,它将被预编译并像从一开始就存在一样包含在游戏中,但我们建议你创建专用的脚本资源并在其中定义所有宏。以后组织和调试会更容易!

表达式为宏

如果您需要在运行时更改宏的值,那么您可能应该将其设为全局变量,因为这些可以在游戏期间从代码中更改,除非您将宏设置为运行时函数或任何表达式。通过将宏设置为函数/表达式,意味着每次使用宏时都会调用该函数/表达式。例如:

#macro COL make_colour_hsv(irandom(255), 255, 255)

然后,您可以将此宏调用为类似以下内容:

image_blend = COL;

使用此代码将使图像在每次使用宏时混合不同的颜色。值得注意的是,您还可以使用\字符将宏拆分到多行,以显示换行符在哪里。例如:

#macro HELLO show_debug_message("Hello" + \
string(player_name) + \
", how are you today?");

这纯粹是装饰性的,因为像这样拆分宏在使用时对最终宏的结果没有任何影响,只是为了在代码行较长的宏上提供对多行文本的支持。

配置覆盖

宏的一项非常重要的功能是,可以将它们定义为与特定的配置一起使用,这意味着您可以在给定配置中运行时覆盖宏的值。

例如,假设您有一个用于 Android 广告的配置和另一个用于 iOS 广告的配置,那么您可以定义一个宏来保存所需的应用 ID 值,并为每个配置覆盖它:

#macro AD_ID ""
#macro Android:AD_ID "com.yoyogames.googlegame"
#macro iOS:AD_ID "com.yoyogames.appstoregame"

配置不一定必须以平台命名。你可能会例如还有游戏演示版本的特定配置:

#macro DemoVersion:AD_ID ""

如您所见,您首先给出配置名称,然后给出冒号:,然后给出宏名称和覆盖值。请注意,冒号:与配置名称或宏名称之间不能有任何空格,否则您将收到错误。

宏覆盖由子配置继承。假设您有以下配置设置:

此处,为MobileAds设置的任何宏覆盖都将由MobileNoAds继承,您可以通过为该子配置设置宏来覆盖继承的值。

Enums 枚举

枚举是一个"枚举器"它本质上允许您使用常量值列表创建自己的有限数据类型。它们的结构如下:

enum <NAME>
{
    <MEMBER> [= <VALUE>],
    <MEMBER> [= <VALUE>],
    // etc...
}

在以下示例中,我们为彩虹的颜色创建一个枚举,并为其指定各种常量和默认值:

enum RAINBOW
{
    RED,
    ORANGE,
    YELLOW,
    GREEN,
    BLUE,
    INDIGO,
    VIOLET
}

枚举条目只能是整数表达式,之前的枚举计算结果为整数,并且默认情况下从 0 开始编号,因此我们给出的示例以上默认为RED = 0ORANGE = 1YELLOW = 2等...

还可以在创建时为枚举变量指定值:

enum ENUM_TEST
{
    VAL = 10
}

enum RAINBOW
{
    RED = 5,
    ORANGE = 5 * 2,
    YELLOW = 15,
    GREEN = 20,
    BLUE = 25,
    INDIGO = 30,
    VIOLET = 35 * ENUM_TEST.VAL
}

请注意,在上面的示例中,我们使用另一个枚举来创建"VIOLET"的表达式。仅当所引用的枚举是在表达式中使用它的枚举之前创建时,此方法才有效,但它不适用于变量或函数,因为当项目正在编译。另请注意,所有枚举值的计算结果均为整数值,当您创建自己的枚举值时,您应该注意仅允许整数值才能使枚举发挥作用。该值可以是浮点双精度数可以表示的任何整数,包括负值。

要稍后访问给定枚举类型中的值,可以使用点"."方法,如下所示:

variable = <ENUM_NAME>.<ENUM_MEMBER>;

作为示例,我们使用在上面的代码中创建的"RAINBOW"枚举:

colour_value = RAINBOW.GREEN * RAINBOW.RED;

colour_value变量现在将保留值100(20 * 5 )。

注意 您不能在创建任何枚举常量后修改它的值,这与创建宏后不能修改它们非常相似。

注意 枚举值存储为 int64s,因此在它们上运行 is_real 将返回 false

内置常量

下表列出了项目中某些函数和操作可以返回的内置常量:

常量描述
pointer_nullThis constant indicates that the pointer is not pointing to anything meaningful (the same as NULL in C++ or null in C#).
This value is falsy.
pointer_invalidThis constant simply means that the value is not a valid pointer
undefinedThis constant is returned when a function has to return something but has no appropriate or "correct" value to return.
This value is falsy.
NaNThis constant that can be returned when the compiler cannot evaluate the results of an operation as a number - for example, 0 / 0 cannot be defined as a real number, and is therefore represented by NaN
infinityThis constant  refers to a number that is considered infinite, such as the result you would get when dividing any floating point value by zero, e.g. 1.0/0.
trueThis constant represents the value 1, which is what GameMaker will evaluate as a boolean "true" (note that any value equal to or greater than 1 will evaluate as true).
falseThis constant represents the value 0, which is what GameMaker will evaluate as a boolean "false" (note that any value less than or equal to 0 will evaluate as false).
piThis constant represents the value of pi: 3.141592653589793280..., although the exact value will depend on various factors like the OS or the platform being targeted.

有关上面列出的几个常数的等式比较信息,请参见等式表