Posted at

cocos2d-x 3.0でLuaの環境設定

More than 5 years have passed since last update.

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解凍すると以下のようなファイル構成になっているはずだけど、

スクリーンショット 2014-07-07 22.36.08.png


cocos/scriptingをコピーする

スクリーンショット_2014-07-07_22_22_42.png


external/luaをコピーする

スクリーンショット_2014-07-07_22_23_16.png


lua用のxcode projectを既存のプロジェクトに追加する

scripting/lua-binding/proj.ios_mac/cocos2d_lua_bindings.xcodeprojを既存のxcodeプロジェクトにファイルとして追加する。

スクリーンショット_2014-07-07_22_23_38.png

スクリーンショット 2014-07-07 22.23.48.png


Build Phasesにluaのライブラリを追加する

スクリーンショット_2014-07-07_22_33_20.png


Header Search Pathを設定する

既存のプロジェクトからLua一群を使うためにヘッダへのパスを通す。めんどうだからrecursiveに。

スクリーンショット_2014-07-07_22_24_33.png


Common Luaファイルを追加する

ここらへんから魔界に踏み込んできた感があるが、scripting/lua-bindings/scriptをプロジェクトに追加する。でないとluaファイルからCocos2D.luaをrequireできないらしい。

スクリーンショット_2014-07-07_22_24_56.png

スクリーンショット 2014-07-07 22.43.41.png


Luaファイルを実行してみる

これでうまくプロジェクトがビルドできたら次はc++ファイルの中からluaファイルを呼び出してみる。以下を参考に。

http://wonderpla.net/blog/engineer/Cocos2dx_Lua/


test.lua

function add (x, y)

return x + y
end


AppDelegate.cpp


#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サーバーを生成してごにょごにょやっているかららしい。

そっちのプロジェクトをいじったほうが速いし確実なのかもしれない。