В моем моторе в настоящее время каждая сущность имеет свой собственный lua_State *
, связанный с ним. Базовый класс Entity имеет функцию linkScript(const char *scriptPath)
, которая вызывается luaL_dofile(luaState, scriptPath)
. Все это отлично работает, но игра по-прежнему довольно мала. Я читал, и я заметил, что то, что я делаю, считается плохой практикой. Рекомендуется, чтобы у меня был глобальный lua_State *
и загружал все функции в глобальную память. Сначала я подумал: «Хорошо, достаточно просто», но вскоре я столкнулся с проблемой: каждый файл Lua определяет их собственные init()
, tick()
и применяет некоторые EventHooks. Как я могу поделиться глобальным lua_State *
без каждого сценария, перезаписывающего определение этих функций предыдущим скриптом? Эти функции вызывают каждый кадр и каждый раз при срабатывании события. Мне нужно иметь возможность различать реализацию каждого сценария.Как использовать глобальный lua_State * в игровом движке?
ответ
Вы в основном хотите рассматривать каждый скрипт как объект со своими собственными функциями. Когда вы загружаете скрипт и запускаете его, вы не хотите, чтобы его функции проходили в глобальном пространстве имен, а не в таблице, специфичной для него, и иметь глобальную таблицу, в которой хранятся все такие таблицы.
Есть много способов сделать это, но один, что приходит на ум, это: создать глобальную таблицу AllObjects, то для каждого сценария вы делаете:
-- object1Script.lua
allObjects.object1 = {
init = function()
...
end,
tick = function()
...
end
}
вы выше для каждого сценария, но каждый создает другую запись в таблице allObjects
, object1
для первого скрипта, object2
для второго скрипта и т. д. Если вы не хотите называть скрипты, вы можете использовать массив, то есть allObjects.insert({ ... table of init, tick etc functions ...})
. Предположительно, вы должны пройти через таблицу allObjects, чтобы вызвать каждый init() объекта или объекта() и, соответственно, по-разному.
Я думаю, что это основной подход, надеюсь, он вдохновляет вас на то, чтобы найти свою собственную.
- 1. объекта в игровом движке
- 2. Коммуникация в компонентном игровом движке
- 3. Сериализация в компонентном игровом движке
- 4. Как работает движение в игровом движке
- 5. Racket как язык сценариев в игровом движке
- 6. Об использовании mixins в игровом движке CoffeeScript
- 7. Достижение детерминизма в игровом движке с потоком
- 8. Что должно быть в 2D игровом движке?
- 9. Кругов прилипают к вещам в игровом движке
- 10. Расчет в игровом движке 2.0 Framework шаблона
- 11. Графика Проблема с JFrame в игровом движке
- 12. Распознавание речи на игровом движке Unity
- 13. Использовать нить локального магазина lua_State
- 14. Как лучше всего управлять компонентами в игровом движке?
- 15. Как сохранить данные моего мира в многопоточном игровом движке?
- 16. Как обрабатывать группы объектов в игровом движке блендера?
- 17. Как я могу получить тени в игровом движке блендера?
- 18. Вращение вокруг точки в игровом движке Voxel (C#)
- 19. Неожиданное поведение с функцией IF в игровом движке Blender
- 20. Как использовать ReactiveMongo в игровом каркасе фильтра?
- 21. Как использовать NStimer в игровом приложении
- 22. Как использовать Promise.timeout в игровом фреймворке
- 23. Как использовать wro4j в игровом каркасе 2.1
- 24. Как использовать глобальный log4j.xml
- 25. Как использовать глобальный питона
- 26. Как использовать глобальный идентификатор?
- 27. Как создать новую локальную переменную в lua_state?
- 28. Как использовать объекты box2d в движке libGDX
- 29. Организация глобального доступа к системе в игровом движке с современным C++
- 30. Можно ли сохранить lua_State в общей памяти?
Отлично, это было именно то, что мне нужно. Очень простое решение, я удивлен, что даже не думал об этом. – Brett