Gebeurtenissystemen in Lua
Bouw een lichte eventdispatcher met callbacks die in tables worden opgeslagen
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
endDe 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)
endListeners 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
endPrioriteitswachtrijen 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
endWijzigingen 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.
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
- Gebeurtenissystemen in Lua
- Componentgebaseerd scripten
- AI-gedrag met toestandsmachines
- Datagestuurde configuratie en hot reload