2013-12-12 2 views
2

В моем моторе в настоящее время каждая сущность имеет свой собственный lua_State *, связанный с ним. Базовый класс Entity имеет функцию linkScript(const char *scriptPath), которая вызывается luaL_dofile(luaState, scriptPath). Все это отлично работает, но игра по-прежнему довольно мала. Я читал, и я заметил, что то, что я делаю, считается плохой практикой. Рекомендуется, чтобы у меня был глобальный lua_State * и загружал все функции в глобальную память. Сначала я подумал: «Хорошо, достаточно просто», но вскоре я столкнулся с проблемой: каждый файл Lua определяет их собственные init(), tick() и применяет некоторые EventHooks. Как я могу поделиться глобальным lua_State * без каждого сценария, перезаписывающего определение этих функций предыдущим скриптом? Эти функции вызывают каждый кадр и каждый раз при срабатывании события. Мне нужно иметь возможность различать реализацию каждого сценария.Как использовать глобальный lua_State * в игровом движке?

ответ

3

Вы в основном хотите рассматривать каждый скрипт как объект со своими собственными функциями. Когда вы загружаете скрипт и запускаете его, вы не хотите, чтобы его функции проходили в глобальном пространстве имен, а не в таблице, специфичной для него, и иметь глобальную таблицу, в которой хранятся все такие таблицы.

Есть много способов сделать это, но один, что приходит на ум, это: создать глобальную таблицу AllObjects, то для каждого сценария вы делаете:

-- object1Script.lua 
allObjects.object1 = { 
    init = function() 
     ... 
     end, 
    tick = function() 
     ... 
     end 
} 

вы выше для каждого сценария, но каждый создает другую запись в таблице allObjects, object1 для первого скрипта, object2 для второго скрипта и т. д. Если вы не хотите называть скрипты, вы можете использовать массив, то есть allObjects.insert({ ... table of init, tick etc functions ...}). Предположительно, вы должны пройти через таблицу allObjects, чтобы вызвать каждый init() объекта или объекта() и, соответственно, по-разному.

Я думаю, что это основной подход, надеюсь, он вдохновляет вас на то, чтобы найти свою собственную.

+0

Отлично, это было именно то, что мне нужно. Очень простое решение, я удивлен, что даже не думал об этом. – Brett

Смежные вопросы