同じ処理を繰り返したい場合は、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 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 ~ end
、repeat ~ 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
while
とrepeat
でも、途中で中断するときはbreak
を使います。
Luaには、コンティニューのコマンドがありません。 途中でやり直ししたい場合は、カウンターの値を変更します。
冒頭で示したコードを例に、Luaの基本事項をさらっと書いてきました。 なので、細かいことはその都度調べてみましょう。というか、そうしないと私自身が書けない。