0Pricing
Lua Academy · Lección

Sistemas de eventos en Lua

Construya un despachador de eventos ligero con callbacks almacenados en tablas.

Sistemas de eventos en Lua es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

¿Por qué los sistemas de eventos?

Un sistema de eventos desacopla a los productores (elementos que disparan eventos) de los consumidores (elementos que reaccionan). En Lua, se puede crear fácilmente mediante tablas de funciones callback.

Dispatcher de eventos sencillo

Un dispatcher almacena listas de listeners asociadas al nombre de cada evento.

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

Usar el dispatcher

Suscríbase a eventos con :on y dispárelos con :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)

Listeners de una sola ejecución

El método :once envuelve el callback para darse de baja automáticamente después de la primera llamada.

function EventEmitter:once(event, fn)
  local wrapper
  wrapper = function(...)
    self:off(event, wrapper)
    fn(...)
  end
  self:on(event, wrapper)
end

Eliminar listeners

El método :off elimina un listener específico mediante su referencia.

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

Colas de prioridad para eventos

Añada un campo de prioridad a cada listener. Ordene la lista al registrarlos para que los handlers de mayor prioridad se ejecuten primero.

Cola de eventos asíncrona

En lugar de llamar a los listeners inmediatamente, introduzca los eventos en una cola y procéselos en cada frame o tick.

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

Evitar modificaciones durante la emisión

Al emitir un evento, itere sobre una copia de la lista de listeners para que añadir o eliminar elementos durante la emisión no provoque errores.

Eventos con espacios de nombres

Utilice nombres de evento separados por puntos ("player.damaged", "player.healed") para organizar los eventos por sistema.

Tablas de listeners débiles

Utilice tablas de listeners con valores débiles para que, si un objeto suscriptor es eliminado por el GC, su listener se elimine automáticamente, evitando fugas de memoria en juegos de larga duración.

Integración con el bucle del juego

Integre el sistema de eventos con el bucle del juego: eventos de entrada → eventos de lógica → eventos de renderizado, procesados en orden en cada frame.

Pregunta sobre el sistema de eventos

¿Cuál es la principal ventaja de un sistema de eventos?

Resumen: sistemas de eventos

Los sistemas de eventos de Lua utilizan una tabla de listas de listeners con nombre. Implemente on, emit, off y once para crear un dispatcher completo. Utilice colas asíncronas y tablas débiles en juegos destinados a producción.

Preguntas frecuentes

¿La lección «Sistemas de eventos en Lua» es gratis?

Sí — el texto completo de «Sistemas de eventos en Lua» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Sistemas de eventos en Lua»?

Construya un despachador de eventos ligero con callbacks almacenados en tablas. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Sistemas de eventos en Lua»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Sistemas de eventos en Lua
  2. Scripting basado en componentes
  3. Comportamiento de IA con máquinas de estados
  4. Configuración basada en datos y hot-reload
← Volver a Lua Academy