条件分岐とは、if 条件 then~end
で終わるブロックを指します。間隔制御したいときは、このようにしていますよね。
まず、if not firstDraw then
を注目します。firstDrawは、初回描画であるか、否かを表す用途で使われています。
この場合は、既にfirstDrawにtrueと代入されていて、初回描画である状態です。そのあと、常にfirstDrawにfalseが代入されていて、初回描画ではない状態です。
trueとfalse自体は、状態を表す値のようなものです。trueは肯定、falseは否定します。 if not firstDraw then
は、初回描画ではない状態を条件としていて、現在の状態がこの条件と合うかを問いかけています。 例えば、firstDrawにflaseが代入されている状態であれば、この条件に合うのでtrueとなります。 逆に、初回描画である状態ならばfalseとなり、以下のブロックは無視して実行されません。 つまり、if 条件 then~end
のブロックは、trueとなれば処理がされる訳です。
ちなみに、未定義を表すnilをfirstDrawに代入したらどうなるでしょう。 上のif not firstDraw then
では、falseになります。 Luaでは、否定を表す値としてfalseの他に、nilもあるということです。
次に、if distance < w*bs_param1()/100 then
を注目します。さらに条件分岐したいのか、入れ子になっています。 if 条件 then~end
がひとつのブロックとすると、その中にもうひとつ、ブロックを作ったことになります。 このように、条件分岐で細かく制御することができます。
not、and、orは、複数の条件があるときに使います。 notは、とにかく条件に合致しないときにture、寧ろ合致するときはflaseとなります。 andは、条件と条件が重なって合致したときにtrue、重ならずに合致しないならfalseとなります。 orは、条件がひとつでも合致するならture、どれも引っかからないならfalseとなります。
ちなみに、変数の初期化にa=a or 0.5
と書いても、エラーにはなりません。というより、a or 0.5
も式であるからだと思われます。 それに、aの変数が先に定義されていなければa=nil
であるのでfalse、結果的にa=0.5
となります。 これは、デフォルト値の設定で割と使われているようです。
値がある数より小さいか、大きいか、あるいは同じなのかと比較して、処理を分けることが多々とあります。 例えば、if distance < w*bs_param1()/100 then
というのは、distanceがw*bs_param1()/100
より小さいときを表します。 要するに、以下の不等式のような式で条件を表します。
a < b
a > b
a <= b
a >= b
a == b
a ~= b
条件ごとに処理を振り分けたいときは、elseかelseifを使うと良さげな場合があります。使用例としては、以下のとおりです。
local w=bs_width()
local distance=bs_distance(lastX-x, lastY-y)
local interval=0
-- wが10より小さいとき
if w < 10 then
interval=w+w*bs_param1()/100
-- wが20より小さいとき
elseif w < 20 then
interval=w/1.5+w*bs_param1()/100
-- wが10以上、いや20以上のとき。つまり上の二つの条件以外の場合。
else
interval=w/2+w*bs_param1()/100
end
if not firstDraw then
if distance < interval then
return 0
end
end
また、if 条件 then~end
のブロックを入れ子にした例は、以下のとおりです。
local w=bs_width()
local distance=bs_distance(lastX-x, lastY-y)
local interval=w/2+w*bs_param1()/100
-- wが20より小さいとき
if w < 20 then
interval=w/1.5+w*bs_param1()/100
-- wが10より小さいとき
if w < 10 then
interval=w+w*bs_param1()/100
end
end
if not firstDraw then
if distance < interval then
return 0
end
end
上の2つの例は同じ内容ですが、入れ子にすると順に範囲を狭めていく必要があります。 突飛があるような条件が複数であるならば、elseとelseifを使うと後から追加したり、並べ替えたりするのが楽です。 ただし、入れ子は視覚的に範囲が把握しやすい点があると思うので、ケースに応じて使い分けるといいかもしれませんね。