Системы событий в Lua
Создавайте лёгкий диспетчер событий с обратными вызовами, хранящимися в таблицах.
«Системы событий в Lua» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Зачем нужны системы событий?
Система событий отделяет источники (объекты, порождающие события) от получателей (объектов, реагирующих на них). В Lua её легко построить с помощью таблиц функций обратного вызова.
Простой диспетчер событий
Диспетчер хранит списки слушателей, сопоставленные с именами событий.
local EventEmitter = {}
EventEmitter.__index = EventEmitter
function EventEmitter.new()
return setmetatable({_listeners = {}}, EventEmitter)
end
function EventEmitter:on(event, fn)
self._listeners[event] = self._listeners[event] or {}
table.insert(self._listeners[event], fn)
end
function EventEmitter:emit(event, ...)
for _, fn in ipairs(self._listeners[event] or {}) do
fn(...)
end
endИспользование диспетчера
Подписывайтесь на события с помощью :on и вызывайте их с помощью :emit.
local bus = EventEmitter.new()
bus:on("playerHit", function(player, damage)
player.hp = player.hp - damage
print(player.name, "took", damage, "damage")
end)
bus:emit("playerHit", {name="Alice", hp=100}, 15)Одноразовые слушатели
Метод :once оборачивает обратный вызов так, чтобы после первого вызова автоматически удалить его регистрацию.
function EventEmitter:once(event, fn)
local wrapper
wrapper = function(...)
self:off(event, wrapper)
fn(...)
end
self:on(event, wrapper)
endУдаление слушателей
Метод :off удаляет конкретный слушатель по ссылке на него.
function EventEmitter:off(event, fn)
local list = self._listeners[event]
if not list then return end
for i, f in ipairs(list) do
if f == fn then table.remove(list, i); return end
end
endОчереди событий с приоритетами
Добавьте каждому слушателю поле приоритета. При регистрации сортируйте список, чтобы обработчики с высоким приоритетом выполнялись первыми.
Асинхронная очередь событий
Вместо немедленного вызова слушателей помещайте события в очередь и обрабатывайте их на каждом кадре или такте.
local queue = {}
local function postEvent(event, data)
queue[#queue+1] = {event=event, data=data}
end
local function processEvents()
local current = queue
queue = {}
for _, e in ipairs(current) do
bus:emit(e.event, e.data)
end
endПредотвращение изменений во время вызова событий
При вызове событий перебирайте копию списка слушателей, чтобы добавление или удаление слушателей во время вызова не приводило к ошибкам.
События с пространствами имён
Используйте имена событий с точками ("player.damaged", "player.healed"), чтобы организовать события по системам.
Таблицы слабых ссылок на слушателей
Используйте таблицы слушателей со слабыми значениями: если объект подписчика будет удалён сборщиком мусора, его слушатель удалится автоматически, что предотвратит утечки памяти в долго работающих играх.
Интеграция с игровым циклом
Интегрируйте систему событий с игровым циклом: события ввода → логические события → события отрисовки, обрабатываемые в таком порядке на каждом кадре.
Вопрос о системе событий
В чём заключается главное преимущество системы событий?
Итоги: системы событий
Системы событий в Lua используют таблицу именованных списков слушателей. Для создания полноценного диспетчера реализуйте on, emit, off и once. В готовых играх используйте асинхронные очереди и слабые таблицы.
Часто задаваемые вопросы
Урок «Системы событий в Lua» бесплатный?
Да — полный текст урока «Системы событий в Lua» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Системы событий в Lua»?
Создавайте лёгкий диспетчер событий с обратными вызовами, хранящимися в таблицах. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Системы событий в Lua»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Системы событий в Lua
- Скриптинг на основе компонентов
- Поведение искусственного интеллекта с помощью автоматов состояний
- Конфигурация на основе данных и горячая перезагрузка