cocos2d-x 3.0でLuaを使いたいと思った。
しかし公式が推奨しているcocosコマンドでlua用のプロジェクトを生成するやり方だと、最初から最後まで全部Luaで書けみたいな圧力を感じた。公式のエディタであるCocosCodeIDEが実際Eclipseだったということも気に入らなかったので既存のcocos2d-xプロジェクトにLuaBindingsを統合する方法がないか色々調べた。
…のだけど、なんかしらんけど英語圏も日本語圏にもまともにそういう資料がなくて、ほんとにluaを使ってるやつなんているの?って感じになった結果、cocosコマンドで生成されるLua用プロジェクトを参考にするのが一番いいと結論づけた。
という訳で既存のcocos2d-xプロジェクトにLuaBindingsを導入する流れ。
必要なファイルをプロジェクトにインポートする
デフォルトでC++でプロジェクトを作成した場合、プロジェクトの中にlua用のファイル郡は入っていない。というわけでそれらをつれてくるところから始めなくてはいけない。
必要なファイル郡は2つ。
cocos2d-x 3.0をzip解凍すると以下のようなファイル構成になっているはずだけど、
cocos/scriptingをコピーする
external/luaをコピーする
lua用のxcode projectを既存のプロジェクトに追加する
scripting/lua-binding/proj.ios_mac/cocos2d_lua_bindings.xcodeprojを既存のxcodeプロジェクトにファイルとして追加する。
Build Phasesにluaのライブラリを追加する
Header Search Pathを設定する
既存のプロジェクトからLua一群を使うためにヘッダへのパスを通す。めんどうだからrecursiveに。
Common Luaファイルを追加する
ここらへんから魔界に踏み込んできた感があるが、scripting/lua-bindings/scriptをプロジェクトに追加する。でないとluaファイルからCocos2D.luaをrequireできないらしい。
Luaファイルを実行してみる
これでうまくプロジェクトがビルドできたら次はc++ファイルの中からluaファイルを呼び出してみる。以下を参考に。
http://wonderpla.net/blog/engineer/Cocos2dx_Lua/
function add (x, y)
return x + y
end
#include "CCLuaEngine.h"
bool AppDelegate::applicationDidFinishLaunching() {
// 中略
auto engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->setScriptEngine(engine);
engine->executeScriptFile("test.lua");
lua_State* L = engine->getLuaStack()->getLuaState();
lua_getglobal(L, "add");
lua_pushinteger(L, 1);
lua_pushinteger(L, 2);
if (lua_pcall(L, 2, 1, 0)) {
CCLOG("error=%s", lua_tostring(L, lua_gettop(L)));
} else {
CCLOG("return=%d", lua_tointeger(L, lua_gettop(L)));
}
return true;
}
とりあえず実行できた。LuaのVMの扱い方がよく分からないけどあとは公式のluaのバインディングを参考にcocos2d-xのAPIを呼び出したりしてみる。
おまけ(cocosコマンドで生成されるluaプロジェクト)
cocosコマンドで生成されるluaのプロジェクトはよく見るときちんとios/androidのプロジェクトがあって、その中でmain.luaというluaファイルを上記の方法で実行している。実行時にluaファイルの更新を反映させられるのはRuntimeというクラスがtcpサーバーを生成してごにょごにょやっているかららしい。
そっちのプロジェクトをいじったほうが速いし確実なのかもしれない。