Hálózati Bombermen Belicza András Konzulens: Rajacsics Tamás BME-AAIT
Mi is a Bomberman Felülnézeti 2D mászkálós játék Feladat: egy figura irányítása (bomberman) Pálya: beton és tégla fal, köztük mozoghatunk Bombákat rakhatunk le, melyek a játékosokat megölik, a téglafalakat rombolják Tárgyak: felvehető objektumok, melyek tulajdonságainkat, képességeinket változtatják meg Cél: megölni az ellenfeleinket
Konkurencia Számos Bomberman játék létezik már. Említésre méltó: –Bomberman (Nintendo, ’89),Dyna blaster (’91): az ősök, nincs hálózati támogatás –Atomic Bomberman (’97): korlátozott IPX alapú hálózati támogatás, sok újítás (és „bug”) Újításaim: –új játék koncepció –Erős hálózati támogatás
Tervezési szempontok A kód teljes függetlensége a játékban használt hang és kép erőforrásoktól Kiemelt hálózati támogatás –korlátlan számú játékos –minimális sávszélesség-igény –csomagküldési „delay” kezelése Jól konfigurálható, skálázható
Implementációs szempontok Az implementáció nyelve: Java2 5.0 –Biztonságos, könnyen kezelhető, jól dokumentálható, teljes körűen támogatott –Teljes hálózati támogatás IP alapú hálózati támogatás Server-kliens alapú program- és hálózati struktúra –Öncsatlakozás; pl. chat serveren keresztül
Alapelvek: Iteráció A minimális hálózati forgalom céljából lokális játékszámítás és –karbantartás A játékszámítás alapegysége az iteráció: –Egy iteráció kiszámításához csak az előző iteráció végén levő állapotot (a játék állása és a játékosok akcióinak sorozata) kell ismerni.
Alapelvek: szinkronizáció I. A játékban résztvevő gépek szinkronizálása –Következő iteráció kezdődhet, ha NI jelet kapunk –Az NI jelet a szerver akkor küldi, ha minden kliens készen áll (és az iterációidőzítő is jelzett már) –Ha egy kliens NI jelet kap, kiszámítja a következő iterációt, és elküldi játékosai akció sorozatait (ez egyben a kész jel) –Ha mindenki elküldte akció sorozatait, a szerver NI jel formájában ezt minden kliensnek szétküldi (minimális iterációidő azért van)
Alapelvek: szinkronizáció II. Véletlenek: a játék rengeteg véletlen eseményt és adatot használ. java.util.Random.seed() Egy játék-csomóponton is több szál fut, melyeket ezek után már elég lokálisan szinkronizálni –Pl. a játéktér frissítése: a skálázhatóság érdekében az iteráció periódusidejétől függetlenül történhet, szinkronizálása az iterációk számítása és saját időzítője alapján
Alapelvek: hálózati delay kezelése A „lag”-os játék legfőbb tényezője a hálózati csomagkésleltetés Két iteráció közötti várakozási időt használjuk a delay lefedésére Amikor elküldjük akcióinkat, azok a következő iterációban érvényesülnek majd Következmény: pl. Ti=30 ms esetén a mozgás 30 ms-ot késik (nem érezhető, de szokható lenne), viszont közel 30 ms delay-t egyáltalán nem érzünk
Összefoglalás Az ismertetett struktúrák és algoritmusok alkalmazásával a kívánt újítások és előnyök kézbentartható bonyolultsággal megvalósíthatóak A téma később általánosítható valósidejű elosztott játékok és alkalmazások hálózati struktúrájának és adatforgalmának tervezésére és elemzésére
Köszönöm a figyelmet. Játék specifikáció és elkészült forráskódok: