6.ループ

カウンターの設定

同じ処理を繰り返したい場合は、for 変数=始まりの数値, 終わりの数値, 増減分(略すと1になる) do ~ endとなります。 最初に示したコード内では、以下のとおりにループ処理を記述しています。 処理自体は、テーブルの値を順に取り出し、指定した大きさと色の円で描画しています。

for i=1, #array do -- 増減分は略しているので、1ずつ増える
    local w=array[i][1]
    local c=array[i][2]
    bs_ellipse(x, y, w, w, 0, r*c, g*c, b*c, a)
end

まず、for i=1, #array doを注目します。i=1は、カウンターの開始数値を指定しています。 #arrayは、テーブルが持つデータの数(多次元の分は含まない)を表し、カウンターの終了数値としています。 この場合、#arrayは3となるので、1から3まで、つまり3回分の処理が発生します。

そして、変数iは1から3まで変化するので、テーブルの値を順に取り出すのに利用できます。

local w=array[i][1] -- 2次元の1番目
local c=array[i][2] -- 2次元の2番目

最終的に、このように描画されています。

-- テーブルはこのように定義している

local array={
    {w, 0},
    {w/1.5, 0.5},
    {w/3, 1}
}

-- 直接的に記述するとこんな感じ

bs_ellipse(x, y, w, w, 0, r*0, g*0, b*0, a) -- 1回目、暗い色の大きな円
bs_ellipse(x, y, w/1.5, w/1.5, 0, r*0.5, g*0.5, b*0, a) -- 2回目、グレー化した中くらいの円
bs_ellipse(x, y, w/3, w/3, 0, r*1, g*1, b*1, a) -- 3回目、明るい色の小さな円

ループの中断

もし、ループを途中で中断したいときは、breakを使います。例えば、2回目で中断したい場合は、以下のとおりにします。

for i=1, #array do

    if i == 2 then
        break -- iが2のときに中断
    end

    local w=array[i][1]
    local c=array[i][2]

    bs_ellipse(x, y, w, w, 0, r*c, g*c, b*c, a)

end

話が脱線しますが、while 条件 do ~ endrepeat ~ until 条件でも、似たようなことができることがあります。 条件が合うまで繰り返されるのではなく、条件が合わなくなるまで、繰り返されます。 以下は、whileの場合です。

local a=nil

while a ~= 5 do
    a=math.random(0, 5)
end

-- 以下と同等なはず...

local a=nil

for i=0, 0, 0 do
    if a == 5 then
        break
    end
    a=math.random(0, 5)
end

repeatの場合です。

repeat
    local a=math.random(0, 5)
until a ~= 5 -- ここでendとなるので、条件式でローカル変数を使ってもOKっぽい

-- 以下と同等なはず...

for i=0, 0, 0 do
    local a=math.random(0, 5)
    if a == 5 then
        break
    end
end

whilerepeatでも、途中で中断するときはbreakを使います。

コンティニュー

Luaには、コンティニューのコマンドがありません。 途中でやり直ししたい場合は、カウンターの値を変更します。

local a=nil

for i=0, 5 do
    if a ~= 5 then
        i=0
    else
        break
    end
    a=math.random(0, 5)
end

一旦、区切り。

冒頭で示したコードを例に、Luaの基本事項をさらっと書いてきました。 なので、細かいことはその都度調べてみましょう。というか、そうしないと私自身が書けない。

Back to Index