Lua
cocos2d-x

cocos2d-xでLuaの関数やテーブルをCで保持し、好きなときに使う

More than 3 years have passed since last update.

cocos2d-xで、Luaを使っている場合、

任意のタイミングでLuaの関数をC++から呼び出したいことがあると思います。

ここで便利なのが、

LUA_FUNCTION/LUA_TABLEです。

void registerScriptHandler(LUA_FUNCTION funcID);

といったように、cocos2d-xの本体が使っている定義なのですが、

/tolua++/basic.lua

に、

to_functions["LUA_FUNCTION"] = "toluafix_ref_function"

is_functions["LUA_FUNCTION"] = "toluafixisfunction"

・_to_functions["LUA
TABLE"] = "toluafix_totable"

・_is_functions["LUA_TABLE"] = "toluafix_istable"

このように定義されています。

これは、型にLUA_FUNCTIONを指定された場合、toluafix_ref_functionを通せという意味です。

(同様に、LUA_TABLEという形も使えます)

こう指定しておくと、tolua++は、

LUA_FUNCTION funcID = ( toluafix_ref_function(tolua_S,2,0));

{

self->registerScriptObserver(funcID);

}

このようにC側に渡す前に参照IDにしてくれます。

この形式でpkgファイルを書いておくと、

Cから透過的にLuaの関数やテーブルを扱えるため非常に便利です。

ただし、toluafix_ref_functionはLuaの参照を増やす(GCから回収されなくする)ので、

使わなくなったら、

toluafix_remove_function_by_refid

で解放をしないといつまでもメモリに溜まり続けます。