Ereignissysteme in Lua
Erstellen Sie einen schlanken Ereignis-Dispatcher mit in Tabellen gespeicherten Callbacks
Ereignissysteme in Lua ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Event-Systeme?
Ein Event-System entkoppelt Produzenten (Dinge, die Events auslösen) von Konsumenten (Dinge, die darauf reagieren). In Lua lässt es sich leicht mit Tabellen aus Callback-Funktionen erstellen.
Einfacher Event-Dispatcher
Ein Dispatcher speichert Listener-Listen, die nach dem Eventnamen indiziert sind.
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
endDen Dispatcher verwenden
Abonnieren Sie Ereignisse mit :on und lösen Sie sie mit :emit aus.
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 für einmalige Aufrufe
Eine :once-Methode umschließt den Callback, damit dieser sich nach dem ersten Aufruf selbst abmeldet.
function EventEmitter:once(event, fn)
local wrapper
wrapper = function(...)
self:off(event, wrapper)
fn(...)
end
self:on(event, wrapper)
endListener entfernen
Eine :off-Methode entfernt einen bestimmten Listener anhand seiner Referenz.
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
endPrioritätswarteschlangen für Ereignisse
Fügen Sie jedem Listener ein Prioritätsfeld hinzu. Sortieren Sie die Liste bei der Registrierung, damit Handler mit hoher Priorität zuerst ausgeführt werden.
Asynchrone Ereigniswarteschlange
Statt Listener sofort aufzurufen, stellen Sie Ereignisse in eine Warteschlange und verarbeiten Sie sie in jedem Frame bzw. 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Änderungen während der Ereignisauslösung verhindern
Iterieren Sie beim Auslösen über eine Kopie der Listener-Liste, damit das Hinzufügen oder Entfernen während der Ausführung keine Fehler verursacht.
Ereignisse mit Namensräumen
Verwenden Sie Ereignisnamen mit Punkten ("player.damaged", "player.healed"), um Ereignisse nach System zu organisieren.
Listener-Tabellen mit schwachen Referenzen
Verwenden Sie Listener-Tabellen mit schwachen Werten. Wenn ein Subscriber-Objekt vom GC freigegeben wird, wird sein Listener automatisch entfernt – dadurch verhindern Sie Leaks in Spielen mit langer Laufzeit.
Integration in die Spielschleife
Integrieren Sie das Ereignissystem in die Spielschleife: Eingabeereignisse → Logikereignisse → Renderereignisse, die in jedem Frame der Reihe nach verarbeitet werden.
Frage zum Ereignissystem
Was ist der wichtigste Vorteil eines Ereignissystems?
Zusammenfassung: Ereignissysteme
Lua-Ereignissysteme verwenden eine Tabelle mit benannten Listener-Listen. Implementieren Sie on, emit, off und once, um einen vollständigen Dispatcher zu erhalten. Verwenden Sie in Produktivspielen asynchrone Warteschlangen und Tabellen mit schwachen Referenzen.
Häufig gestellte Fragen
Ist die Lektion „Ereignissysteme in Lua“ kostenlos?
Ja — der vollständige Text von „Ereignissysteme in Lua“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Ereignissysteme in Lua“?
Erstellen Sie einen schlanken Ereignis-Dispatcher mit in Tabellen gespeicherten Callbacks Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Ereignissysteme in Lua“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Ereignissysteme in Lua
- Komponentenbasierte Skripterstellung
- KI-Verhalten mit Zustandsautomaten
- Datengetriebene Konfiguration und Hot-Reload