大多数编程语言的基本特征是能够提出一个简单的问题,给出一个布尔true或false的答案,而在GML中,这是用if关键字实现的。一个简单的if条件需要一个表达式,如果表达式解析为true,就会执行一个或多个语句 ,其基本形式如下。
if (<expression>)
{
<statement>;
<statement>;
...
}
您在这里所说的是,如果表达式解析为true,则执行某些操作。请注意,条件的"then"部分是隐式的,但可以使用then关键字(尽管它几乎总是被省略),因此您也可以创建如下条件:
if (<expression>) then
{
<statement>;
<statement>;
...
}
除了if和then之外,如果要检查的表达式的计算结果为false,您还可以使用else关键字执行其他操作。此"if... then ... else ..."形式如下所示:
if (<expression>)
{
<statement>;
}
else
{
<statement>;
}
在这种情况下,将对表达式进行求值,如果其求值为false,则执行else之后的语句,否则执行初始语句(为true)。
注意在GameMaker语言中,任何小于或等于0的值将被评估为false,而任何大于0的值将被评估为true。
始终在表达式两边加上圆括号(),在if中的语句两边加上大括号{}(否则只会执行第一条语句),这是一个好习惯。每个语句在块中换行,例如:
// This will work
if <expression> <statement>;
// Example:
if test == true variable = false else variable = true;
// This is better
if (<expression>)
{
<statement>
}
else
{
<statement>
}
// Example
if (test == true)
{
variable = false;
}
else
{
variable = true;
}
请注意,虽然这稍微比较冗长,但它意味着代码中没有歧义,并且它将始终在所有平台上正确编译。但是,初始示例可能不是,如表达式和运算符页中的部分所述。
注意比较两个值是否相等时,应使用"=="运算符,并且仅使用"="运算符进行赋值。目前GameMaker将它们视为可互换的,但这可能会在未来改变,当使用正确的运算符进行比较和赋值时,您的代码会更清晰,更明显。
要给出使用if的正确示例,请考虑以下代码,当放置在Step Event中时,这些代码将使实例朝向房间中的位置x= 200移动:
if (x < 200)
{
x += 4;
}
else
{
x = 200;
}
请注意,您还可以在if中执行复合检查,即:检查同一语句中的各种值或表达式。这些检查可以使用各种组合运算符( && 和 || 或 ^^ 异或)。执行此操作时,GameMaker 将一次对它们中的每一个进行评估,并根据它们的评估方式,然后可能会跳过其余部分。例如:
if (keyboard_check_pressed(vk_enter)) && (instance_exists(obj_Player))
{
go = false;
alarm[0] = game_get_speed(gamespeed_fps);
}
此处,我们使用 && "and" 运算符进行检查,因此它会检查 if 中的两个条件是否都计算为 true,并且第一个条件是否为 true 其中一个为 false,则第二个甚至不会被检查。
这称为 " 短路 " 代码,因此在组合要检查的表达式时,您应该确保性能 " 最便宜 " 的表达式始终是第一个,以避免在第一个计算结果为 false 时评估更昂贵的表达式。
同样,如果某个条件在编译时可被评估为 true 或 false,则整个条件将从代码中删除,例如,假设您有一个 宏 DEBUG_ON 用于调试,它可以是 true 或 false- 当它设置为 false 时,以下代码块将在编译时从游戏中删除:
if (DEBUG_ON == true)
{
show_debug_message("Instances = " + string(instance_count));
}
您还可以执行 条件运算 ( 也称为 三元 运算),这本质上是执行基本 if 的 " 快捷方式"。它具有以下语法:
variable = <condition> ? <statement1 (if true)> : <statement2 (if false)>
条件运算符"?"将返回两个给定值中的一个,具体取决于条件表达式的计算结果是true还是false,例如:
var temp_x = (x < (room_width / 2)) ? 32 : (room_width - 32);
上述代码将根据房间宽度的一半的值检查"x"的值,如果该值小于该值,则将"temp_x"设置为32,否则"temp_x"将为房间宽度-32。以下是更多的使用示例:
draw_text(x, y, "The fee is " + (global.Member ? "$2.00" : "$10.00"));
path_start(((global.level > 10) ? path_hard : path_easy;), 2, path_action_reverse, true);
您可以嵌套条件操作,但如果这样做,则每个操作都需要用括号括起来,例如:
var c = a ? "foo" : (b ? "bar" : "whee"); // Correct
var c = a ? "foo" : b ? "bar" : "whee"; // Will cause an error
请注意,条件运算必须是表达式的一部分,并且不能位于赋值的左侧。例如,以下语句不起作用:
(--hp <= 0) ? instance_destroy() : score += 10;