Как я могу сделать таблицу lua в C ++ сопоставленной со сценарием lua, где сценарий определяет свойства и методы таблицы, поэтому результирующий файл lua выглядит примерно так:
Script.test = 5
function Script:Update()
end
Таким образом, этот сценарий может быть прочитан много раз, но каждый раз он должен получить свою собственную уникальную таблицу на C ++.
Идея в том, что из C ++ я хочу назвать каждый уникальный Update()
метод и быть в состоянии прочитать / установить его тестовую переменную.
Допустим, вы создаете видеоигру, и я сказал вам, если вы сделаете сценарии, структурированные подобным образом, и прикрепите их к моделям, чтобы игра запускала метод Update () каждый кадр и чтобы переменные, которые вы определяете, были локальными для этого сценария / модели.
Этот ответ только для уточнения моего комментария выше. Одна простая идея для достижения того, что вы описываете, — просто создать эту локальную таблицу прямо в файле сценария и вернуть эту таблицу в конце.
local Script = {}
Script.test = 5
Script.foo = "bar"
function Script:Update()
end
return Script
Это обычный подход, используемый для помещения модулей lua в свое собственное пространство имен и во избежание загрязнения глобальной области видимости.
Вы можете взять и использовать возвращенный Script
Таблица со стека с чем-то вроде этого:
// load and execute your script
luaL_dofile(L, "script.lua");
// Run Script:Update()
lua_getfield(L, -1, "Update");
lua_pushvalue(L, -2);
lua_call(L, 1, 0);
Вы можете заключить приведенный выше фрагмент кода в функцию, чтобы было проще вызывать ее столько раз, сколько необходимо. Вы даже можете сделать его более эффективным, кэшируя скомпилированный script.lua
где-то, чтобы избежать повторного анализа и повторного создания функции обтекания при каждом вызове этой функции. Например:
lua_getfield(L, LUA_REGISTRYINDEX, "cached_script");
if (lua_isnil(L, -1))
{
luaL_loadfile(L, "script.lua");
lua_pushvalue(L, -1);
lua_setfield(L, LUA_REGISTRYINDEX, "cached_script");
}
lua_pcall(L, 0, 0, 0);
// etc.
Других решений пока нет …