Lua Academy · Les

Gebeurtenissystemen in Lua

Bouw een lichte eventdispatcher met callbacks die in tables worden opgeslagen

Les 1 van 413 stappen

Gebeurtenissystemen in Lua is een gratis Lua Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Lua Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Lua Academy bevat in totaal 4 lessen.

Waarom gebeurtenissystemen?

Een gebeurtenissysteem ontkoppelt producenten (dingen die gebeurtenissen activeren) van consumenten (dingen die erop reageren). In Lua bouw je dit eenvoudig met tabellen met callbackfuncties.

Eenvoudige gebeurtenisverdeler

Een gebeurtenisverdeler bewaart lijsten met listeners, gekoppeld aan de naam van de gebeurtenis.

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

De gebeurtenisverdeler gebruiken

Abonneer je op gebeurtenissen met :on en activeer ze met :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)

Eenmalige listeners

Een :once-methode verpakt de callback zodat deze zichzelf na de eerste aanroep uitschrijft.

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

Listeners verwijderen

Een :off-methode verwijdert een specifieke listener op basis van een referentie.

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

Prioriteitswachtrijen voor gebeurtenissen

Voeg aan elke listener een prioriteitsveld toe. Sorteer de lijst bij registratie, zodat handlers met hoge prioriteit als eerste worden uitgevoerd.

Asynchrone gebeurteniswachtrij

Roep listeners niet onmiddellijk aan, maar plaats gebeurtenissen in een wachtrij en verwerk ze bij elke 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

Wijzigingen tijdens emit voorkomen

Itereer tijdens het activeren over een kopie van de listenerlijst, zodat toevoegen of verwijderen tijdens het activeren geen fouten veroorzaakt.

Gebeurtenissen met naamruimten

Gebruik gebeurtenisnamen met punten ("player.damaged", "player.healed") om gebeurtenissen per systeem te organiseren.

Zwakke listenertabellen

Gebruik listenertabellen met zwakke waarden, zodat de listener automatisch wordt verwijderd wanneer een abonneeobject door de garbagecollector wordt opgeruimd — zo voorkom je geheugenlekken in spellen die lang draaien.

Integratie met de gameloop

Integreer het gebeurtenissysteem met de gameloop: invoergebeurtenissen → logische gebeurtenissen → rendeergebeurtenissen, die elke frame in deze volgorde worden verwerkt.

Vraag over gebeurtenissystemen

Wat is het belangrijkste voordeel van een gebeurtenissysteem?

Samenvatting: gebeurtenissystemen

Lua-gebeurtenissystemen gebruiken een tabel met benoemde listenerlijsten. Implementeer on, emit, off en once voor een complete dispatcher. Gebruik asynchrone wachtrijen en zwakke tabellen in productiespellen.

Gratis beginnen

Leer Lua met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
40
Lessen
159

Veelgestelde vragen

Is de les “Gebeurtenissystemen in Lua” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Lua Academy, waaronder “Gebeurtenissystemen in Lua”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Lua Academy bevat in totaal 4 lessen.

Wat leer ik in “Gebeurtenissystemen in Lua”?

Bouw een lichte eventdispatcher met callbacks die in tables worden opgeslagen Je oefent met Lua Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Lua Academy te beginnen?

Ervaring vooraf is niet nodig. Lua Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Gebeurtenissystemen in Lua”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Lua Academy?

Ja. Elke les over Lua Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Gebeurtenissystemen in Lua
  2. Componentgebaseerd scripten
  3. AI-gedrag met toestandsmachines
  4. Datagestuurde configuratie en hot reload
← Terug naar Lua Academy