Lua Academy · leksjon

Hendelsessystemer i Lua

Bygg en lettvekts-hendelsesdistributør med tilbakekallingsfunksjoner lagret i tabeller.

Leksjon 1 av 413 trinn

Hendelsessystemer i Lua er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hvorfor hendelsessystemer?

Et hendelsessystem kobler produsenter (ting som utløser hendelser) fra konsumenter (ting som reagerer). I Lua kan det enkelt bygges med tabeller med callback-funksjoner.

Enkel hendelsesdistributør

En distributør lagrer lister over lyttere, indeksert etter hendelsesnavn.

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

Bruke distributøren

Abonner på hendelser med :on, og utløs dem med :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)

Lyttere som bare utløses én gang

En :once-metode pakker inn tilbakekallingen slik at den fjerner seg selv etter første kall.

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

Fjerne lyttere

En :off-metode fjerner en bestemt lytter ved hjelp av referansen til den.

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

Prioritetskøer for hendelser

Legg til et prioritetsfelt for hver lytter. Sorter listen ved registrering, slik at behandlere med høy prioritet kjører først.

Asynkron hendelseskø

I stedet for å kalle lytterne umiddelbart legger du hendelser i en kø og behandler dem for hver frame/tikk.

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

Hindre endringer under utløsning

Ved utløsning itererer du over en kopi av lytterlisten, slik at det å legge til eller fjerne lyttere under utløsningen ikke fører til feil.

Navneområder for hendelser

Bruk hendelsesnavn med punktum ("player.damaged", "player.healed") for å organisere hendelser etter system.

Lyttetabeller med svake referanser

Bruk lyttertabeller med svake verdier, slik at lytteren automatisk fjernes hvis et abonnentobjekt blir samlet opp av GC — dette hindrer lekkasjer i spill som kjører lenge.

Integrasjon med spill-løkken

Integrer hendelsessystemet med spill-løkken: inndatahendelser → logikkhendelser → gjengivelseshendelser, behandlet i riktig rekkefølge for hver frame.

Spørsmål om hendelsessystemer

Hva er den viktigste fordelen med et hendelsessystem?

Oppsummering: Hendelsessystemer

Lua-hendelsessystemer bruker en tabell med navngitte lytterlister. Implementer on, emit, off og once for å få en komplett dispatcher. Bruk asynkrone køer og svake tabeller i produksjonsspill.

Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Hendelsessystemer i Lua» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Hendelsessystemer i Lua», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Hendelsessystemer i Lua»?

Bygg en lettvekts-hendelsesdistributør med tilbakekallingsfunksjoner lagret i tabeller. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Hendelsessystemer i Lua»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Hendelsessystemer i Lua
  2. Komponentbasert skripting
  3. AI-atferd med tilstandsmaskiner
  4. Datadrevet konfigurasjon og hot-reload
← Tilbake til Lua Academy