Data Types

在前面的章节中,我们介绍了变量及其范围规则,但对于变量可以存储的不同数据类型却鲜有说明。因此,本节将说明不同的类型以及它们可用于哪些目的。

注意您可以使用函数typeof来获取变量所保存的数据类型。

在继续之前,我们先简要解释一下"数据类型"的含义。当你创建一个变量时,它可以用来保存信息,当你调用一个函数时,它也可以存储返回的信息。不过,此信息可以有多种"风格" - 例如,它可以是实数,也可以是字符串。使用的这些不同类型的值称为数据类型,使用 GameMaker 语言时,它们可以是以下任意类型:

Real NumbersReal Numbers 实数

实数是除字符串以外的任何值,也不是任何其他可能的数据类型。所以,124、45639.566546456、0、-45.5等都是实数的例子。所有实数都存储为 64 位双精度浮点值(或整数值),编译器将尽可能进行优化(例如 0.0 将优化为整数值 0)。

处理任何非整数值时,由于浮点数学的性质,您可能会遇到轻微的舍入错误。有关此函数和其它与数字相关的函数的详细信息,请参阅:GML 参考-数字函数

注意HTML5目标上,所有实数均为双精度数。

注意虽然在GameMaker中创建的变量全部存储为双精度浮点数或整数,但在处理扩展时您仍然可以使用其他格式。这些可以从扩展程序传递到GameMaker,然后使用适当的is_*()函数进行检查,可以在数据类型函数下找到该函数的列表。

  

BooleanBoolean 布尔

布尔值只是一个可以为 true 也可以为 false 的值。请注意,目前GameMaker会将等于或低于 0.5 的实数解释为false值,将任何大于 0.5 的实数解释为true。但这并不意味着您应该检查 1 和 0(或任何其他实数)中的truefalse,因为我们还提供了常量truefalse,应始终在代码中使用它们,以防止在将来的更新中添加实际布尔数据类型时出现任何问题。

您可以使用以下函数将任何实数转换为隐式布尔值:

 

StringsStrings 字符串

 

ArraysArrays 数组

 

StructsStructs 结构

 

Method VariablesMethod Variables 方法变量

 

int64int64

"int64"是一个 64 位整数,可以使用int64(通过传入非 64 位实数)或从buffer读取buffer_u64的值。

这可用于严格要求64位整数的位置,也可用于要使用位移并需要这些64位位置的位置。

任何按位运算,即使在非 64 位值上运行,也始终返回 64 位整数。

int 64值的除法也将返回整数(例如:int 64(5 )/ int 64(2 )= 2

数据结构和资产(例如对象、精灵等)的引用存储为 int64,其中前 32 位包含有关资源类型的信息,接下来的 32 位包含资源的 ID。有关详细信息,请参阅下一节"句柄"。

 

HandlesHandles 句柄

句柄包含对以下资源类型之一的引用:

当你创建一个新的资源(使用_create()函数)或在代码中引用一个现有的资源(比如引用一个对象,通过一个函数获取一个实例,等等)时,你会得到一个句柄。

句柄是一个64位整数,其中前32位包含有关资源类型的信息,后32位包含资源的索引号。

如果将句柄转换为数字(使用realint64),您将获得索引号。

句柄中的类型信息用于确保将正确类型的资源传递到函数中(例如,确保您将DS列表传递到ds_list_add,而不是DS映射、网格或其他内容)。

如果将句柄转换为字符串或将其打印为输出,您将看到格式为"ref <type> <id>"的字符串,例如"ref ds_list 1"

您可以使用handle_parse函数将正确格式为"ref <type> <id>"的字符串转换回句柄。

 

Hexadecimal Literals 十六进制文字Hexadecimal Literals 十六进制文字

GameMaker将接受十六进制文字作为合法值。使用颜色时,十六进制值尤其常见,但可以在需要正整数值的任何地方使用。十六进制值可以通过以下两种方式进行格式化,其中abcd将是实际的十六进制值:

$abcd
0xabcd

例如,以下十进制值可以表示为十六进制,如图所示:

11406 -> $2c8e, 0x2c8e
16777215 -> $ffffff, 0xffffff


十六进制值也可以以井号/井号(#) 开头,但是以这种方式编写时,其值将不等于使用先前显示的格式($0x)。这是由于 GML 中解释颜色的方式造成的,GML 需要更改哈希/磅十六进制值的格式,以便可以以#RRGGBB格式写入 CSS 颜色。如需了解更多信息,请参阅十六进制颜色

例如,以下两项不相等:

$2c8edd != #2c8edd

要使它们引用相同的十进制值,必须交换前两个和最后两个字符:

$2c8edd == #dd8e2c

 

Binary Literals 二进制文字Binary Literals 二进制文字

您可以编写带有前缀 0b 的二进制文字:

var _six = 0b0010 | 0b0100; // produces 0b0110, or 6

上面的代码显示了两个二进制值,00100100,用于逐位"或"运算

 

PointerPointer 指针

指针是一种"指向"内存位置的数据类型。您无法在GameMaker中对指针进行操作,它仅用于某些非常特定的函数,例如从内存中获取另一个函数的纹理或缓冲区地址。有关返回指针的函数示例,您可以查看buffer_get_addresssprite_get_texture

还有一个函数用于检查值是否为指针(请参阅下面的"检查数据类型"),以及一个函数用于将值转换为指针:

使用指针时,您还可以使用(并返回)以下内置常量:

常量描述
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

 

EnumEnum 枚举

枚举是"枚举器(enumerator)",它基本上允许您使用常量值列表创建自己的有限数据类型。常量的页面上详细说明了枚举。

 

UndefinedUndefined 未定义

ds_map_find_value

 

NaNNaN 非数字

请注意,由于NaN不是数字,因此无法将其与自身进行比较,因此比较(例如NaN==NaN)将返回false。对于数组比较(例如:

show_debug_message(array_equals([NaN], [NaN]));

// Output: 0 (false)

 

InfinityInfinity 无穷大

常量infinity是指被视为无穷大的数字,例如将任何浮点值除以零时得到的结果,例如:1.0/0。

请注意,infinity常量等于其自身,因此infinity == infinity将返回true

AnyAny 任何

Any”数据类型可以在手册的许多页面上找到,例如在参数中,或作为返回值。它表示接受或返回任何类型的值

按原义加下划线

您可以在数字文字中使用下划线(_),例如实数、十六进制和二进制值。这些在编译期间被忽略,仅用作视觉分隔符。这里有一些例子:

var _integer = 100_000_000; // same as 100000000
var _float   = 3_141.59; // same as 3141.59
var _hexadec = 0xDEAD_BEEF; // same as 0xDEADBEEF
var _binary  = 0b01101000_01101001; // same as 0b0110100001101001

上面显示的文字中使用的所有下划线只会使它们更易于阅读,并且不会更改其功能的任何内容。

相关内容

可以使用以下页面中列出的函数检查任何变量的数据类型:

您还可以在此处找到显示使用混合变量数据类型的不同操作结果的算术类型表格: