0Pricing
Lua Academy · Lezione

Sistemi di eventi in Lua

Costruisca un dispatcher di eventi leggero con callback memorizzate nelle tabelle.

Sistemi di eventi in Lua è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Perché i sistemi di eventi?

Un sistema di eventi disaccoppia i produttori, cioè gli elementi che generano gli eventi, dai consumatori, cioè gli elementi che reagiscono a essi. In Lua, si costruisce facilmente utilizzando tabelle di funzioni callback.

Dispatcher di eventi semplice

Un dispatcher memorizza elenchi di listener indicizzati per nome dell'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

Utilizzo del dispatcher

Sottoscriva gli eventi con :on e li attivi 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)

Listener eseguiti una sola volta

Un metodo :once avvolge il callback per annullare automaticamente la propria registrazione dopo la prima chiamata.

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

Rimozione dei listener

Un metodo :off rimuove un listener specifico tramite riferimento.

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

Code di priorità per gli eventi

Aggiunga un campo di priorità a ogni listener. Ordini l'elenco al momento della registrazione, così i gestori con priorità più alta vengono eseguiti per primi.

Coda asincrona degli eventi

Anziché chiamare immediatamente i listener, inserisca gli eventi in una coda ed elabori la coda a ogni frame/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

Prevenzione delle modifiche durante l'emissione

Durante l'emissione, iteri su una copia dell'elenco dei listener, così l'aggiunta o la rimozione durante l'emissione non causa errori.

Eventi con namespace

Utilizzi nomi di evento separati da punti ("player.damaged", "player.healed") per organizzare gli eventi in base al sistema.

Tabelle di listener deboli

Utilizzi tabelle di listener con valori deboli, così, se un oggetto sottoscrittore viene eliminato dal GC, il relativo listener viene rimosso automaticamente, prevenendo perdite di memoria nelle sessioni di gioco prolungate.

Integrazione con il game loop

Integri il sistema degli eventi con il game loop: eventi di input → eventi logici → eventi di rendering, elaborati in ordine a ogni frame.

Domanda sul sistema degli eventi

Qual è il principale vantaggio di un sistema degli eventi?

Riepilogo: sistemi degli eventi

I sistemi degli eventi in Lua utilizzano una tabella di elenchi di listener denominati. Implementi on, emit, off e once per creare un dispatcher completo. Utilizzi code asincrone e tabelle deboli nei giochi in produzione.

Domande Frequenti

La lezione «Sistemi di eventi in Lua» è gratuita?

Sì — il testo completo di «Sistemi di eventi in Lua» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Sistemi di eventi in Lua»?

Costruisca un dispatcher di eventi leggero con callback memorizzate nelle tabelle. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Sistemi di eventi in Lua»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Sistemi di eventi in Lua
  2. Scripting basato sui componenti
  3. Comportamento dell'IA con macchine a stati
  4. Configurazione data-driven e hot reload
← Torna a Lua Academy