0Pricing
Lua Academy · Aula

Sistemas de eventos em Lua

Crie um despachante de eventos leve com retornos de chamada armazenados em tabelas.

Sistemas de eventos em Lua é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

Por que usar sistemas de eventos?

Um sistema de eventos desacopla produtores (coisas que disparam eventos) de consumidores (coisas que reagem a eles). Em Lua, ele pode ser facilmente criado com tabelas de funções de callback.

Despachante de eventos simples

Um despachante armazena listas de ouvintes indexadas pelo nome do 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

Usando o despachante

Inscreva-se em eventos com :on e dispare-os com :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)

Ouvintes de uma única execução

Um método :once envolve o retorno de chamada para remover seu próprio registro após a primeira chamada.

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

Removendo ouvintes

Um método :off remove um ouvinte específico por referência.

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

Filas de prioridade para eventos

Adicione um campo de prioridade a cada ouvinte. Ordene a lista no momento do registro para que os manipuladores de alta prioridade sejam executados primeiro.

Fila assíncrona de eventos

Em vez de chamar os ouvintes imediatamente, coloque os eventos em uma fila e processe-os a cada quadro ou ciclo.

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

Impedindo modificações durante a emissão

Ao emitir, percorra uma cópia da lista de ouvintes para que adicionar ou remover itens durante a emissão não cause erros.

Eventos com namespace

Use nomes de eventos separados por pontos ("player.damaged", "player.healed") para organizar os eventos por sistema.

Tabelas de ouvintes fracos

Use tabelas de ouvintes com valores fracos para que, se um objeto assinante for coletado pelo coletor de lixo, seu ouvinte seja removido automaticamente — evitando vazamentos em jogos de longa duração.

Integração com o loop do jogo

Integre o sistema de eventos ao loop do jogo: eventos de entrada → eventos de lógica → eventos de renderização, processados nessa ordem a cada quadro.

Pergunta sobre o sistema de eventos

Qual é o principal benefício de um sistema de eventos?

Recapitulação: sistemas de eventos

Os sistemas de eventos em Lua usam uma tabela de listas de ouvintes nomeadas. Implemente on, emit, off e once para criar um despachante completo. Use filas assíncronas e tabelas fracas em jogos de produção.

Perguntas Frequentes

A aula “Sistemas de eventos em Lua” é grátis?

Sim — o texto completo de “Sistemas de eventos em Lua” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “Sistemas de eventos em Lua”?

Crie um despachante de eventos leve com retornos de chamada armazenados em tabelas. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Sistemas de eventos em Lua”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Sistemas de eventos em Lua
  2. Script baseado em componentes
  3. Comportamento de IA com máquinas de estados
  4. Configuração orientada por dados e recarga a quente
← Voltar para Lua Academy