【Luaによる制御(3)】(るあによるせいぎょ さん)


Luaに触ったことがない人向け、Lua講座。
Rigid Chipsのモデルデータが書ける事を前提で進めますんでよろしく。
第3回では、Luaを使う利点ともいえる繰り返しと関数について説明します。

チャンクとブロックと変数のスコープ 〜みんなにはナイショだよ?〜

この後の話を進めるために、Lua言語について少し掘り下げなければなりません。
ですが、ここを我慢できればその後の理解が楽になるはずです、お付き合い下さい。

Lua言語は基本的に一行一行スクリプトを実行する言語です。
この実行単位をチャンクと呼びます。
基本的に省略できますが、チャンクの終わりには";"をつけても構いません。

hoge = moge[;] -- これがひとつのチャンク、[]内は省略可能です。

そのチャンクをいくらかまとめたものをブロックと言います。
チャンクをまとめるにはdoキーワードとendキーワードでチャンクを囲みます。

do
	hoge = moge --チャンク
	moge = hoge --チャンク二個目
end

これで、do〜endまでが一つのブロックとしてまとまりました。

これで何が楽しくなるかと言えば、「局所変数」というものが使えるようになることです。
局所変数はlocalキーワードを用いて宣言された変数です。

hoge = 
do	--ブロック始め 
	local hoge = {}	-- なにやら局所的な変数hogeを宣言
end	-- ブロック終わり


局所変数は、そのブロックの中でしか使えません。ブロックの外に処理が移ると値は破棄されてしまいます。

実は、(1)で説明したif文ですが

if 条件式 then 処理 end

というのは

if 条件式 then ブロック end

と同じ事なのです。

関数の宣言 〜さらばgoto、こんにちはfunction〜

関数を使用すると、同じことを何度もやったり、処理の単位をまとめたり便利になります。
次のような形で使います

function hoge()	--関数の宣言
	--ブロック
end

hoge()	--関数を使いたいとき。


hogeというのは関数の名前で、自分の好きな(わかりやすい)名前をつけてかまいません。
関数を使うと関数の中身の処理をした後、戻ってきて次の文を処理しはじめます。
gotoで飛んで、またgotoで帰ってくることと同じ動作を自動でやるのです。

また関数には、値を渡したり、返したりするようにすることが出来ます。

function bai(arg)	--値を渡したいときの関数の宣言
	local r = arg * 2	--渡された値を使っている例
	return r	--値を返したいとき。
end

ans = bai(2)	--返す値を使いたいときには、このようにします。


例であげたargというのは引数というもので関数に値を渡したいときに使います。これも自分の好きな名前をつけてかまいません。
この値はローカル変数とおなじでブロックの外、つまり関数の処理が終了すると値が破棄されてしまいます。

繰り返し 〜どこまでも続くルーチンワークに嫌気がさして〜

同じ作業を何回も繰り返したいときにはforを使います

for 変数名 = 初期値 , 終了値 [, 増加値] do
	--ブロック
end

まず変数名で指定した変数に初期値が代入されます。 1度do〜endを処理するたびに変数に増加値分だけ足されていき、そしてその変数の値が終了値に達すると繰り返しが終了します。

増加値は省略することが出来、その場合変数は1づつ増えていきます。


繰り返しをする方法には他にもいくつかあります。

while 式 do ブロック end	--式がtrueの間繰り返す。まず式を調べてからブロックに移る。
repeat ブロック until 式	--式がtrueになるまで繰り返す。まずブロックを処理してから式を調べる。

whileは条件が合わないと中のブロックを丸々とばします。
repeatは条件が合わなくても、最低1回は処理にはいります。

i = 10

while i < 5 do
    i = i + 1 --実行されません
end

repeat
    i = i + 1 --1回だけ実行
until i < 15
--この時点でiは11

途中で特殊なときに抜け出したいとき、break文を使います。

break	--もっとも内側のループから抜け出す文

if文と一緒に使うことが多いでしょう

for i = 0, 512 do
    if TBL[i] = 25 then
        --値が25の要素を見つけたら処理を抜ける。
        break
    end
end
--break後の処理はここから始まる。


その他の関数

Luaでは初期化(主にUを押したとき)やリセット(Rを押したとき)をしたときの処理を設定することが出来ます。

function OnInit()
    --初期化時の処理
end
function OnReset()
    --リセット時の処理
end

初めの一回だけやりたい処理はこの関数の中に書くとよいでしょう。
また、main()関数の代わりに次の関数を使うことも出来ます。
働きはmain関数と同じです。

function OnFrame()
    --毎フレームの処理
end

こちらを使うとOnInitなどとの名前の一貫性があるため、見た目がよくなります。・・・それだけ。