プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

cocos2d-x Lua RPGのサンプルほぼ完成

iPhone/iPad/iPod touchプログラミングバイブルのサンプルゲームをLuaで組んでみる。の続き(iOS5版のサンプルプログラム)
マップ移動、戦闘、ゲームオーバー、エンディングと言ったひと通りのロジックを作成した。

f:id:p-monster:20130207204429p:plain

今回のRPGの作成ではC++側はノータッチ。シンプルなプログラムなので速度的には何ら問題ない。
ただ、まだLuaに慣れておらず手探りの部分もあり、あまり綺麗とは言えないソースになっている(半OOPと言った具合)
これからソースコードを少しリファクタリングして、それを参考に次のプログラムを組んでいきたい。
そろそろ本読みを再開しないといけないな。

Luaでクラスを定義する方法

大きく分けて2種類ある。

--パターンA
ClassA = {
  --デフォルトのメンバ変数
  name = "noname";
  age = -1;

  --メソッド
  create = function(self, o)
    self.__index = self
    return setmetatable(o or {}, self)
  end;
  print = function(self)
    print(self.name, self.age)
  end;
}

--パターンB
--デフォルトのメンバ変数
ClassB = {name = "noname", age = -1}
--メソッド
function ClassB:create(o)
  self.__index = self
  return setmetatable(o or {}, self)
end
function ClassB:print()
  print(self.name, self.age)
end

--インスタンス化
a = ClassA:create{name = "hoge", age = 21}
b = ClassB:create{name = "hage", age = 42}

--出力
a:print()  -->hoge	21
b:print()  -->hage	42

どちらを使用するかは好みによるが、複数のクラスを並べて書く場合はクラスの境界が{}で判別できるAの方が便利だと思う。
createはreturn setmetatable(o or {}, {__index = self})のような書き方もできるが、その場合getmetatableによってクラスの等価性を調べることが出来ない。