読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

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

cocos2d-x Luaでゲーム作り

iPhone/iPad/iPod touchプログラミングバイブルのサンプルゲームをLuaで組んでみる。

手元にあるiOS5版はアクションゲームとRPGのサンプルが載っているので、それをcocos2d-x Luaで書いてみる。
そのまま移植してもつまらないので、とりあえず外部仕様を見ながら組んだ後でサンプルを読むことにする。

アクションゲーム

f:id:p-monster:20130201223239p:plain
白い枠は当たり判定。

IDEでばかり組んでいたせいでAPI名を調べながら書くのが面倒くさい。
うまく補完を行ってくれるvimプラグインがあればもっと組みやすくなると思う。
さすがにvimプラグインの仕様を覚えて作るほどの時間は取れないので、今後は出来る範囲でどれだけ改善できるかを試行錯誤したい。


スクリプト言語による効率的ゲーム開発で語られているLuaのメリットは次の通り。

  • ゲームロジックを変更してもコンパイルに時間がかからない(実行しながら修正することも可能)
  • ゲーム開発に必要なAPIのみを公開して、システムプログラマとゲームロジック開発者の分業化が図れる
  • プラットフォームに依存せずゲームロジックを抽出できる

デメリットは組み込みにコストがかかることとスクリプト実行部分での速度の問題。
前者はcocos2d-xで組むならあまり関係ないが、後者は結構問題が有りそうだ。

特にガベージコレクションにかかる時間が気になる。
たとえば以下のようなコードを組むと

--ゲームループのようなもの
local function tick()
  local obj = CCSprite:create("hoge.jpg")
end

毎フレームobjに格納されたスプライトのユーザーデータがガベージコレクション対象として溜まっていくことになる。
毎回破棄されるならともかく一定量溜まってからガベージコレクションされた場合、十分遅延の原因になりうる。
この問題に対処するにはガベージコレクションのタイミングを制御したり、objを関数の外で確保して非ローカル変数としてキャプチャするといいだろう。

RPG

アクションゲームのリソースはサンプルからそのまま流用したが、RPGではタイルマップの構築のためいくつかツールを使用する。
まずZwoptexを使ってタイルチップを1つのテクスチャにまとめる。
使い方はこちら
http://albatrus.com/main/ios/2783

次にTiledでマップを作成する。

作成した後はもう簡単に読み込めるのでこんな感じで

  local sceneGame = CCScene:create()
	
  local map = CCTMXTiledMap:create("map.tmx")
  sceneGame:addChild(map, -1, MapTag)

  CCDirector:sharedDirector():runWithScene(sceneGame)

続きはまた今度。