Lua Academy · Oppitunti

Tapahtumajärjestelmät Luassa

Rakentakaa kevyt tapahtumavälittäjä, jonka takaisinkutsut tallennetaan taulukoihin.

Oppitunti 1/413 vaihetta

Tapahtumajärjestelmät Luassa on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Miksi tapahtumajärjestelmiä käytetään?

Tapahtumajärjestelmä irrottaa tuottajat (tapahtumia käynnistävät asiat) kuluttajista (niihin reagoivista asioista). Luassa se voidaan rakentaa helposti takaisinsoittavien funktioiden taulukoilla.

Yksinkertainen tapahtumien välittäjä

Välittäjä tallentaa kuuntelijaluetteloita tapahtuman nimen perusteella.

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

Välittäjän käyttäminen

Tilaa tapahtumia komennolla :on ja laukaise ne komennolla :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)

Kertaluonteiset kuuntelijat

:once-metodi käärii callback-funktion niin, että se poistaa itsensä kuuntelijoista ensimmäisen kutsun jälkeen.

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

Kuuntelijoiden poistaminen

:off-metodi poistaa tietyn kuuntelijan viitteen perusteella.

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

Tapahtumien prioriteettijonot

Lisää jokaiselle kuuntelijalle prioriteettikenttä. Järjestä lista rekisteröinnin yhteydessä niin, että korkean prioriteetin käsittelijät suoritetaan ensin.

Asynkroninen tapahtumajono

Sen sijaan, että kutsuisit kuuntelijoita heti, lisää tapahtumat jonoon ja käsittele ne jokaisella framella tai tikillä.

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

Muokkauksen estäminen emitoinnin aikana

Kun emitot tapahtumia, käy kuuntelijalista läpi sen kopion avulla, jotta kuuntelijoiden lisääminen tai poistaminen emitoinnin aikana ei aiheuta virheitä.

Nimiavaruudelliset tapahtumat

Käytä pisteillä erotettuja tapahtumien nimiä ("player.damaged", "player.healed") tapahtumien järjestämiseen järjestelmän mukaan.

Heikot kuuntelijataulukot

Käytä heikkoarvoisia kuuntelijataulukoita, jotta tilaajaobjektin tullessa roskankeräyksen kohteeksi sen kuuntelija poistetaan automaattisesti — tämä estää muistivuodot pitkään käynnissä olevissa peleissä.

Pelilooppiin integrointi

Integroi tapahtumajärjestelmä pelilooppiin: syötetapahtumat → logiikkatapahtumat → renderöintitapahtumat, jotka käsitellään tässä järjestyksessä jokaisella framella.

Tapahtumajärjestelmää koskeva kysymys

Mikä on tapahtumajärjestelmän tärkein hyöty?

Kertaus: tapahtumajärjestelmät

Luan tapahtumajärjestelmät käyttävät nimettyjen kuuntelijalistojen taulukkoa. Toteuta on-, emit-, off- ja once-toiminnot täydellistä dispatcher-järjestelmää varten. Käytä tuotantoon tarkoitetuissa peleissä asynkronisia jonoja ja heikkoja taulukoita.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Tapahtumajärjestelmät Luassa” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Tapahtumajärjestelmät Luassa”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Tapahtumajärjestelmät Luassa”?

Rakentakaa kevyt tapahtumavälittäjä, jonka takaisinkutsut tallennetaan taulukoihin. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Tapahtumajärjestelmät Luassa”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Tapahtumajärjestelmät Luassa
  2. Komponenttipohjainen skriptaus
  3. Tekoälyn käyttäytyminen tilakoneilla
  4. Tietopohjainen määritys ja hot reload
← Takaisin: Lua Academy