私は3Dエンジンのスクリプト言語としてluaを使用します。私はいくつかのオブジェクトのためのルア "クラス"を持っています。そして今、ゲッタとセッタの代わりにプロパティを使いたいと思います。だから、代わりにこのLua:cからクラスをエクスポートするときのメソッドとプロパティ
local oldState = ui:GetChild("Panel1"):GetVisible()
ui:GetChild("Panel1"):SetVisible(not oldState)
のようなもの、私はちょうど
ui.Panel1.visible = not ui.Panel1.visible
問題は__index方法メタテーブルとインスタンス化オーバーライドを作成するための私のC++コードであるだろう。ここでは、方法によるものである。
はメタテーブルの作成:
void CLUAScript::RegisterClass(const luaL_Reg funcs[], std::string const& className) { luaL_newmetatable(m_lua_state, std::string("Classes." + className).c_str()); luaL_newlib(m_lua_state, funcs); lua_setglobal(m_lua_state, className.c_str()); }
(LUAオブジェクトのみC++コードに格納されている実際のデータへのポインタを保持している)クラスをインスタンス化:
int CLUAScript::NewInstanceClass(void* instance, std::string const& className) { if (!instance) { lua_pushnil(m_lua_state); return 1; } luaL_checktype(m_lua_state, 1, LUA_TTABLE); lua_newtable(m_lua_state); lua_pushvalue(m_lua_state,1); lua_setmetatable(m_lua_state, -2); lua_pushvalue(m_lua_state,1); lua_setfield(m_lua_state, 1, "__index"); void **s = (void **)lua_newuserdata(m_lua_state, sizeof(void *)); *s = instance; luaL_getmetatable(m_lua_state, std::string("Classes." + className).c_str()); lua_setmetatable(m_lua_state, -2); lua_setfield(m_lua_state, -2, "__self"); return 1; }
質問は、私はメソッドとプロパティの両方を持つことができる方法です。私がちょうど__index
をCLUAScript::RegisterClass
funcsの配列に追加すると、決して呼び出されません。そして、私はCLUAScript::NewInstanceClass
でその再定義を取り除く方法を想像することはできません。
このコードは十分でない場合は、ここではLUAでの作業ファイルへのリンクです: lua helper class、 functions for UI、 functions for Objects、および testing lua script
C++コードとLuaのコードとの間の接続を明確に支援するために、 'ui'と何' UIを何です:でGetChild(「PROPERTY_NAME ")'戻りますか?例えば、 'ui'はC++の土地のユーザデータですか?' __self = udata_object'がセットされた 'NewInstanceClass'によって返されたテーブルですか? – greatwolf
"ui"は、ボタン、パネル、または画面全体のようなUI要素のインスタンスです。すべての要素は子要素を持つことができ、GetChild(name)メソッドを使用してアクセスできます。これらの子もUI要素になります。これは、ユーザーデータとしてのC++インスタンスへのポインタと、NewInstanceClass関数によって返されたメタテーブルからのいくつかのメソッドを含むテーブルです。この場合、「ui」は画面全体(UIツリーのルート要素)を表すローカル変数です。 –
'GetChild'と' GetVisible'をluaで自由に動作させるとどうなるでしょうか?次に 'ui.Panel1'を' GetChild(ui、 "Panel1") 'に変換する構文糖の形式として作ることができます。 – greatwolf