如果您希望在游戏中使用文本,无论是用于对话、菜单还是仅用于调试,请使用字符串。
在 GML 中,文本被创建为字符串,可以存储在变量中。"字符串"是指组成文本的"字符串字符"。
GameMaker 有一套完整的函数,允许您以多种方式操作字符串,包括在另一个字符串中插入字符串、复制字符串以及分析字符串中包含的数字或字母。
它还具有更高级的字符串处理函数,包括修剪、拆分成数组、从数组连接和迭代字符。
最后,GameMaker 还提供了一种便捷的方法,通过为 结构 和 实例 分配一个 toString 方法 ,将其转换为字符串表示形式。
字符串是一种变量。最简单的创建方法是在双引号 "" 中添加文本:
my_first_string = "Hello World!";
上面的代码行创建了一个字符串,其内容为 "Hello World!" 并将其赋给名为 my_first_string 的变量。
注意 不接受单引号字符串 ' '。
注意 您不能在代码中将一个字符串拆分为多行,并期望 GameMaker 将其呈现为换行符,但是,您可以通过使用字符串标识符 @ 之前在您的字符串的开始引号来做到这一点,如下面的所述。
有时,您需要在字符串中添加特殊字符,如双引号 "、换行符或具有特定字符代码的字符。
这可以通过使用转义字符来完成。这些字符前面有一个反斜杠 \ 符号。例如,如果您想要在字符串中加引号,则应该是这样的:
str = "Hello\"World\"!";
GameMaker 还支持完整的四字节宽 Unicode 字符,允许您解码和编码标准上限的 Unicode 字符 (包括但不限于表情符号)。
要处理Unicode字符,您可以使用反斜杠\在十六进制的任何Unicode文字数字之前加上"u",例如,"\u00e2"代表"á",其中数字是Unicode字符的编号。在以这种方式使用Unicode时,您需要注意这样一个事实:GameMaker将解释"u"后面的所有数字,因此,如果您想要写"áa",例如,您应该使用:
"\u00e2\a"
或
"\u00e2\u61"
或
"\u00e2" + "a"
只使用 "\u00e2a" 实际上会产生 Unicode 字符 "ส"( 实质上变成 "\ue2a")。
GameMaker 还可以处理任何十六进制文字-通常写为 "0x" 后面的十六进制数字,例如 "0xff",其中数字形成要使用的字符的字符代码。在 GameMaker 字符串中,这些字符串使用 "\x",然后是十六进制值。下表列出了这些字符和其他预定义的转义字符:
常量 | 描述 |
---|---|
\n | Newline |
\r | Carriage return (0x0d) |
\b | Backspace (0x08) |
\f | Form Feed (0x0c) |
\t | Horizontal Tab (0x09) |
\v | Vertical Tab (0x0b) |
\\ | Backslash itself (0x5c) |
\a | Alert (0x07) |
\u[Hex Digits] | Insert Unicode character |
\x[Hex Digits] | Insert hex literal character |
\[Octal Digits] | Insert octal Unicode character |
注意 字符串支持换页、垂直制表符等...。但这并不意味着可以呈现,在绘制字符串时,这些字符可能会被忽略。
您可以通过在整个字符串前面加上 @ 字符来创建多行字符串文字:
var test = @"This string has
line breaks
over multiple
lines
";
上面的代码将创建一个字符串,该字符串在多行中呈现,就像包含换行符一样。字符串文字也可以使用单引号 ' ' 定义,如果前面加一个 @ 符号的话。
多行字符串文字不支持转义字符,例如,@"Hello\World" 将 不会 尝试对 World 上的 W 进行转义,并将逐字存储。但请注意,在使用这样的字符串文字时,如果希望将引号作为字符串的一部分,则需要断开字符串,例如:
var test = @"Hello " + "\"" + @"World" + "\"";
注意 在绘制事件中呈现时,Unicode 字符 9647(▯) 用于替换指定字体中可能缺少的任何 字形 。例如,如果你的字体没有 ° 符号,那么写 90° 实际上会产生 90▯。
模板字符串为您提供了一种方便的语法来创建和格式化字符串。您可以通过在字符串文字前面加上$字符,并在{ }中包含表达式来创建它们:
var _world = "Earth";
var _template = $"Hello {_world}!";
它生成的字符串与以下字符串相同:
var _world = "Earth";
var _template = string("Hello {0}!", _world);
模板字符串中花括号{ }之间的所有内容都作为常规GML执行。大括号之间的GML表达式的结果被插入到字符串中:
var _template = $"The result of a random complicated calculation is {5 * power(pi, 3) + 37.84094}";
为了更清楚地表明这是常规GML,脚本编辑器通常也会突出显示此代码。Feather还会检查这些GML表达式是否存在任何错误,例如:
var _arr = [ 1, 2, 3, 4 ];
var _a = $"The first value is {_arr[| 0]}"; // GM1028 - Accessor is intended for type of 'Id.DsList' but 'Array<Real>' appears instead.
可以将模板字符串拆分为多行,但只能在模板的表达式部分执行此操作。任何需要添加到实际字符串中的换行符和其他空白字符都必须使用转义字符添加。
下面的代码显示了将模板字符串拆分为多行的有效和无效方法:
var _a = $"This is the \n{
valid
}\nway to split a template across multiple lines";
var _b = $"This is the
{invalid}
way to split a template across multiple lines";
当将对对象的结构或实例的引用作为参数传递给 string/string_ext/show_debug_message/show_debug_message_ext 中的任何一个时,将调用其 toString 方法 (如果设置了一个方法)。
toString = function()
{
return string("I am the instance with ID {0}", id);
}
您可以将结构引用传递给上述函数之一以使用其 toString() 方法,但对于实例,您必须在其作用域内使用 self,因为传递实例 ID 不会调用其 toString() 方法。
// In an instance
string(self); // Calls its toString() method, if it exists
string(id); // Prints "ref <id>", same goes for IDs returned from instance_create_*()
提示 当将数组传递给上述函数之一时,它们会自动转换为字符串表示形式,而不需要为数组分配自定义函数。
如果要绘制结构或实例,则不需要使用 string() 将其转换为字符串。只需传递对 draw_text 或 任何相关的 draw_text_ 函数 的有效引用即可自动将其转换为字符串:
draw_text(0, 0, self);
下面是处理字符串的函数列表。
重要 与 GameMaker 中的其他数据类型都是从 0 开始的其他数据类型相比,GameMaker 中的字符串位置从 1 开始(表示它们从从1开始)。因此,字符串中的第一个字符的位置为 1,第二个字符的位置为 2,依此类推。最后一个字符是string_length(string)。