while

GameMaker语言有许多方法可以进行循环,其中最重要的是while循环。这个循环函数的形式是:

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

这里有一个语句,它根据表达式的求值结果反复迭代,即:使用while循环,只要表达式的计算结果为true,就会执行该语句(也可以是带有大括号{}的多个语句的代码块)。以下是使用 "while" 的典型方法示例:

while (place_meeting(x, y, obj_Wall))
{
    x -= 1;
}

上述代码正在检查调用的实例和 "墙 "的实例之间是否发生碰撞,当发生碰撞时,它将执行多次迭代 --将实例向左移动一个像素,直到实例不再发生碰撞。

什么时候应该使用while循环?当您想重复一个或多个语句时,应该使用该循环,但实际上不知道或不关心它必须重复多少次,请记住,如果初始评估为false,则可能无法运行这些语句。

请注意你应该循环时非常小心你的!你可以轻松地进行infinite循环,在这种情况下,你的游戏将挂起并且不再对任何用户的输入做出反应,需要强制关闭。例如:

while (!place_free(x, y))
{
    x = random(room_width);
    y = random(room_height);
}

现在,上面的代码可能工作正常,但是如果实例无法找到要移动到的空位置,也可能导致无限循环,这将导致游戏挂起。如果您发现自己处于这种可能性的位置,那么您应该使用不同的非阻塞循环类型,或者在表达式中使用额外的变量检查(可以与and(&&),or(||)xor(^^) 运算符 用于检查):

var _check = 0;
while ((!place_free(x, y)) && (_check < 100))
{
    x = random(room_width);
    y = random(room_height);
    _check += 1;
}
if (_check >= 100)
{
    // code failed, so deal with it
}

或者,您也可以使用break语句打破循环,例如,以下代码将生成100个随机数,然后继续,即使计算结果总是为true

var i = 0;
while (true)
{
    x[i] = random(room_width);
    y[i] = random(room_height);
    if ((i++) >= 100)
    {
        break;
    }
}

你也可以在一个while循环中使用continue语句。例如,使用它将结束当前的循环迭代,并在新的迭代中再次重启循环。

var file = file_text_open_read("Game_Data.txt");
var _num = 0;
while (!file_text_eof(file))
{
    var _s = file_text_readln(file);

    if (_s == "")
    {
        continue;
    }

    str[num++] = _s;
}

file_text_close(file);

上面这段代码将打开一个文件,并在每次循环迭代中从其中读取一行,直到达到文件内容的末尾。如果被读取的行是一个空字符串,则使用continue语句结束当前的循环迭代,并开始新的迭代,否则该字符串将被添加到数组中,数组的位置将被增加。

关于循环函数的更多例子,请参见repeatdo... untilfor部分。