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
endUtilizzo 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)
endRimozione 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
endCode 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
endPrevenzione 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
- Sistemi di eventi in Lua
- Scripting basato sui componenti
- Comportamento dell'IA con macchine a stati
- Configurazione data-driven e hot reload