Unityも面白いけれど、Luaも好き
Unityでゲームを作成するのも面白いのですが、solar2Dでガリガリ書くのが好きです。
ゲームには現在の状態を管理する方法が必須です。
今回は現在のステータスと、ステータスの入れ替えをできるだけ綺麗に書こうと頑張ったコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
-- Status Manager function statusManager(list) local MM = {} local items = {} function resetList() for k,v in pairs(items) do items[k] = false end end for i,v in ipairs(list) do items[v] = false MM[v] = { isON = function() return items[v] == true end, isOFF = function() return items[v] == false end, setON = function() resetList() items[v] = true end, setOFF = function() resetList() items[v] = false end } end return MM end |
特徴
例えばC言語でEnumを使うと、これらのStatusはかなりシンプルにかけます。
比較時の対象を定数として扱えるので、何を比較したいか一目瞭然となります。
同じように、例えば以下のように記述したくなかった、というが、このコードを書いた理由です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
-- 1: if status == "idle" then end -- 2: idle = 0 battle = 1 status = idle if status == idle then end -- 3: STATUS = {idle = 0, battle= 1} status = STATUS.idle if status == STATUS.idle then end |
1の場合、ステータスがどのような値を取るのか、コードのあちこちに散らばり、収集がつきません。文字列を比較対象に取るなど、ミスが多発しそうで、論外ですね。
2の場合はステータスの分だけ行数を消費していき、さらに中身の設定に気を遣わねばならず、論外ですね。
3は C言語の Enum をそのまま持ってくるのに近い形です。しかし大概ステータスは同時にONにならないため、入れ替えが必要です。
そこで上記のコードです。利用例はこのようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
status = statusManager{"idle", "battle"} -- 現在その状態かどうか status.idle.isON() -- 現在その状態ではない、かどうか status.idle.isOFF() -- 現在を battle 状態にする。 status.battle.setON() -- 現在をidle状態にする。(自動的にbattleがoffになります) status.idle.setON() |
ステータスの、どの値を確認したいか、が if の中で明白なります。また設定も一行です。
もっと機能を盛りたくなりますが、ぐっと抑えておきます。