常量(constant)是一种变量,在游戏开始时被设置一次,然后永远不会改变。事实上,常量值在被声明后不能被改变。这使它们成为保存整个游戏中用于识别特殊数据的数值的理想选择。
在GameMaker语言中,有两种类型的用户定义常量:宏和枚举,,下面将对这两种类型进行解释。还要注意,始终相同的任何值都被归类为常量,而与数据类型无关,例如字符串或数字3。
注意 GameMaker 语言也有许多用于标识特定事物的内置常量值。在 GML 参考 部分中需要它们的运行时函数的相应页面上概述了这些内容。
虽然不完全是变量,但宏在使用方式上与它们相似,即:它们是命名的值,你可以在整个代码中使用它们来替换硬编码的值。基本上,宏是一个持有表达式的命名变量。你可以用脚本编辑器来定义你自己的宏,然后在你的代码和动作中使用它们,就像它们是普通变量一样,唯一不同的是,它们不能在游戏中被改变。
宏的语法结构如下所示:
#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继承,您可以通过为该子配置设置宏来覆盖继承的值。
枚举是一个"枚举器"它本质上允许您使用常量值列表创建自己的有限数据类型。它们的结构如下:
enum <NAME>
{
<MEMBER> [= <VALUE>],
<MEMBER> [= <VALUE>],
// etc...
}
在以下示例中,我们为彩虹的颜色创建一个枚举,并为其指定各种常量和默认值:
enum RAINBOW
{
RED,
ORANGE,
YELLOW,
GREEN,
BLUE,
INDIGO,
VIOLET
}
枚举条目只能是整数或表达式,之前的枚举计算结果为整数,并且默认情况下从 0 开始编号,因此我们给出的示例以上默认为RED = 0、ORANGE = 1、YELLOW = 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_null | This 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_invalid | This constant simply means that the value is not a valid pointer |
undefined | This constant is returned when a function has to return something but has no appropriate or "correct" value to return. This value is falsy. |
NaN | This 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 |
infinity | This 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. |
true | This 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). |
false | This 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). |
pi | This 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. |
有关上面列出的几个常数的等式比较信息,请参见等式表。