if / else and Conditional Operators

大多数编程语言的基本特征是能够提出一个简单的问题,给出一个布尔truefalse的答案,而在GML中,这是用if关键字实现的。一个简单的if条件需要一个表达式,如果表达式解析为true,就会执行一个或多个语句 ,其基本形式如下。

if (<expression>)
{
    <statement>;
    <statement>;
    ...
}

您在这里所说的是,如果表达式解析为true,则执行某些操作。请注意,条件的"then"部分是隐式的,但可以使用then关键字(尽管它几乎总是被省略),因此您也可以创建如下条件:

if (<expression>) then
{
    <statement>;
    <statement>;
    ...
}

除了ifthen之外,如果要检查的表达式的计算结果为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 时评估更昂贵的表达式。

同样,如果某个条件在编译时可被评估为 truefalse,则整个条件将从代码中删除,例如,假设您有一个 DEBUG_ON 用于调试,它可以是 truefalse- 当它设置为 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;