0Pricing
Lua Academy · Урок

Системы событий в 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 — локальная установка не требуется.

Все уроки этого курса

  1. Системы событий в Lua
  2. Скриптинг на основе компонентов
  3. Поведение искусственного интеллекта с помощью автоматов состояний
  4. Конфигурация на основе данных и горячая перезагрузка
← Назад к Lua Academy