Объекты C ++ в LuaPlus - PullRequest
       1

Объекты C ++ в LuaPlus

0 голосов
/ 04 сентября 2011

У меня вопрос для новичка по использованию LuaPlus.

Я смотрю какой-то код здесь внутри конструктора объекта:

m_MetaTable = g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().CreateTable("EventManager");
m_MetaTable.SetObject("__index", m_MetaTable);

m_MetaTable.RegisterObjectDirect( "TriggerEvent", (EventManager *)0, &EventManager::TriggerEventFromScript );
m_MetaTable.RegisterObjectDirect( "RegisterEventType", (EventManager *)0, &EventManager::RegisterScriptEventType );
m_MetaTable.RegisterObjectDirect( "AddScriptListener", (EventManager *)0, &EventManager::AddScriptListener );
m_MetaTable.RegisterObjectDirect( "RemoveScriptListener", (EventManager *)0, &EventManager::RemoveScriptListener );
m_MetaTable.RegisterObjectDirect( "AddScriptActorListener", (EventManager *)0, &EventManager::AddScriptActorListener );
m_MetaTable.RegisterObjectDirect( "RemoveScriptActorListener", (EventManager *)0, &EventManager::RemoveScriptActorListener );

LuaPlus::LuaObject luaStateManObj = g_pApp->m_pLuaStateManager->GetGlobalState()->BoxPointer(this);
luaStateManObj.SetMetaTable(m_MetaTable);
g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().SetObject("EventManager", luaStateManObj);

Сначала мы создаем метатабельный параметр, его __index, равный самому метатабельному, и связываем некоторые функции C ++ с записями в таблице. Теперь любая таблица, которая использует этот метатабль, должна «наследовать» эти функции, если я правильно понимаю.

Часть, которую я не понимаю, это последние 3 строки кода. Похоже, что мы создаем LuaObject и затем связываем его с объектом C ++ с помощью этого указателя, устанавливаем для его метатаблицы то же значение, что и выше, а затем создаем глобальную переменную Lua, чтобы к ней можно было обращаться в сценарии Lua?

Какой смысл делать это, если какая-либо таблица, которая использует вышеприведенные метатаблицы, уже имеет доступ к функциям-членам C ++?

1 Ответ

1 голос
/ 17 августа 2012

Я не уверен, что именно вас смущает, но вот мое понимание каждой строки

LuaPlus::LuaObject luaStateManObj = g_pApp->m_pLuaStateManager->GetGlobalState()->BoxPointer(this);

Эта строка создает объект lua, который оборачивает указатель на c ++. Этот объект существует в lua, но с точки зрения времени выполнения, это безымянный объект, поэтому вы не можете получить к нему доступ со стороны lua.

luaStateManObj.SetMetaTable(m_MetaTable);

Довольно очевидно, просто установите метатаблицу, которую вы создали ранее, для объекта, который вы только что создали.

g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().SetObject("EventManager", luaStateManObj);

Здесь вы даете объекту lua, который вы создали, «имя lua», чтобы вы могли получить к нему доступ со стороны сценариев. После этой строки, если вы выполните скрипт lua, вызывающий объект с именем «EventManager», он будет ссылаться на объект, который вы здесь присвоили. До этой строки в lua нет объекта, привязанного к имени «EventManager» (при условии, что никто не определил его ранее).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...