7.Luaの関数

関数の制限

ブラシスクリプトでは、使用できるLuaの関数が限られているようです。 基本的に、データを読み込むか、加工するだけの関数が使えるようです。 また、すべて記述するのではなく、使用頻度が高そうな関数だけピックアップしていきます。

数学関数

角度とラジアン

ラジアンは、円周率を利用して角度を表す単位らしいです。円周率は、math.piという変数で取得できます。関数ではないです。 ラジアンは、math.pi*2で360度と同じになるようです。計算で求めると、以下のようになります。

しかし、計算で求めなくても、math.rad()math.deg()という関数で、簡単に求められます。 ()に値を入れるだけです。math.rad()でラジアンに、math.deg()で角度に戻せます。

math.sin()とmath.cos()

()に角度を入れると、サイン・コサインの値が返ってきます。 角度は、ラジアンです。bs_dir()でベクトルを取得できますが、個別にベクトルを取得したい場合に使うことが多いです。

local dx, dy=bs_dir()

-- bs_dir()と同じような値を求める。lastXとlastYは、前回の座標とする。

local angle=bs_atan(lastX-x, lastY-y)
local dx, dy=math.cos(angle), math.sin(angle)

ランダムにしたい

ひとまずランダムにしたいときは、math.random()で、0.0~1.0の乱数を得られます。 そして、()に値を入れると、指定した範囲の乱数を得られます。得られる乱数は、整数(符号つきではなさそう)です。 ちなみに、bs_grand()マイナスの値も範囲に含まれます。

-- 0から10の乱数を取得する。開始(0)と終了(10)の間に、コンマを入れる。

local rnd=math.random(0, 10)

-- math.random()とbs_grand()は、乱数の偏りに違いがある。

local rnd=math.random() -- 0.0~1.0の範囲で、直線的。
local rnd=bs_grand() -- -1.0~1.0の範囲で、途中で曲線的。

また、個人的に使用感がないのですが、math.randomseed(数値)で乱数のパターンを指定できるようです。 同じ数値を指定すれば、同じような乱数のパターンが得られます。 実際は、乱数のパターンをばらつかせるのに、毎回異なる数値を入れることが多いようです。

整数にしたい

整数にしたいときは、小数点以下を切り捨てるか、切り上げます。 切り捨てるときは、math.floor()を使い、切り上げるときは、math.ceil()を使います。 ()に、切り捨てか、切り上げをしたい数値を入れます。

-- 四捨五入してみる。
local a=5.4
local b=math.floor(a+0.5) -- 0.5を足すと5.9だが、切り捨てなので、5になる。

-- 切り上げる。次の大きい整数に繰り上がるはず。
local a=5.04
local b=math.ceil(a) -- 5.04が6になる。

数値の最大と最小

幾つかある数値の中で、最も大きい、小さいを求めるときは、math.max()math.min()を使います。 引数(カッコ内に入れる値)は、可変です。

local a=math.max(0, 2, 1, 3) -- 最も大きいのは、3。
local b=math.min(1.3, 2.5) -- 最も小さいのは、1.3。

絶対値にしたい

絶対にプラスの数値にしたいときは、math.abs(数値)を使います。

テーブル関連

テーブルの中身を順に見る

a={3, 2, 1}

for i=1, #a do
    local count=i -- テーブルのインデックス番号
    local value=a[i] -- テーブルの中身
end

テーブルの中身を順に見るには、上記のようにすれば可能ですが、ipairs(テーブル)という関数を使う方法でも可能です。

a={3, 2, 1}

for i, v in ipairs(a) do
    local count=i -- テーブルのインデックス番号
    local value=v -- テーブルの中身
end

テーブルに要素を追加する

テーブルに要素を追加するには、table.insert(対象のテーブル, 対象のテーブルの位置, 要素の値)という関数を使います。 対象のテーブルの位置を指定すれば、その位置に要素が追加され、テーブル全体の長さが増えます。 位置の指定を略して、table.insert(対象のテーブル, 要素の値)とした場合、テーブルの最後に追加され、前述と同じく長さが増えます。

a={1,  2,  3}

-- 位置指定ありの場合の結果は、a={1, 4, 2, 3}となる。
table.insert(a, 2, 4)

-- 位置指定なしの場合の結果は、a={1, 2, 3, 4}となる。
table.insert(a, 4)

テーブルに要素を削除する

テーブルに要素を削除するには、table.remove(対象のテーブル, 対象のテーブルの位置)という関数を使います。 対象のテーブルの位置を指定すれば、その位置にある要素は除かれ、テーブル全体の長さが減ります。 位置の指定を略して、table.remove(対象のテーブル)とした場合は、テーブルの最後の要素が除かれ、前述と同じく長さが減ります。

a={1, 2, 3}

-- 位置指定ありの場合の結果は、a={1, 3}となる。
table.remove(a, 2)

-- 位置指定なしの場合の結果は、a={1, 2}となる。
table.remove(a)

テーブルの中身を引数にする

テーブルの中身を引数にするには、unpacak(テーブル)という関数を使います。

t={10, 20}
x, y=unpack(t)

w, h=unpack({50, 50*0.24})

逆に、引数をテーブルにしたい場合は、{}で囲みます。 bs_dir()や、bs_fore()のような引数が一つ以上のある場合は、以下のようにすれば可能です。

dir={bs_dir()}
dx, dy=dir[1], dir[2]

color={bs_fore()}
r, g, b=color[1], color[2], color[3]

そして、テーブルにしたい関数の引数が可変であった場合も、同じようにします。 可変な引数自体はピリオド3つで表しますので、function name(...)のようになります。

-- ブラシスクリプトのパラメータを設定する関数の例。
-- 関数の引数が一定ではなくても、このようにしておけば対応できるはず。

function setParam(v, ...)
    local t={...} -- ここで引数を受け取る
    return function()
        if type(v) == "table" then
            return unpack(v)
        else
            return v, unpack(t)
        end
    end
end

Back to Index