Изолируйте привязки кода Lua от остальной части моего игрового движка. - PullRequest
5 голосов
/ 28 февраля 2011

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

До сих пор это оказалось не сложно.Чистая связывающая часть функций C ++ и Lua - например, связывание объектов Vector, Color и Entity, а также таких модулей, как библиотека Draw или Physics, легко изолируются от остальной части движка.

Теперь моя проблема заключаетсяв событиях .Мне нужно предоставить возможность сценаристам реагировать на игровые события.Это включает вызов функций Lua из движка.

Примеры: вызов OnCreate, OnUpdate, OnCollide для сущностей из C ++ в Lua.

Эти события происходят в моем базовом классе CEntity, и модуль Lua не имеет возможностизная, когда и как они происходят.

Возможные решения:

  • Добавьте вызов функции к событиям в базовом объекте C ++, который вызывает событие вскрипт Lua

Плохо, плохо, плохо!Это привязка Lua, смешанная прямо с базовым классом сущностей!

  • Добавить какую-то систему событий в мой движок, где события сущностей вызывают событие, которое также может быть перехвачено модулем привязки Lua и обработаносоответственно.

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

- Как я могу запускать события (вызывать функцию перехвата) в Lua из моего движка C ++ безиметь какой-либо код привязки Lua вне модуля привязки Lua моей программы?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

Вы можете выбрать (в зависимости от вашего дизайна) производный класс LuaEntity, который обрабатывает эти вещи. Вы также можете использовать вместо этого полиморфные функторы (boost :: function), которые можно добавлять и изменять на лету.

3 голосов
/ 28 февраля 2011

Game Code Complete (3-е изд.) Предлагает решение именно этой проблемы. По сути, он настраивает механизм на наличие общей системы событий, а затем имеет модуль сценариев, который регистрирует себя для событий, на которые он хочет реагировать. Система событий ничего не знает о Lua, а оболочка Lua должна знать только имена событий, которые она хочет обработать, поэтому связь очень минимальная.

...