4.条件分岐

真偽を問う条件分岐

条件分岐とは、if 条件 then~endで終わるブロックを指します。間隔制御したいときは、このようにしていますよね。

if not firstDraw then
    if distance < w*bs_param1()/100 then
        return 0
    end
end

まず、if not firstDraw thenを注目します。firstDrawは、初回描画であるか、否かを表す用途で使われています。

この場合は、既にfirstDrawtrueと代入されていて、初回描画である状態です。そのあと、常にfirstDrawfalseが代入されていて、初回描画ではない状態です。

firstDraw=false
lastX=x
lastY=y

truefalse自体は、状態を表す値のようなものです。trueは肯定falseは否定します。 if not firstDraw thenは、初回描画ではない状態を条件としていて、現在の状態がこの条件と合うかを問いかけています。 例えば、firstDrawflaseが代入されている状態であれば、この条件に合うのでtrueとなります。 逆に、初回描画である状態ならばfalseとなり、以下のブロックは無視して実行されません。 つまり、if 条件 then~endのブロックは、trueとなれば処理がされる訳です。

ちなみに、未定義を表すnilfirstDrawに代入したらどうなるでしょう。 上のif not firstDraw thenでは、falseになります。 Luaでは、否定を表す値としてfalseの他に、nilもあるということです。

次に、if distance < w*bs_param1()/100 thenを注目します。さらに条件分岐したいのか、入れ子になっています。 if 条件 then~endがひとつのブロックとすると、その中にもうひとつ、ブロックを作ったことになります。 このように、条件分岐で細かく制御することができます。

条件自体を比較する

notandorは、複数の条件があるときに使います。 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というのは、distancew*bs_param1()/100より小さいときを表します。 要するに、以下の不等式のような式で条件を表します。

elseとelseif

条件ごとに処理を振り分けたいときは、elseelseifを使うと良さげな場合があります。使用例としては、以下のとおりです。

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つの例は同じ内容ですが、入れ子にすると順に範囲を狭めていく必要があります。 突飛があるような条件が複数であるならば、elseelseifを使うと後から追加したり、並べ替えたりするのが楽です。 ただし、入れ子は視覚的に範囲が把握しやすい点があると思うので、ケースに応じて使い分けるといいかもしれませんね。

Back to Index