C ++ таблица lua сопоставлена ​​с файлом lua

Как я могу сделать таблицу lua в C ++ сопоставленной со сценарием lua, где сценарий определяет свойства и методы таблицы, поэтому результирующий файл lua выглядит примерно так:

Script.test = 5

function Script:Update()
end

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

Идея в том, что из C ++ я хочу назвать каждый уникальный Update() метод и быть в состоянии прочитать / установить его тестовую переменную.

Допустим, вы создаете видеоигру, и я сказал вам, если вы сделаете сценарии, структурированные подобным образом, и прикрепите их к моделям, чтобы игра запускала метод Update () каждый кадр и чтобы переменные, которые вы определяете, были локальными для этого сценария / модели.

1

Решение

Этот ответ только для уточнения моего комментария выше. Одна простая идея для достижения того, что вы описываете, — просто создать эту локальную таблицу прямо в файле сценария и вернуть эту таблицу в конце.

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.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]