cocos2d-x 3.0でLuaの環境設定


cocos2d-x 3.0でLuaを使いたいと思った。
しかし公式が推奨しているcocosコマンドでlua用のプロジェクトを生成するやり方だと、最初から最後まで全部Luaで書けみたいな圧力を感じた。公式のエディタであるCocosCodeIDEが実際Eclipseだったということも気に入らなかったので既存のcocos2d-xプロジェクトにLuaBindingsを統合する方法がないか色々調べた。

…のだけど、なんかしらんけど英語圏も日本語圏にもまともにそういう資料がなくて、ほんとにluaを使ってるやつなんているの？って感じになった結果、cocosコマンドで生成されるLua用プロジェクトを参考にするのが一番いいと結論づけた。

という訳で既存のcocos2d-xプロジェクトにLuaBindingsを導入する流れ。

# 必要なファイルをプロジェクトにインポートする

デフォルトでC++でプロジェクトを作成した場合、プロジェクトの中にlua用のファイル郡は入っていない。というわけでそれらをつれてくるところから始めなくてはいけない。

必要なファイル郡は２つ。
cocos2d-x 3.0をzip解凍すると以下のようなファイル構成になっているはずだけど、

![スクリーンショット 2014-07-07 22.36.08.png](https://qiita-image-store.s3.amazonaws.com/0/3209/576b443d-d966-f251-0012-1196d83f7633.png "スクリーンショット 2014-07-07 22.36.08.png")

## cocos/scriptingをコピーする

![スクリーンショット_2014-07-07_22_22_42.png](https://qiita-image-store.s3.amazonaws.com/0/3209/0dd332a3-d8aa-6d8e-2ba2-c40742142e51.png "スクリーンショット_2014-07-07_22_22_42.png")

## external/luaをコピーする

![スクリーンショット_2014-07-07_22_23_16.png](https://qiita-image-store.s3.amazonaws.com/0/3209/6b84f1d4-643f-903c-b577-06cfe360ee3f.png "スクリーンショット_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](https://qiita-image-store.s3.amazonaws.com/0/3209/d9a54e54-866c-d8b6-8aff-3dc2975be60c.png "スクリーンショット_2014-07-07_22_23_38.png")

![スクリーンショット 2014-07-07 22.23.48.png](https://qiita-image-store.s3.amazonaws.com/0/3209/402e2175-351d-6fb2-479a-0ffa784a975e.png "スクリーンショット 2014-07-07 22.23.48.png")
## Build Phasesにluaのライブラリを追加する

![スクリーンショット_2014-07-07_22_33_20.png](https://qiita-image-store.s3.amazonaws.com/0/3209/97e8cdd6-e307-a5fb-8812-fe0c89714ad5.png "スクリーンショット_2014-07-07_22_33_20.png")

## Header Search Pathを設定する

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

![スクリーンショット_2014-07-07_22_24_33.png](https://qiita-image-store.s3.amazonaws.com/0/3209/047d940e-335d-8f01-b1e5-0704e484d2d6.png "スクリーンショット_2014-07-07_22_24_33.png")

## Common Luaファイルを追加する

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

![スクリーンショット_2014-07-07_22_24_56.png](https://qiita-image-store.s3.amazonaws.com/0/3209/29a6d236-742d-16d5-7c63-b88ed458ba7f.png "スクリーンショット_2014-07-07_22_24_56.png")

![スクリーンショット 2014-07-07 22.43.41.png](https://qiita-image-store.s3.amazonaws.com/0/3209/1b436380-d769-4fe9-419a-4b4d8514c3ee.png "スクリーンショット 2014-07-07 22.43.41.png")

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

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

[http://wonderpla.net/blog/engineer/Cocos2dx_Lua/](http://wonderpla.net/blog/engineer/Cocos2dx_Lua/)

```lua:test.lua
function add (x, y)
    return x + y
end
```
```cpp: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サーバーを生成してごにょごにょやっているかららしい。

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