Tapahtumajärjestelmät Luassa
Rakentakaa kevyt tapahtumavälittäjä, jonka takaisinkutsut tallennetaan taulukoihin.
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
endVä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)
endKuuntelijoiden 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
endTapahtumien 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
endMuokkauksen 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.
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
- Tapahtumajärjestelmät Luassa
- Komponenttipohjainen skriptaus
- Tekoälyn käyttäytyminen tilakoneilla
- Tietopohjainen määritys ja hot reload