Tôi sử dụng lua làm ngôn ngữ kịch bản cho công cụ 3d của tôi. Tôi có lua "lớp" cho một số đối tượng và bây giờ tôi muốn sử dụng tài sản thay vì getters và setters. Vì vậy, thay vì một cái gì đó như thế nàyLua: phương pháp và thuộc tính khi xuất lớp từ c
local oldState = ui:GetChild("Panel1"):GetVisible()
ui:GetChild("Panel1"):SetVisible(not oldState)
tôi sẽ chỉ
ui.Panel1.visible = not ui.Panel1.visible
Vấn đề là C++ của tôi mã cho tạo metatables và ghi đè instanced phương pháp __index. Dưới đây là bằng cách này:
Tạo một metatable:
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()); }
Khởi tạo các lớp (đối tượng lua chỉ nắm giữ một con trỏ đến một dữ liệu thực tế được lưu trữ trong C++ code):
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; }
Câu hỏi đặt ra là làm cách nào tôi có thể có cả phương pháp và thuộc tính. Nếu tôi chỉ thêm __index
vào CLUAScript::RegisterClass
mảng funcs thì nó sẽ không bao giờ được gọi. Và tôi không thể tưởng tượng một cách để loại bỏ định nghĩa lại của nó trong CLUAScript::NewInstanceClass
.
Nếu mã này là không đủ, ở đây là các liên kết đến các tập tin làm việc với lua: lua helper class, functions for UI, functions for Objects, và testing lua script
Để giúp làm rõ mối liên hệ giữa C++ và lua mã, những gì là 'ui' và những gì' ui: GetChild ("property_name ")' trả về? Ví dụ, là 'ui' một userdata từ đất C++ hay là một số bảng được trả về bởi' NewInstanceClass' với '__self = udata_object' được đặt? – greatwolf
"ui" là một thể hiện của phần tử giao diện người dùng như nút, bảng điều khiển hoặc toàn bộ màn hình. Mỗi phần tử có thể có các phần tử con, có thể được sử dụng bằng phương thức GetChild (name). Những đứa trẻ này cũng sẽ là các yếu tố giao diện người dùng. Vì vậy, đây là một bảng có chứa một con trỏ tới C++ instance như một userdata và một số phương thức từ metatable được trả về bởi hàm NewInstanceClass. Trong trường hợp này, "ui" là một biến cục bộ đại diện cho toàn bộ màn hình (phần tử gốc của cây giao diện người dùng). –
Điều gì sẽ xảy ra nếu bạn thực hiện các chức năng đứng tự do 'GetChild' và' GetVisible' trong lua? Sau đó, bạn chỉ có thể tạo 'ui.Panel1' như một dạng đường cú pháp dịch sang' GetChild (ui, "Panel1") '. – greatwolf