do / until

do函数是对一个或多个语句 进行多次迭代的另一种方式,它实际上是一个"do...until"语句,因为您要告诉GameMaker在特定的表达式返回true之前执行某些操作,所以不能只使用其中一个语句。它具有以下形式:

do
{
    <statement>;
    <statement>;
    ...
}
until (<expression>);

语句(可以是大括号内的多个语句的代码块)被执行,直到发现表达式为true,并且初始语句总是被至少执行一次。下面你可以看到一个使用do...until的典型方法的例子。

do
{
    x = random(room_width);
    y = random(room_height);
}
until (place_free(x, y));

上述代码试图将当前对象放置在一个自由的位置上,并将至少设置一次x/y变量,然后根据需要进行多次迭代s,直到place_free()表达式返回true

什么时候应该使用do/until循环?当您希望重复一个或多个语句,但不知道必须重复多少次时,应该使用该循环,并希望确保在循环结束之前至少运行语句。

你也可以在你的do循环中使用breakcontinue语句。使用break将立即退出循环,并在循环结束后继续处理事件或函数中的任何代码,例如。

var _id = noone;
do
{
    _id = list[| 0];
    if (instance_exists(_id))
    {
        _break;
    }
    ds_list_delete(list, 0);
}
until (ds_list_empty(list));

target = _id;

在上面的代码中,我们创建了一个局部变量,并将其设置为持有关键字noone。然后我们执行一个do/until循环,检查DS列表的第一个位置,看它是否有一个有效的实例ID,如果有,我们中断循环,否则列表位置的值被删除。循环结束后(无论是通过break还是因为列表为空),本地变量的值被分配给实例变量target

do/until循环中使用continue的一个例子是:

do
{
    var _x = random(room_width);
    var _y = random(room_height);
    if (instance_position(_x, y, obj_Enemy)
    {
        continue;
    }
    instance_create_layer(_x, _y, "Instances", obj_Enemy);
}
until (instance_count(obj_Enemy) >= 10);

此代码将生成随机房间位置,然后检查对象obj_Enemy的实例是否存在于该位置。如果是,则使用继续终止当前循环迭代,并启动新的迭代;如果不是,则在随机位置创建对象obj_Enemy的实例。只有当房间中有10个或更多对象实例时,循环才会终止。

最后一个注意事项:小心do循环,因为您可以轻松地让它们永远循环,在这种情况下,您的游戏将挂起,不再对任何用户输入做出反应,它们将不得不强制关闭。

更多关于循环关键字的例子,请参见repeat,while,和for章节。