for

语句(或语句)进行多次迭代的最常用方法之一是对循环使用,其形式如下:

for (<assignment>; <expression>; <operation>;)
{
    <statement>;
    <statement>;
    ...
}

其工作原理如下 - 首先执行赋值操作,将值赋给变量,然后计算表达式,如果为true,则执行大括号{ }中的语句被处决。接下来,对分配的变量执行运算,然后再次计算表达式。此循环将继续下去,直到发现表达式为false

现在,这样写可能听起来很复杂,但你应该把它解释为。

  1. 第一个赋值初始化 for 循环
  2. 测试循环表达式是否应结束 (语法中 expression)
  3. 执行语句 ({}内语句 statement)
  4. 执行运算 (语法中 operation)
  5. 返回步骤2并再次执行表达式,然后继续或退出循环

注意您可以在赋值部分使用var语句来初始化多个变量。请参阅局部变量

这对于执行以任何其他方式涉及多行代码的重复任务非常有用,并且通常用作评估数组、绘制事物、设置增量值等的计数器。以下代码示例说明了此方法的典型用途声明类型:

for (var i = 0; i < 10; i += 1)
{
    draw_text(32, 32 + (i * 32), string(i) + ". "+ string(scr[i]));
}

上面的代码初始化了一个for循环,从0开始,一直数到(包括)9,然后使用i的循环值,在屏幕上画出存储在数组中的数值。请注意for循环变量i是如何被用于不仅循环数组,而且绘制数字以及告诉GameMaker在房间里把数值画到哪里。这种灵活性是for循环在编程中如此重要的主要原因之一。

什么时候应该使用for循环?任何时候,你需要对一条或多条语句执行固定数量的迭代,同时跟踪当前正在运行的迭代,并使用该迭代值。

注意在与其他人合作时,您将看到多个关于循环计数器变量使用变量ij的示例。这些不是强制变量名称,您可以使用afoo等名称。ij的使用只是编程中的标准约定。

值得注意的是,您也可以在for循环中使用特殊的breakcontinue语句。使用break将立即退出循环,并在循环结束后继续执行事件或函数中的任何代码,例如:

var _inst = noone;
for (var i = 0; i < 10; i += 1)
{
    _inst = instance_find(obj_Enemy_Parent, i);
    if (instance_exists(_inst))
    {
        if (_inst.object_index == obj_Enemy_Melee)
        {
            break;
        }
    }
}
target = _inst;

上述代码循环遍历给定"父"对象的 10 个最近的实例,如果找到实例,则检查实例对象 ID,如果它是obj_Enemy_Melee的实例,则使用结束循环break以及分配给变量的 ID 值(如果未找到实例,则关键字noone将添加到变量中)。

for循环中使用continue的一个例子是:

var _val = 0;
for (var i = 0; i < 10; i += 1)
{
    if (val_array[i] <= 0)
    {
        continue;
    }
    _val += val_array[i];
}
draw_text(32, 32, "Positive Values Total = " + string(_val));

这段代码将检查存储在长度为10的1D 数组的每个数组位置中的值,如果其中任何值小于或等于0,它将继续循环,这意味着当前迭代将结束,i将递增,并开始下一个循环迭代。如果该值大于0,则将其添加到本地变量_val中,在循环完成后,将总值绘制到屏幕上。

有关循环关键字的更多示例,请参阅repeatwhiledo / until部分。