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循环中使用break和continue语句。使用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章节。