0Pricing
Lua Academy · Lektion

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
end

Den 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)
end

Listener 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
end

Prioritä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

  1. Ereignissysteme in Lua
  2. Komponentenbasierte Skripterstellung
  3. KI-Verhalten mit Zustandsautomaten
  4. Datengetriebene Konfiguration und Hot-Reload
← Zurück zu Lua Academy