Date: 2016/7/13 Cate: C++, cocos2d-x, lua Tags: ,  

cocos2d-xで簡単なレベルデザインとかレイアウトなんかでスクリプト言語が使いたい、ってなったので、luaを使うメモ。
最初からluaでプロジェクトを作ってluaでゲームをつくる、みたいな情報は結構あったんですが、C++で作ったプロジェクトにあとからluaを入れる情報があんまりみつからなくて苦労しました・・・。

cocos2d-xのバージョン: v3.11.1
NDKのバージョン: r10e

C++でプロジェクトを作成する

$ cocos new ProjectName -l lua -p com.example.cpplua 

こんなかんじですね。C++でプロジェクトを作ります。

iOSでluaが動くようにする

プロジェクトを作成すると

Classes
CMakeLists.txt
cocos2d
proj.android
proj.android-studio
proj.ios_mac
proj.linux
proj.win8.1-universal
proj.win10
proj.win32
Resources

こんな感じのディレクトリ構成になっているかと思います。

lua-bindingsの追加

ここに、cocos2d-xのサイトでDLしてきたcocos2d-x-3.11.1のフォルダから、cocos/scripting/lua-bindingsをプロジェクトにコピーしてきます。
スクリーンショット 2016 07 13 18 34 03

↑これをコピーして
スクリーンショット 2016 07 13 18 35 25
こんな感じになります。

external/luaの追加

次に、cocos2d-x-3.11.1のフォルダから、external/luaをプロジェクトにコピーしてきます。
スクリーンショット 2016 07 13 18 34 21
↑こいつを
スクリーンショット 2016 07 13 18 59 34
こんなかんじにプロジェクトにコピーしてきます。

cocos2d_lua_bindings.xcodeprojの追加

そして、プロジェクトのcocos2d/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeprojをXcodeプロジェクトにドラッグ&ドロップで追加します。
スクリーンショット 2016 07 13 18 35 57

libluacocos2d iOSの追加

プロジェクトのBuild Phasesから、Target Dependencies, Link Binary With Librariesのそれぞれにlibluacocos2d iOSを追加します。
スクリーンショット 2016 07 13 18 36 23

Search Pathへ追加

プロジェクトのBuild Settingsから、Header Search Paths
$(SRCROOT)/../cocos2d/external/lua
$(SRCROOT)/../cocos2d/cocos/scripting/lua-bindings/manual
の2つを追加します。

動作確認

HelloWorldScene.cpp

#include "CCLuaEngine.h"
#include "lua_module_register.h"

void HelloWorldScene::someMethod()
{
        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=%td", lua_tointeger(L, lua_gettop(L)));
        }
}

test.lua

function add (x, y)
    return x + y
end

こんなかんじで動作を確認します。

Androidで動かす

Android.mkを編集

LOCAL_STATIC_LIBRARIES += cocos2d_lua_static$(call import-module,scripting/lua-bindings/proj.android)を追加します。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos)
$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos/audio/include)

LOCAL_MODULE := MyGame_shared

LOCAL_MODULE_FILENAME := libMyGame

LOCAL_SRC_FILES := hellocpp/main.cpp 
                   ../../../Classes/AppDelegate.cpp 
                   ../../../Classes/HelloWorldScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes

# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END


LOCAL_STATIC_LIBRARIES := cocos2dx_static
LOCAL_STATIC_LIBRARIES += cocos2d_lua_static # 追加

# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END

include $(BUILD_SHARED_LIBRARY)

$(call import-module,.)
$(call import-module,scripting/lua-bindings/proj.android) # 追加

# _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END

これでビルドすればAndroidは動くかと思います。
(自分の場合、picojsonにあわせて設定を変えていたのでビルドエラーがでてハマりましたが・・・)

APP_STLとpicojson

jsonのパーサーとしてpicojsonを使っているのですが、cocos2d-xのデフォルト設定ではエラーが出るため、Application.mkでAPP_STL := c++_staticと設定していました。ですが、このままビルドするとmultiple definition of '_Unwind_GetRegionStart'みたいなエラーがでました。
なので、素直にデフォルトのAPP_STL := gnustl_staticに戻して、picojson側でPICOJSON_USE_LOCALEを0にして対応しました。

2016-08-02追記

この方法だとiOS Simulatorで落ちたので、設定をlua_openでnullがかえってくるに追記しました。

Leave a Reply