Csoport neve: Nil
Feladat sorszáma: 6
Feladat címe: Stratégiai játék
Analízis modell
Gyakorlatvezető::
Répási Tibor
Csoport tagok:
Szmetankó Gábor |
EMS4D7 |
szmeti@chello.hu |
Farkas Dániel |
VGF0AV |
farkasd@gmail.com |
Borsody Péter |
XRCMHR |
borsody@iit.uni-miskolc.hu |
Borsody Zsombor |
AV8VOD |
borsody_zs@freemail.hu |
Herczeg Ádám |
F8T8FT |
herczeg@iit.uni-miskolc.hu |
Soós Dániel |
BJFFAF |
soos1@iit.uni-miskolc.hu |
2006.04.21.
Történet
Dátum |
Verzió |
Leírás |
Szerző |
2006.04.12. |
1.0 |
Kezdeti verzió |
Borsody Péter, |
2006.04.21. | 1.5 | Végleges verzió | Borsody Péter, Borsody Zsombor, Farkas Dániel, Szmetankó Gábor |
2.3.4. Kezelőfelület alrendszer
2.3.6. Hálózatkezelés alrendszer
3. Beállítások alrendszer modellje
3.1.1. Kapcsolatok pontosítása
3.1.2. Attribútumok azonosítása
3.1.3. Bázisosztályok keresése
3.5. Az analízis modell osztálydiagramja.
3.6. Az analízis modell osztályainak listája
4. Grafikai alrendszer modellje
4.1.1. Kapcsolatok pontosítása
4.1.2. Attribútumok azonosítása
4.1.3. Bázisosztályok keresése
4.5. Az analízis modell osztálydiagramja.
4.6. Az analízis modell osztályainak listája
5.1.1. Kapcsolatok pontosítása
5.1.2. Attribútumok azonosítása
5.1.3. Bázisosztályok keresése
5.5. Az analízis modell osztálydiagramja.
5.6. Az analízis modell osztályainak listája
6. A kezelőfelület alrendszer modellje
6.1.1. Kapcsolatok pontosítása
6.1.2. Attribútumok azonosítása
6.1.3. Bázisosztályok keresése
6.5. Az analízis modell osztálydiagramja.
6.6. Az analízis modell osztályainak listája
7. Játékmotor alrendszer modellje
7.1.1. Kapcsolatok pontosítása
7.1.2. Attribútumok azonosítása
7.1.3. Bázisosztályok keresése
7.5. Az analízis modell osztálydiagramja.
7.6. Az analízis modell osztályainak listája
8. Hálózatkezelés alrendszer modellje
8.1.1. Kapcsolatok pontosítása
8.1.2. Attribútumok azonosítása
8.1.3. Bázisosztályok keresése
8.5. Az analízis modell osztálydiagramja
8.6. Az analízis modell osztályainak listája
9. Naplózás alrendszer modellje
9.1.1. Kapcsolatok pontosítása
9.1.2. Attribútumok azonosítása
9.1.3. Bázisosztályok keresése
9.5. Az analízis modell osztálydiagramja
9.6. Az analízis modell osztályainak listája
Az alábbi dokumentum a "Children of the Wüstenplanet" projekt analízis modelljét tartalmazza. A projekt célja egy valósidejű stratégiai játék létrehozása, amely Frank Herbert: Dune regényére épül. A stratégiai játékoktól elvárható funkciók mellett számos újítást kívánunk bevezetni, kiküszöbölve az eddigi programok esetleges hiányossságait.
A dokumentum ismerteti az elsődleges elképzelések alapján elkészített osztálytervet és az egyes osztályok általános szerepét. A következő részben a kezdeti osztályterv alapján kialakított alrendszerek vázlatos leírása található, majd a dokumentum hátralévő része ezeket az alrendszereket elemzi részletesen.
1. ábra. Kezdeti osztálydiagram
Game
A program fő osztálya. Összekapcsolja, vezérli a többi osztályt, melyek rajta keresztül kommunikálhatnak egymással.
Belőle származik le a játék összes objektuma, belértve az egységeket és az épületeket, mindegyikhez ennek egy példánya tartozik. Azokat a tulajdonságokat tartalmazza amellyel a játék összes objektuma rendelkezik. Pl: helyét a térképen, életerejét stb.
Map
A játéktér adatait hordozza, úgymint a terep felépítése (hol, milyen típusú talaj található, stb.). A grafikai megjelenítés a MapSprite osztály segítéségével történik.
A játék grafikai elemeinek megjelenítéséért felelős, tartalmazza azok vizuális adatait és a kirajzolást is ez végzi.
ObjectSprite
A Sprite leszármazottja az objektumok megjelenítésére. A kirajzolást a GameObject adatai alapján csinálja.
A Sprite leszármazottja, a térkép „építőköveinek” adatait hordozza, amelyek összességéből a pálya felépül.
Building
A GameObjectleszármazottja, az épületek és egyéb álló játékbeli objektumok speciális adatainak tárolására.
Unit
A GameObject leszármazottja, a harci, építő és egyéb mozgó egységek speciális adatainak tárolására.
Listener
A felhasználói
utasításokat „figyeli” amelyek alapján a GameObject
adattagjai megváltozhatnak. (Például új úticélt kap, megtámad
valakit, egységet legyárt, …)
Log
A program futása során keletkező adatokat, naplózza, melyek segítségével könnyebbé válik az esetleges hibák megtalálása és javítása.
Menu
A szoftver által végezhető műveleteket tárolja el fastruktúrában, meghívja a kért műveletekhez tartozó rutinokat.
Options
A felhasználó által beállított játékparamétereket tartalmazza.
Player
A játékot irányító szubjektum (felhasználó vagy mesterséges intelligencia) ezen osztály segítségével kapcsolódik.
AIPlayer
A számítógépi ellenfél (mesterséges intelligencia) ezen keresztül valósul meg és cselekszik.
HumanPlayer
A felhasználó(k) ezen keresztül vesznek részt a játékban.
GameServer
Alapvető feladata a bejelentkezett kliensek közötti játék automatikus lebonyolítása, vagyis a mérkőző játékosok összekapcsolása, a felek közötti kommunikáció megszervezése, a mérkőzés végének automatikus detektálása, és a győztes kijelölése.
GameClient
Hálózati játék esetében az egyes felhasználók ezen keresztül kommunikálnak a játékszerverrel. (A játékos műveleteit továbbítja a játékszerverhez)
2. ábra. Alrendszerek
A részegység feladata összefogni a képi megjelenítést és a hanghatások megszólaltatását. Ennek elemei a grafikai alrendszer és a hang alrendszer.
Feladata a képelemek kirajzolása. A játék felületének, pályájának, egységeinek kirajzolása, megjelenítése tartozik hozzá.
Az alrendszerhez tartozó osztályok :
A játék részét képező hangeffektek, hanghatások, háttérzene, fegyverropogás, lövegtornyok tüzelése, bombák robbanásának megszólaltatása.
Az alrendszerhez tartozó osztályok :
Ehhez az alrendszerher tartozik minden olyan elem, amin keresztül a felhasználó eléri az egyes funkciókat, beavatkozik a játékba, irányítja azt. Magában foglalja mind a játékon belüli irányítás, mind pedig a játék indításához, kezeléséhez szükséges entitások összességét. Kiválasztható elemeket és a beavatkozó szerveket (Human Interface Devices (HID) ) lekezelését is megvalósítja.
Az alrendszerhez tartozó osztályok :
Ez az alrendszer a szoftver legfontosabb része. Kapcsolatban áll a többi komponenssel, nyílvántartja a játékon belüli objektumokat, a játékosokat, vezérli azokat. A játékmotor műveleteinek eredményét használja fel a többi komponens.
Az alrendszerhez tartozó osztályok :
A hálózatkezelési alrendszer felelelős a hálózaton keresztüli játék biztosításáért. Az alkamazás egy futó példánya működhet szerverként, illetve kliensként is. Szoros együttműködésben áll a Game osztállyal, amely a hálózaton elküldendő adatokat szolgáltatja.
Az alrendszerhez tartozó osztályok :
A játék helyes működéséhez szükséges beállításokat kezelő komponens. Lehetőséget biztosít konfigurációs fájlok beolvasására, valamint képes elvégezni a megfelelő beállítások automatikus detektálását is. Szoros együttműködésben áll a Game osztállyal.
Az alrendszerhez tartozó osztályok :
Az alkalmazás készítésénél fontos szempont, hogy az esetleges hibákról és egyéb eseményekről a fejlesztők megfelelő formában értesüljenek. Ezt a feladatot látja el a naplózás alrendszer. Megfelelő formátumban rögzíti a hibákat és azok körülményeit, amelyet később el lehet küldeni a fejlesztőknek.
Az alrendszerhez tartozó osztályok :
Az Options osztály, melynek feladata tárolni a játék felhasználó által beállított paramétereit a Game osztállyal áll kapcsolatban. Mivel Options osztálynak csak egy példánya lehet jelen, ezért 1-1 kapcsolat van közöttük.
A beállítások alrendszer minden osztályának a specifikációjától függően tartalmaznia kell a szükséges paramétereket leíró attribútumokat. Ide tartoznak az audió beállításokat leíró hangerősség attribútumok, a videóbeállításokat leíró felbontás, színmélység és kidolgozottsági szint attribútumok, a hálózatot és játékhasználatot leíró paraméterek is ide kerülnek.
A menürendszerhez való igazodás érdekében célszerű a beállítások specifikus
alosztályokra leképezni (pl. AudioOptions, VideOptions ). Ezek azonban hasonló
struktúrájuak, és közös tulajdonsággal is rendelkeznek (utolsó módosítás
dátuma), így kézenfekvő közös bázis osztályból származtatni ezeket. Ez a bázis
osztály az Options osztály.
Az alrendszer által tárolt paraméterekből építkezik a játék és általa biztosítható a felhasználó szabadsága, ezért fontos szerepet tölt be a játék struktúrájában. Két oldalról is övezi a játék: a játékmotor ( Game, GameObject ) osztályai innen veszik az alapvető audiovizuális, és játékelemi tulajdonságokat, ezeknek megadását pedig a Kezelőfelület alrenszer végzi.
Mivel az eltárolt paraméterek döntő többsége nem vehet fel akármilyen értéket, módosításuk csakis metódusokon keresztül valósulhat meg. Ezek a set szóval kezdődő metódusok. Ezek ellenőrzik az érték helyességét. Az adatelrejtés elve miatt ezeket a paramétereket privát adattagokban tároljuk el, így közvetlen módon más osztályból nem elérhetőek. A hozzáférés get szóval kezdődő metódusokan keresztül valósul meg.
3.5. Az analízis modell osztálydiagramja
3. ábra. Beállítások alrendszer osztálydiagramja
felelőssége, feladata: tárolja a felhasználó által beállított játékparamétereket.
együttműködők: Game
Név | Típus | Leírás |
LastModified | Date | Utolsó módosítás időpontja |
operációk
Név | Argumentumok | Működése, feladata |
getLastModified | nincs | Visszatér az utolsó módosítás dátumával |
felelőssége, feladata: Az Options leszármazottja. Hangerő beállításokat tárolja.
együttműködők: Options
Név | Típus | Leírás |
MusicVolume | int | A játék közbeni zene hangerőssége. (0-10) |
SoundEffectVolume | int | A hangeffektusok hangerőssége. (0-10) |
operációk
Név | Argumentumok | Működése, feladata |
setMusicVolume |
int |
MusicVolume adattag beállítása |
setSoundEffectVolume | int | SoundEffectVolume adattag beállítása |
felelőssége, feladata: Az Options leszármazottja. A megjelenítéssel kapcsolatos beállításokat tárolja el.
együttműködők: Options
Név | Típus | Leírás |
Resolution | int |
A képernyő felbontása. Lehetséges értékei:
|
ColorDepth | int |
A megjelenítés színmélysége. Lehetséges értékei:
|
Detail | int | A részletek kidolgozottsága. (0-5) |
operációk
Név | Argumentumok | Működése, feladata |
setResolution |
int |
Felbontása beállítása |
getResolution |
nincs |
Felbontás lekérdezése |
setColorDepth |
int |
Színmélység beállítása |
getColorDepth |
nincs |
Színmélység lekérdezés |
setDetail |
int |
Kidolgozottság beállítása |
getDetail | nincs | Kidolgozottság lekérdezése |
felelőssége, feladata: Az Options leszármazottja. Hálózati beállításokat tárolja.
együttműködők: Options
Név | Típus | Leírás |
RemoteHost | String | A távoli gép neve/IP címe. |
ConnectionType | int | A kapcsolat típusa. |
operációk
Név | Argumentumok | Működése, feladata |
setConnectionType |
int |
Kapcsolat típusának beállítása |
getConnectionType | nincs | Kapcsolat típusának lekérdezése |
felelőssége, feladata: Az Options leszármazottja. A játék közbeni beállításokat tárolja el.
együttműködők: Options
Név | Típus | Leírás |
Speed | int | A játék menetének a sebessége. Lehetséges értékei:
|
operációk
Név | Argumentumok | Működése, feladata |
setSpeed |
int |
Sebesség beállítása. |
getSpeed | nincs | Sebesség lekérdezése. |
felelőssége, feladata: Az Options leszármazottja. Hálózati beállításokat tárolja.
együttműködők: Options
attribútumok
Név | Típus | Leírás |
RemoteHost | String | A távoli gép neve/IP címe. |
ConnectionType | int | A kapcsolat típusa |
operációk
Név | Argumentumok | Működése, feladata |
setConnectionType |
int |
Kapcsolat típusának beállítása |
getConnectionType | nincs | Kapcsolat típusának lekérdezése |
felelőssége, feladata: A játék nyelvi beállítása.
együttműködők: Options
attribútumok
Név | Típus | Leírás |
Language | int |
A játék nyelve. Lehetséges értékei:
|
operációk
Név | Argumentumok | Működése, feladata |
setLanguage | int | A játék nyelvének a beállítása |
getLanguage | nincs | A játék nyelvbeállításának a lekérdezése |
A grafikai alrendszer a pálya és az objektumok megjelenítéséért felelős. Közvetlenül a Map és a GameObject osztályokkal áll kapcsolatban. A játéktér elemi mezőkre van osztva, a MapSprite ezeket a mezőket rajzolja ki a Map kérésére a tárolt pályainformációk alapján. A játék minden egyes mezőjéhez tartozik egy MapSprite. A játékban szereplő egységek animált kirajzolásáért az ObjectSprite felel. Minden GameObject-hez tartozik egy ObjectSprite, egy ObjectSprite több GameObjecthez is tartozhat. A megjeleníteni kívánt GameObject meghívja a hozzá tartozó ObjectSprite draw() metódusát, ahol átadja neki a rajzoláshoz szükséges paramétereket (koordináták, elforgatás). Az animációs fázisok léptetésére is az ObjectSprite ad utasítást. (Azt mondja meg, hogy az animáció melyik képét kell kirajzolni.)
A grafikai osztályok kevés információt tárolnak, így kevés attribútummal rendelkeznek, amelyek közül a legfontosabb maga a tárolt kép. A célkoordináták és az elforgatás tárolására nincs szükség, mert azt mindig a megkapják a kirajzolást kérő féltől. A GameObject esetében a kirajzolandó animációs fázis számát kell tárolni. A MapObject szintén megkapja a célkoordinátákat (itt nincs elforgatás vagy animáció), ezenkívül minden kirajzolás előtt be kell állítani a mező azon tulajdonságait (pl. van-e rajta homokféreg, fűszer), amelyek befolyásolják a kirajzolást.
Az összes grafikai osztály jellemző tulajdonsága, hogy tárolják a képet és gondoskodnak ennek megjelenítéséről, ezenkívül léteznie kell a képek betöltését végző metódusnak is, ezért érdemes bevezetni a Sprite osztályt, aminek adott egy adattagja, ami egy képet tárol, és adott egy draw(x,y) nevű metódusa, amely (x,y) koordinátákba kirajzolja a képet. MapSprite esetében tiszta a helyzet, egy képet tárol, amit meg kell tudni jelenítenie, azonban ObjectSprite-nál más a helyzet: valahogy tárolnia kell egy objektum különböző nézeteit és animációs fázisait, ezért ObjectSprite nem leszármazottja a Sprite-nak, hanem Sprite objektumokat tárol.
Tehát SpriteObject , egy Sprite tömböt tárol, és amikor meghívják draw()-ját ő dönti el, hogy a tömb melyik Sprite-ját (midig csak egyet!) fogja kirajzoltatni. Lényeges, hogy ez a tulajdonos GameObject számára teljesen transzparens, ugyan úgy meghívhatja draw()-t és animate()-t, aminek hatására a várt funkciók hajtódnak végre. (Ez azért történik így, az objektum minden nézetéhez és a nézetek minden animációs fázisához külön kép, tehát külön Sprite tartozik.) A későbbiekben következő ábrából kiderül hogy GameObject SpriteLoop objektumokat tartalmaz, ezek a különböző nézeteket tartalmazzák. A SpriteLoop-ok a különböző nézetek animációs fázisait hordozzák.
Az ObjectSprite-ok működését az alábbi példa szemlélteti. Itt ObjectSprite-nak csak két nézete van: SpriteLoop_A és SpriteLoop_B. Minden egyes nézethez két animációs fázis tartozik. (Így ObjectSprite összesen négy Sprite-ot tárol.)
4. ábra. ObjectSprite működése
Amikor GameObject meghívja az ObjectSprite animate() metódusát, az „továbbküldi” azt az összes tartalmazott SpriteLoop-nak. Amikor GameObject ki akarja rajzolni, a megfelelő paraméterekkel meghívja a draw()-t. Ezután ObjectSprite maga dönti el a paraméterek alapján, hogy melyik nézetet rajzoltassa ki (melyik SprteLoop-ot válassza). Meghívja SpriteLoop draw() metódusát, ami a korábban megkapott animate() paraméterei alapján kirajzoltatja a megfelelő Sprite-ot.
Egy képernyő (pálya és egységek) kirajzolásának menete a következő:
a Map egyenként meghívja a kirajzolni kívánt mezők draw() metódusát (pontosan közölve, hogy hova történjen a kirajzolás)
miután a pálya kirajzolódott, a Game üzenetet küld a látótérbe eső Objektumoknak, hogy rajzolják ki magukat
a Game gondoskodik az animációról is, ezért bizonyos időközönként üzenetet küld a GameObject-eknek, hogy frissítsék az animációs fázisukat (meghívják a GameObject-ük animate() metódusát
amikor a látótérbe eső egységek kirajzolására kerül a sor, a Game üzenetet küld a GameObject-eknek, hogy rajzolják ki magukat. Ekkor a GameObjectek meghívják a hozzájuk tartozó GameSprite draw() metódusát, átadva neki a szükséges paramétereket, úgymint koordináták és elforgatás.
Az összes grafikai osztály fontos része a draw(). Ez végzi (közvetve vagy közvetlenül) a megjelenítést. Szintén fontos egy load() metódus, ami betöti a háttértárolóról a képeket.
A MapSprite megjelenítést befolyásoló attribútumai beállítássához is szükség van néhány metódusra. Az ObjectSprite esetében pedig az aktuális animációs fázis beállítását kell megvalósítani.
5. ábra. Grafikai alrendszer osztálydiagramja
Sprite:
Az elemi állóképek tárolására.
SpriteLoop:
Sprite-ok tömbje, egy egység adott nézetéhez tartozó külöböző animációs fázisainak tárolására.
SpriteObject:
SpriteLoop-ok tömbje, amelynek elemei egy egység összes különböző nézete.
MapSprite:
Sprite leszármazottja a térkép grafikai elemeinek tárolására.
felelőssége, feladata: különböző képek megjelenítéséért felelős
attribútumok
Név |
Típus |
Leírás |
data |
Image |
A képfájl adatai. |
Radius |
double |
A kép mérete. |
operációk
Név |
Argumentumok |
Működése, feladata |
draw |
x, y |
Kirajzolja a tárolt képet a (x,y) koordinátába. |
load |
String |
Kép betöltése fájlból. |
felelőssége, feladata: Sprite-ok tömbje, egy egység adott nézetéhez tartozó külöböző animációs fázisainak tárolására.
együttműködők: ObjectSprite
attribútumok
Név |
Típus |
Leírás |
data |
Sprite[] |
Ebben a tömbben tárolja a Sprite-okat. |
attitude |
int |
Mely animációs fázist kell kirajzolni. |
number |
int |
Hány Sprite-ot tárol. |
operációk
Név |
Argumentumok |
Működése, feladata |
draw |
x,y |
Kiválasztja, melyik Sprite draw() metódusát hívja meg x,y paraméterrel (attitude értéke alapján). |
animate |
nincs |
Új animációs fázisba lép (attitude értékét lépteti). |
add |
Sprite |
Új Sprite-ot ad listájához. |
felelőssége, feladata: SpriteLoop-ok tömbje, amelynek elemei egy egység összes különböző nézete. A GameObject ténylegesen ennek a draw()-ját hívja meg, ezzel kommunikál.
együttműködők: GameObject
attribútumok
Név |
Típus |
Leírás |
data |
SpriteLoop[] |
SpriteLoop tömb egy objektum nézeteinek tárolására. |
number |
int |
Éppen hány elemet tárol. |
operációk
Név |
Argumentumok |
Működése, feladata |
draw |
x,y,rotate |
Rotate alapján kiválasztja, hogy melyik SpriteLoop draw()-ját hívja meg x,y parméterrel. |
add |
SpriteLoop |
Új SpriteLoop-ot ad a listához. |
animate |
nincs |
Meghívja az összes hozzá tartozó SpriteLoop animate() metódusát. |
felelőssége, feladata: Sprite leszármazottja a térkép grafikai elemeinek tárolására.
együttműködők: Map
attribútumok (a Sprite attribútimain kívül)
Név |
Típus |
Leírás |
worm |
Rectangle |
Ha homokférek található adott mezőben a föld alatt, akkor a jelölt területet más színnel rajzolja ki. |
spice |
boolean |
Ha van fűszer az adott mezőn, azt is kirajzolja. |
operációk
Név |
Argumentumok |
Működése, feladata |
setWorm |
Rectangle |
Beállítja a homokférek helyét. |
setSpice |
boolean |
Beállítja, van-e fűszer a mezőn. |
A Hang alrendszer két jól elkülöníthető, logikailag mégis szorosan összetartozó tagból áll. Az első tag a SoundContinous osztály. Ennek egy példánya létezik a program futása során, ezen keresztül lehet a megszólaló zenéket vezérelni. A SoundEffect osztály pédányai a GameObject-hez tartoznak. Ez az egyes egységekhez/épületekhez tartozó hangeffekteket játssza le. Az osztályok nem közvetlenül játsszák le a hangokat, hanem objektummtömböket tárolnak, amik ténylegesen tárolják a zenéket/hangokat.
Az osztályoknak nem kell sok információt tárolni, csupán azt, hogy hány a tömbjük hány elemű. A SoundContinous még azt is tárolja, hogy a tömbjének hánydik eleme áll lejátszás alatt.
Mind a SoundContinous, mind a SoundEffect osztály nagyon hasonló egymáshoz, ezért érdemes lehetne közös őstől származtatni őket, azonban az eltérő felhasználási terület és a viszonylag kevés adattag- és metódusszám miatt nem éri meg.
A SoundContonous a Game objektumtól kapott üzeneteket hajtja végre. Ez lehet:
adott indexű elem lejátszása
a listában soron következő elem lejátszása
a lejátszás leállítása
Egy elem lejátszásának befejezésekor a SoundContinous ended() függvénnyel jelzi a befejezést.
6. ábra. SoundContinous működése
Minden GameObject-hez tartozhat egy vagy több SoundEffect objektum. Amikor a GameObject jónak találja (hangulatosabbá téve a játékot, pédául ágyúdörrenést szólaltat meg) meghívja a SoundEffect megfelelő indexű elemét. A SoundEffect tárolt hangjai lényegesen rövidebbek a SoundContinous-étól, ezért és felhasználásának más környezete miatt néhány dologban különbözik tőle:
nincs playNext()
a lejátszást nem lehet megszakítani
egyszerre több hang is lejátszható különböző hangerősséggel
A SoundContinous és SoundEffect osztályok play() (és hasonló) metódusainak meghívásakor az kiválasztja a tárolt hangok közül, hogy melyiket kell kiválasztani, majd meghívja annak lejátszásra szolgáló metódusát. A zene leállításakor ugyan ez a helyzet, az aktuálisan lejátszott elemnek meghívja a stop metódusát.
Kulcskérdés, hogy hogyan oldjuk meg a zenék lejátszását, azonban a fejlett programozási nyelvek erre beépített lehetőségeket nyújtanak.
Az osztályoknak rendelkezni kell a lejátszást elindító metódusokkal. Ekkor vagy paraméterként megadjuk a lejátszani kívánt elem sorszámát, vagy (SoundContinous esetében) csak annyit mondunk, hogy játssza le a következő elemet.
A másik fontos metódus a add(), amivel elemeket adhatunk a tárolókhoz. Ugyancsak fontos a load(), amivel betöltjük az elemeket.
7. ábra. Hang alrendszer osztálydiagramja
felelőssége, feladata: A GameObject-ekhez tartozó hangeffektek tárolására. Rövidségük miatt nincs szükség stop()-ra.s
együttműködők: SoundEffect
attribútumok
Név |
Típus |
Leírás |
data |
|
Az audio információk tárolása |
volume |
double |
A hangerősség. |
operációk
Név |
Argumentumok |
Működése, feladata |
play |
|
Lejátszás indítása. |
setColume |
double |
Hangerő beállítása.(Itt azért kell külön kiemelni, mert a térképen egyszerre jelenlévő egységek egyszerre lejátszandó hangjai különböző erősségűek lehetnek.) |
Load |
|
Hangok betöltése fájlból. |
felelőssége, feladata: Zene tárolására
együttműködők: SoundContinous
attribútumok
Név |
Típus |
Leírás |
data |
|
Az audio-információk tárolása. |
operációk
Név |
Argumentumok |
Működése, feladata |
play |
|
Lejátszás indítása. |
stop |
|
Lejátszás befejezése. |
load |
String |
Hangok betöltése fájlból. |
felelőssége, feladata: Logikailag összetartozó hageffektek tömbje.
együttműködők: GameObject
attribútumok
Név |
Típus |
Leírás |
data |
Sound[] |
Sound tömb az adatok tárolásáta. |
number |
int |
Éppen hány elemet tárol. |
operációk
Név |
Argumentumok |
Működése, feladata |
playIndex |
int |
Megadott sorszámú elemet lejátsza. |
add |
Sound |
Új Sound-ot ad a listához. |
setVolume |
double, int |
Adott sorszámú elem hangerejét beállítja. |
getNumber |
|
Hány elemet tárol. |
felelőssége, feladata: Music objektumokat foglalja egységbe, itt tároljuk a játék során megszólaló zenéket.
együttműködők: Game
attribútumok (a Sprite attribútimain kívül)
Név |
Típus |
Leírás |
data |
Music[] |
A játszandó zenék tömbje. |
number |
int |
Hány elemet tárol. |
actual |
int |
Éppen melyiket játssza. |
operációk
Név |
Argumentumok |
Működése, feladata |
add |
Music |
Új elemet ad a listához. |
playIndex |
int |
Adott számú elem lejátszása. |
playNext |
|
Listában következő elem lejátszása. |
getNumber |
|
Hány elem van a listában. |
getActual |
|
Éppen melyiket játssza le. |
stop |
|
Aktuálisan lejátszott leállítása. |
ended |
|
Music hívja meg, ha véget ért. Ez majd meghívja a playNext()-et. |
Az alrendszer legfontosabb feladata a menü, és menüelemek lekezelése. A Menu osztály fogja össze a szerteágazó rendszert, ezért van kvázi csillagtopológia. Kapcsolata van a játék főmenüjével, és a játék közbeni elemekkel is.Az irányításért felelős osztályok attól függően vannak jelen, hogy éppen milyen GameObject van kijelölve, aktív állapotban. A MiniMap osztály a Game osztályhoz kapcsolódik, azon keresztül valósítja meg a navigálási funkciókat. A többrésztvevős játék nélkülözhetetlen kelléke, a ChatBox is a Game osztályon keresztül éri el a nekü szükséges hálózati funkciókat a beszélgetéshez.
A MainMenu-ből elérhető funkciókat hozzá kötődő további osztályok valósítják meg, ezek például a SubMenuNewgame és a SubMenuSetup. A főmenüből az új játék kiválasztásánál a SubMenuNewgame-en továbbhaladva tudjuk elérni a SubSinglegame egyjátékos és SubMultigame többjátékos menüpontokat.
A beállításokért felelős SubMenuSetup osztály beállítási lehetőségeket részben maga biztosítja részben pedig a szerteágazó audiovizuális entitások megválasztásáért felelős SubMenuVideo és SubMenuAudio osztályok. A megadott beállítások metódusokon keresztül az Options osztályban érhetők el.
A menük közötti navigáláshoz számon tartjuk a kiválasztott menüpontokat.A nem kifejezetten tradícionális menü osztály, a MiniMap tartalmaz koordináták tárolására szolgáló adattagokat, amivel teljes térkép egy pontját jelöli. A kis térképen a nagynak az a részlete fog megjelenni.Tartalmaz mellette scale tagot, amiben a nagyítás arányát tárolja.
A ChatBox szöveget tárol, ez lehet a játékos által bevitt szöveg is, de lehet a hálózaton keresztül érkezett is.Az időbeliségtől függ.
Mint beállítás tároló osztály szerepet kap az Options. A beállítások menüből a felhasználó megadott paramétereit erre képzi le.
Az Objcet osztályból származtathatók a közös tulajdonságok. Alapvetően mindegyik hasonlít egymásra.
A felhasználó menübelépésének, majd kilépésének sematikus modelljét az alábbi szekvencia diagram mutatja be:
8. ábra. Felhasználó menübe lépése, kilépése
Az alábbi ábra szemlélteti a hangkártya kiválasztásának lépéseit:
9. ábra. Hangkártya kiválasztásának lépései
Szekvencia diagram a hangeffektek megválasztásának lépéseit mutatja be:
10. ábra. Hangeffektek megválasztásának a lépései
A felhasználó lépései a hengerő beállításához:
11. ábra. Felhasználó lépései a hangerő beállításához
Az automatikus beállítást kiválasztva a felhasználó hardware elemeihez igazítja a játék teljesítménybeli paramétereit. Ennek elérését jelöli a diagram:
12. ábra. Automatikus beállítás
Lehetőség van internetes frissítésre, azaz központi szerverünkön elérhető újabb verziókat egyszerűen elérhető, könnyen kezelhető lépéseken keresztül lehet elvégezni, a lezajló folyamatot jelöli a következő kép:
13. ábra. Internetes frissítés
Billentyűzet többféle kiosztása közül válogathat a felhasználó, ennek szemléltetése a következő:
14. ábra. Billentyűzet kiosztás választása
A nyelv beállításának folyamata:
15. ábra. A nyelv beállításának folyamata
Hálózati paraméterek megadásának lépése:
16. ábra. Hálózati paraméterek megadásának lépése
A megjelenítéshez szükséges videókártya kiválasztása érhető el az alábbi rajz szerint:
17. ábra. A megjelenítéshez szükséges videókártya kiválasztása
A teljesítmény szempontjából fontos tényező manuális megadása a grafikai minőségnek:
18. ábra. A teljesítmény szempontjából fontos tényező manuális megadása a grafikai minőségnek
A felhasználónak lehetősége nyílik egymás után több beállítás elvégzésére, anélkül hogy visszalépne a főmenübe:
19. ábra. Egymás után több beállítás elvégzése
A játék irányításának, kezelésének feladatai két részre bonthatók: egyik része szükséges a játék vezérléséhez, figurák irányításához, másik részének feladatköre pedig ennek a környezetnek a felkonfigurálása, személyre - hardwarere szabása.
A kezelőfelület tulajdonképpen a játékmotor nyújtotta lehetőségek palettáját teszi a felhasználó elé, így szoros együttműködés szükséges a Game és a GameObject osztályokkal.
A főmenüt megvalósító MainMenu osztály tartalmaz a menü elemeinek elérését kiváltó operációkat. Az almenüpontokban elérhető funkciók szintén hasonló struktúrában épülnek fel. A beállítások műveletei értékeket változtatnak meg az Optionsban.
A MiniMap rendelkezik görgetés és közelítés-távolítás funkciókkal.
20. ábra. Kezelőfelület alrendszer osztálydiagramja
felelőssége, feladata: a játék többjátékos módban indítása
együttműködők: Game, SubMenuNewGame
attribútumok: nincs
operációk
Név |
Argumentumok |
Működése, feladata |
SelectLangame |
nincs |
belső hálózati játék indítása |
SelectInternetGame |
nincs |
internetes játék indítása |
felelőssége, feladata: a játék egyjátékos módban indítása
együttműködők: Game, SubMenuNewGame
attribútumok : nincs
operációk
Név |
Argumentumok |
Működése, feladata |
SelectCampagne |
nincs |
kampány indítása |
SelectGamelevel |
nincs |
nehézségi szint beállítása |
SelectQuest | nincs | egy pályás játék indítása |
felelőssége, feladata: a új játék módjának kiválasztása
együttműködők: MainMenu
attribútumok : nincs
operációk
Név |
Argumentumok |
Működése, feladata |
SelectSingelplayer |
nincs |
egyjátékos mód |
SelectMultiplayer |
nincs |
többjátékos mód |
felelőssége, feladata: a játék beállításainak beállítása
együttműködők: MainMenu, SubMenuVideo, SubMenuAudio, Options
attribútumok : nincs
operációk
Név |
Argumentumok |
Működése, feladata |
SelectAutodetect |
nincs |
automatikus paraméterezés a hardwarehez |
SelectKeyboard |
nincs |
billentyűzetkiosztás beállítása |
SelectSound | nincs | hangtulajdonságok almenü behívása |
SelectVideo | nincs | grafikai tulajdonságok almenü behívása |
SelectNetwork | nincs | hálózat típúsának beálítása |
SelectLanguage | nincs | nyelv kiválasztása |
SelectAutoupdate | nincs | játék automatikus frissítése |
felelőssége, feladata: a játék grafikai paramétereinek beállítása
együttműködők: SubMenuSetup, Options
attribútumok : nincs
operációk
Név |
Argumentumok |
Működése, feladata |
SetResolution |
nincs |
felbontás beállítása |
SetAdapter |
nincs |
videókártya kiválasztása |
SetColordepth | nincs | színmélység beállítása |
SetQuality | nincs | minőség beállítása |
felelőssége, feladata: a játék audio paramétereinek beállítása
együttműködők: SubMenuSetup, Options
attribútumok : nincs
operációk
Név |
Argumentumok |
Működése, feladata |
SetVolume |
nincs |
hangerő megadás |
SetAdapter |
nincs |
hangkártya megadása |
SetEffects | nincs | hangeffektusok beállítása |
felelőssége, feladata: a játék főmenüjének megvalósítása
együttműködők: Game, SubMenuNewGame, SubMenuSetup, Menu
attribútumok
Név |
Típus |
Leírás |
Selected |
|
kiválasztott elem tárolása |
operációk
Név |
Argumentumok |
Működése, feladata |
SelectLoad |
nincs |
elmentett játék betöltése |
SelectTutorial |
nincs |
bemutató, tanulójáték |
SelectNewgame | nincs | új játék almenü behívása |
SelectSetup | nincs | beállítások almenü |
SelectCredits | nincs | készítők bemutatása |
SelectExit | nincs | kilépés a játékból |
felelőssége, feladata: a játék menürendszerének elérése
együttműködők: Game, MainMenu, InGameMenu, GameObjectWorkerMenu, GameObjectBuildMenu, GameObjectUnitMenu
attribútumok : nincs
operációk
Név |
Argumentumok |
Működése, feladata |
Select |
nincs |
menüelem kiválasztása |
EntityDraw |
nincs |
menüelem kirajzolása |
felelőssége, feladata: a játék közbeni menü
együttműködők: Game, Menu
attribútumok
Név |
Típus |
Leírás |
Selected |
|
kiválasztott menüelem |
operációk
Név |
Argumentumok |
Működése, feladata |
SelectSave |
nincs |
játákállás mentése |
SelectLoad |
nincs |
játékállás betöltése |
SelectSetup | nincs | beállítások menü |
SelectRestart | nincs | újrakezdés |
SelectExit | nincs | kilépés a főmenübe |
felelőssége, feladata: a kiválaszott munkás egység funkcióinak elérése
együttműködők: Game, Menu, IGameMenu
attribútumok : nincs
operációk
Név |
Argumentumok |
Működése, feladata |
SelectRepair |
nincs |
javítás |
SelectBuild |
nincs |
építés |
SelectMove | nincs | mozgatás, "menj oda" |
felelőssége, feladata: a épület kiválasztásakori menü
együttműködők: Game, Menu, IGameMenu
attribútumok
Név |
Típus |
Leírás |
Productable |
|
az adott épületben milyen egységet lehet termelni |
operációk
Név |
Argumentumok |
Működése, feladata |
SelectNewunit |
nincs |
új egység termelése |
SelectResearch |
nincs |
fejlesztés, kutatás |
SelectEmpty | nincs | kiürítés |
SelectAttack | nincs | támadás ( ha képes rá ) |
felelőssége, feladata: a katonák, egységek funkcióit teszi elérhetővé
együttműködők: Game, Menu, IGameMenu
attribútumok : nincs
operációk
Név |
Argumentumok |
Működése, feladata |
SelectMove |
nincs |
mozgatás, "menj oda" |
SelectAttack |
nincs |
támadás |
SelectStop | nincs | aktuális tevékenység felfüggesztése |
SelectWatch | nincs | védekezés, figyelés |
felelőssége, feladata: a többjátékosmódban a játékosok kommunikációja
együttműködők: Game
attribútumok
Név |
Típus |
Leírás |
TextMessage |
szöveges |
küldött vagy fogadott üzenetet tartalmazza |
operációk
Név |
Argumentumok |
Működése, feladata |
MessageInput |
nincs |
szöveg beadása, elküldése a többi játékosnak |
MessageOutput |
nincs |
szöveg fogadása, kiírása |
felelőssége, feladata: a játék közbeni navigáció segítése, görgetés
együttműködők: Game, Map
attribútumok
Név |
Típus |
Leírás |
Coordinate |
|
mutatott koordináta a nagytérképhez képest |
Scale |
|
nagyítottság |
operációk
Név |
Argumentumok |
Működése, feladata |
Scroll |
nincs |
görgetés |
Zoom |
nincs |
nagyítás |
A játékmotor alrendszer Game osztálya az alkalmazás központi osztálya, így szinte az összes osztállyal valamilyen kapcsolatban áll. Tartozik hozzá legalább egy Player objektum, amely a játékosokat és a gépi ellenfeleket reprezentálja. A kapcsolatban a Player objektum a játékos, a Game objektum meg magának a játéknak a szerepét tölti be. Az összes játékbeli objektumot a GameObject osztály valósítja meg, a Game objektumhoz kapcsolódnak azok a GameObject példányok, amelyek az aktuális játékban szerepelnek, így egységesen lehet kezelni őket. A GameObject objektum a kapcsolatban a szereplő, tetszőleges számú részt vehet a kapcsolatban, míg a Game objektum a játék szerepét tölti be. Minden játékhoz tartozik egy térkép, amely az aktuális pályát reprezentálja, ezt valósítja meg a Map osztály a Game objektumhoz való kapcsolódása révén.
Egyéb alrendszerek osztályai is kapcsolódnak a központi Game objektumhoz, ezeknek a kapcsolatoknak a részletezése a megfelelő alrendszernél található. A Game osztály egyéb kapcsolatai: Menu, Options, Log, GameServer, GameClient.
A Player osztály, melyen keresztül a játékot irányító szubjektum bekapcsolódik a játékba, a Game osztállyal áll kapcsolatban. Mivel egy játékot legalább 2 felhasználó játszik, ezért a Player osztálynak legalább 2 példányának kell a játék fő osztályának objektumához kapcsolódni.
A Game osztály az alkalmazás központi osztálya, így számos attribútummal kell rendelkeznie. Mivel szinte az összes osztályhoz kapcsolódik, így ezeket a kapcsolatokat nyílván kell tartani attribútumokon keresztül. Szükséges lehet a játék kezdetét egy attribútumban tárolni, így biztosítva a lehetőséget az időlimites játékokra. Bizonyos játéktípusoknál egy adott pontszámot elérő játékos nyer, ezt a pontszámot tartjuk nyilván egy külön attribútumban. A játék végét jelzi majd a gameEnded logikai attribútum. Nyílván kell tartani, hogy összesen hány egység helyezkedik el a játéktéren, mivel maximális számuk limitálva van, erre szolgál a roomAvailable attribútum.
A GameObject osztály az összes játékbeli objektum őse, így a közös tulajdonságokat tartalmazza. Ezek a következők: életerő, támadóerő, páncélzat, pozíció, látótávolság, fejlettségi szint, képesség a támadásra. Egy logikai típusú attribútum fogja mutatni, hogy az objektumot a felhasználó kijelölte. Ezenkívül a kapcsolódó osztályokat is nyilván kell majd tartani. Ilyenek a Listener, Sound, ObjectSprite objektumpéldányok.
A Building osztály reprezentálja az épületeket a játékban, ezek speciális típusai a GameObject osztálynak. Jellemzőjük, hogy pozíciójukat nem tudják megváltoztatani, így a pozíció attribútum itt konstansként szerepel. Ezenkívül rendelkeznek még egy egész típusú attribútummal, amely az épületben tartózkodó egységek számát adja, illetve egy másik egész attribútum az éppen gyártott egységek számát tartalmazza. Vannak olyan épületek is a játékban, amelyeket nem lehet lerombolni, ennek a tulajdonságnak a rögzitésére egy logikai attribútumot alkalmazunk.
A Unit osztály reprezentálja az egységeket a játékban. További leszármazottai lehetnek, amelyek a speciális típusú egységeket valósítják meg, új attribútumokat bevezetve. Attribútumai: objektum állapotának nyilvántartására (támad, védekezik, őrjáratozik, mozog) egy, valamint az egység sebességét meghatározó attribútum.
A Map osztály a játékhoz tartozó aktuális pályát tartalmazza. A térképet négyzet alakú építőelemekből építjük fel, minden egyes elemet nyílván kell tartani a Map osztályon belül, ehhez egy kétdimenziós tömböt fogunk alkalmazni, amely az osztály attribútuma lesz. Lesznek pozíció attribútumok is, amelyek a pálya látható területét adják meg. Ezenkívül egy kétdimenziós tömb attribútum fogja tárolni, hogy az egyes térképpozíciókban milyen objektumok helyezkednek el.
A Player osztálynak kell tartalmazni minden olyan paramétert, amellyel egy játékban résztvevő szubjektum rendelkezhet. Ilyen lehet a játékos neve, hozzá tartozó pénzösszeg stb. Ezen kívül ennek az osztálynak a feladata tárolni a játékos szubjektum által kért műveletek listáját. Ezeket fogja továbbítani a Game osztálynak.
Több helyen is lehetőség van bázisosztályok létrehozására az alrendszeren belül. Tekintve az AIPlayer és a HumanPlayer objektumokat, felfedezhetőek közös vonások, amelyek általában jellemzőek egy játékosra, függetlenül attól, hogy az éppen gépi, vagy emberi játékos. Ilyenek például a hozzá tartozó egységek, a játékos neve, különböző erőforrások mennyisége stb. Ezek a közös jellemzők kiemelhetőek egy Player bázisosztályba.
A másik lehetőség a Building és a Unit osztályok esetében adódik. Az egyik az épületek, a másik az egységek reprezentálására szolgál. Mindkettő rendelkezik közös tulajdonságokkal, pl. életerő, páncélzat, támadóerő stb. Ezeket kiemelve egy közös bázisosztályba egy másik nagy előnyhöz is jutunk. GameObject ősosztály referenciákon keresztül eltudjuk majd érni az összes játékon belüli objektumot, amely megkönnyíti a kezelésüket.
A játékot ember és gép egyaránt játszhatja, ezért elkerülhetetlen különböző osztályba szeparálni őket. De mivel jópár ugyanolyan tulajdonsággal rendelkezik mindkettőjük (név,pénz) kézenfekvő ezeket egy egységes Player nevű bázisosztályból származtatni.
Az alrendszer legfontosabb feladata a játékban szereplő objektumok kezelése, frissítése. Ezt a frissítést egy külön operáció fogja megvalósítani a Game osztályon belül, amelynek forgatókönyve, legfontosabb lépései a következők:
Azért választottuk ezt a sorrendet, mert így a felhasználói inputok lekezélese mindig a feldolgozás elején történik, így a válaszidők megfelelőek lesznek.
A következő szekvencia diagram mutatja az objektum kezelési műveleteket egy adott példaobjektum esetén:
21. ábra. Objektumkezelés szekvencia diagramja
A játékos kijelölhet objektumokat a játéktéren, amely hatására az adott GameObject objektum kijelölést jelző attribútuma igaz értéket fog felvenni.
A játékos megszüntetheti az objektum kijelölését, ilyen a megfelelő GameObject objektum kijelölést jelző attribútuma hamis értéket fog felvenni.
A katonai egységeket alapvetően négyféle műveletre lehet utasítani: támadás, védekezés, mozgás, őrjárat. A különböző műveleteket a felhasználó kattintással, illetve a megfelelő billentyűkombináció lenyomásával érheti el, ilyenkor a megfelelő Unit objektum állapotjelző attribútuma a megfelelő értéket veszi fel, és meghívódik a végrehajtó metódus.
Hasonlóan a katonai egységekhez meghívódik a megfelelő metódus, és az állapotjelző attribútum is felveszi az aktuális értékét.
Az épületek több különböző funkcióval rendelkeznek, ezek a következők: új egység létrehozása, fejlesztés, kiürítés, támadás (opcionális). Új egység létrehozásánál a megfelelő nyersanyag mennyiség rendelkezésre állása esetén, valamint ha az adott játékos tud még új egységet létrehozni, akkor az adott épület a megfelelő metódus hívásával példányosít egy új Unit objektumot. A fejlesztés szintén erőforrás igényes művelet, és szintén egy metódushíváson keresztül valósul meg. Az épületben tartózkodó egységek rendelkeznek egy sorszámmal, ezen keresztül lehet őket kiküldeni az épületből a kiürítést végző metódus meghívásával.
Új egység létrehozásának szekvencia diagramja:
22. ábra. Új egység létrehozása
Mivel minden egyes objektum típus a GameObject-ből származik, így az általános tulajdonságokon túl rendelkezhet speciális tulajdonságokkal, tevékenységekkel is. Ezeket a tevékenységeket a speciális osztályokban lehet definiálni.
A csapatok kezelésénél három alapvető művelet van: összevonás, szétbontás, formáció. A kijelölt objektumcsoportot a játékos összevonhatja egy csapatba, ilyenkor az adott játékos csapattáblájába az adott sorszámú csapathoz bekerülnek az objektumok. Szétbontásnál törlődik a csapattábla bejegyzése. Formációba rendeződésnél az előre elkészített formációk egyikét veszik fel az egységek, aminek a hatására megváltoztatják a pozíciójukat, amennyiben ez lehetséges.
Az egyes objektumok tulajdonságait megjeleníti az alkalmazás az információs panelen, amikor az adott objektum aktív. Ezt egy külön metódus valósítja meg.
A térképkezelés alapvetően a Map objektum látható tartományának változtatásán alapul. Mind a három térképkezelési lehetőségnél (minimap, scrollozás, pozícionálás) a Map objektum látható tartományának a határát állítja a program a megfelelő operációkkal.
23. ábra. AIPlayer osztály működése
24. ábra. HumanPlayer osztály működése
25. ábra. Game osztály állapotdiagramja
26. ábra. GameObject osztály állapotdiagramja
A játék alrendszer kezeli az összes játékban résztvevő objektumot, a térképet és a játékosokat. Legfontosabb feladata az objektumok ciklikus frissítése, amelynek feldolgozási lépéseit már ismertette a dokumentum az előző pontokban.
A központi Game osztály elsősorban a játék állapotára vonatkozó információkat tartalmaz, a többi funkciót a kapcsolódó egyéb osztályok biztosítják. Ennek megfelelően a Game osztály operációi is állapotok lekérdezésére, illetve azok beállításara szolgálnak. Biztosítani kell, hogy a játék végét jelző attribútum értékét le tudjuk kérdezni, illetve módosítani tudjuk, ugyanis ezek adják a vezérlés alapját. Tehát ezen funkcióknak külön operációk felelnek majd meg. A létrehozható objektumok számának kezeléséhez is szükségesek különböző beállító és lekérdező operációk. A Game osztály legfontosabb operációja a játék ciklus kezeléséért felelős, ami az egész alkalmazás mozgató rugója. Működésének lényege a 7.2.1. pontban található.
A GameObject osztály operációinak nagy része a tulajdonság értékek beállítására és lekérdezésére szolgál. Ezenkívül tartalmaz egy kirajzoló operációt, amely az objektum helyzetének megfelelően kirajzolja azt a képernyőre. Másik fontos operáció az objektum animálására szolgál. Meg kell tudni jeleníteni az objektumok tulajdonságait is, erre egy külön operáció fog szolgálni.
A Building osztály a GameObject operációin kívül rendelkezik új egységek gyártását végző, fejlesztő, valamint az épületben tartózkodó egységek kiküldésére szolgáló operációkkal.
A Unit osztály a GameObject operáción kívül rendelkezik az egység mozgatására szolgáló operációval, mivel ezek az objektum típusok mozogni is képesek. Ezenkívül szükséges a támadást, védekezést, őrjáratozást végrehajtó operációk is.
A Map objektumok inicializálása történhet fájlból, illetve generálható véletlen térkép is, ennek megfelelően ehhez a két funkcióhoz külön operációk szükségesek. Nyílván kell még tartani, hogy az egyes térkép pozíciókban milyen objektumok tartózkodnak, ehhez szintén külön operáció társul.
A Player osztály attól függetlenül, hogy játékos vagy mesterséges intelligencia irányítja azt, végtelen ciklusban vizsgálja, hogy érkezett-e végrehajtandó utasítás. Ha érkezett a processMessages metódussal adja azokat át a Game osztálynal végrehajtásra. (A checkForMessages metódus ellenőrzi, hogy van-e ilyen) Ezeket az üzeneteket a játékos és a mesterséges intelligencia különböző módon állítja elő. Az utóbbiakat a makeStrategicDecision és makeAttackDecision metódusok meghívásával hajtja végre a mesterséges intelligencia. Ezeket a loopAI végtelen ciklus ismétli meg időről időre. A HumanPlayer osztály szintén végtelen ciklusban figyeli, a felhasználó utasításait.
27. ábra. Játékmotor alrendszer osztálydiagramja
felelőssége, feladata: a játék központi osztálya, az egész alkalmazás vézérléséért felelős.
együttműködők: GameServer, GameClient, Menu, Options, Log, Map, GameObject, Player
attribútumok
Név |
Típus |
Leírás |
gameStart |
Date |
A játék kezdetét tároló attribútum. |
gameEnded | boolean | Jelzi a játék végét. |
roomAvailable | int | Hány darab egység helyezhető még el a játékon belül. |
score |
int |
Azon pontszám, amely elérése esetén valamelyik játékos nyer. |
operációk
Név |
Argumentumok |
Működése, feladata |
isGameEnded | nincs | Megadja a játék végét jelző flag értékét. |
setGameEnded | ended:boolean | Beállítja a játék végét jelző flag-et. |
getRoomAvailable | nincs | Visszaadja, hogy mennyi egységet lehet még elhelyezni a pályán. |
setRoomAvailable | roomAvailable:int | Beállítja a roomAvailable attribútum értékét. |
step |
nincs |
A játékban bekövetkező változások lekezeléséért felelős operáció. |
felelőssége, feladata: a játékban található objektumok kezelésére szolgál. A minden objektumra közösen jellemző attribútumokat és operációkat tartalmazza.
együttműködők: Game, Listener, Sound, ObjectSprite
attribútumok
Név |
Típus |
Leírás |
hitPoints |
int |
Adott objektum életerő pontjainak száma. |
attackPoints |
int |
Adott objektum támadó ereje. |
defensePoints |
int |
Adott objektum védekező ereje. |
level | int | Adott objektum fejlettségi szintje |
range | int | Látótávolság. |
posX | int | Objektum pozíciójának x koordinátája a térképen. |
posY | int | Objektum pozíciójának y koordinátája a térképen. |
selected | boolean | Ki van-e jelölve az objektum. |
canAttack | boolean | Tud-e támadni az adott objektum. |
operációk
Név |
Argumentumok |
Működése, feladata |
draw |
nincs |
Objektum kirajzolása Sprite-okon keresztül. |
animate |
nincs |
Aktuális helyzetnek, műveletnek megfelelő animálás. |
getPosX |
nincs |
Pozíció x koordináját adja vissza. |
setPosX | posX:int | Pozíció x koordináját állítja be. |
getPosY |
nincs |
Pozíció y koordináját adja vissza. |
setPosY | posY:int | Pozíció y koordináját állítja be. |
canAttack | nincs | Visszaadja, hogy az adott objektum tud-e támadni. |
getHitPoints |
nincs |
Megadja az objektum életerejét. |
setHitPoints | hitPoints:int | Beállítja az objektum életerejét. |
getAttackPoints |
nincs |
Megadja az objektum támadó erejét. |
setAttackPoints | attackPoints:int | Beállítja az objektum támadó erejét. |
getDefensePoints |
nincs |
Megadja az objektum védekező erejét. |
setDefensePoints | defensePoints:int | Beállítja az objektum védekező erejét. |
isSelected | nincs | Visszadja, hogy az adott objektum ki van-e jelölve. |
select | nincs | Kijelöli az adott objektumot. |
showProperties | nincs | Objektum tulajdonságait mutatja meg. |
getRange |
nincs |
Megadja az objektum látótávolságát. |
setRange | range:int | Beállítja az objektum látótávolságát. |
felelőssége, feladata: A játékon belüli épületeket reprezentáló osztály, a GameObject osztály leszármazottja, amelyet az épületekre jellemző speciális attribútumokkal és operációkkal egészit ki. Ebből származtathatóak le a speciális épület tipusok.
együttműködők: GameObject
attribútumok
Név |
Típus |
Leírás |
isDestructible |
boolean |
Megadja, hogy az adott épület lerombolható-e. |
unitsIn |
int |
Megadja, hogy éppen mennyi egység található az épületben. |
trainCapacity |
int |
Maximum hány egységet képes a gyártási előjegyzésbe felvenni. |
operációk
Név |
Argumentumok |
Működése, feladata |
train |
type:int |
Adott tipusú egység gyártását hajtja végre. |
deploy |
index:int |
A bent tartózkodó egységek közül a megadott sorszámút kiküldi az épületből. |
upgrade |
nincs |
Fejleszti az épületet egy szinttel. Bizonyos erőforrások szükségesek hozzá. |
felelőssége, feladata: A játékon belüli egységeket reprezentáló osztály, a GameObject osztály leszármazottja, amelyet az egységekre jellemző speciális attribútumokkal és operációkkal egészit ki. Ebből származtathatóak le a speciális egység tipusok.
együttműködők: GameObject
attribútumok
Név |
Típus |
Leírás |
state | int | Az egység állapotát megadó adattag, használható konstansok: |
speed |
int |
Az egység mozgási sebessége. |
operációk
Név |
Argumentumok |
Működése, feladata |
getState | nincs | Visszaadja az egység aktuális állapotát. Használható konstansok a state attribútum leirásánál találhatóak. |
move |
destX:int, destY:int |
Megpróbálja az egységet a megadott helyre mozgatni. |
attack |
target:GameObject |
Adott GameObject objektum megtamadasa |
defend | nincs | Védekező üzemmódba állitja az egységet. |
patrol |
nincs |
Őrjárat üzemmódba állitja az egységet. |
felelőssége, feladata: A térkép reprezentálására szolgáló osztály.
együttműködők: Game, MapSprite
attribútumok
Név |
Típus |
Leírás |
visibleX | int | Látható terület bal fölső sarkának X koordinátája. |
visibleY | int | Látható terület bal fölső sarkának Y koordinátája. |
sprites |
MapSprite[][] |
A térképet alkotó MapSprite referenciák összesége. |
objects |
GameObject[][] |
Két dimenziós tömb, amely megadja, hogy a térkép adott poziciójú helyén éppen milyen objektum található. Null, ha nincs ott semmi. |
operációk
Név |
Argumentumok |
Működése, feladata |
getVisibleX | nincs | visibleX attribútum értékét adja vissza. |
setVisibleX | posX:int | visibleX attribútum értékét állitja be. |
getVisibleY | nincs | visibleY attribútum értékét adja vissza. |
setVisibleY | posY:int | visibleX attribútum értékét állitja be. |
loadMapFromFile | file:String | Adott fájlból tölti fel a sprites attribútumot. |
generateRandomMap | width:int, height:int | Véletlenszerű térképet generál. |
getObjectAtPosition |
posX:int, posY: int |
Visszaadja, hogy adott poziciójú helyen milyen objektum található aktuálisan. Null, ha nincs az adott helyen objektum. |
checkMoveDestination |
posX:int, posY: int, object:GameObject |
Visszadja, hogy az adott poziciójú hely megközelithető-e az objektum számára |
setGameObjectPosition |
posX:int, posY:int, object:GameObject |
Adott pozicióba bejegyzi a megadott objektumot. |
felelőssége, feladata: A játékot irányító szubjektum, ezen osztályon keresztül kapcsolódik be a játékba.
együttműködők: Game
attribútumok
Név | Típus | Leírás |
Name | String | A játékos neve. |
Money | int | A pénzösszeg, amellyel a játékos rendelkezik. A fűszer automatikusan pénzzé konvertálódik. |
MessageList | Message | A játékos által küldött parancsok listája. A rendszer ezeket fogja később lekezelni. |
Név | Argumentumok | Működése, feladata |
loop | nincs |
Végtelen ciklus. Ezen belül ellenőrzi van-e új lekezelendő parancs. |
checkForMessage | nincs | Igaz értékkel tér vissza, ha van lekezeletlen parancs |
processMessages | nincs | Feldolgozásra kerülnek a parancsok, továbbítja a Game osztálynak. |
felelőssége, feladata: A Player leszármazottja, a felhasználók ezen keresztül vehetnek részt a játékban.
együttműködők: Player
operációk
Név | Argumentumok | Működése, feladata |
loopHuman | nincs |
Végtelen ciklus. Ezen belül ellenőrzi van-e új lekezelendő parancs. |
checkForUserMessage | nincs | Igaz értékkel tér vissza, ha van lekezeletlen felhasználói parancs |
felelőssége, feladata: A számítógépes ellenfél ezen keresztül valósul meg és cselekszik.
együttműködők: Player
attribútumok
Név | Típus | Leírás |
Difficulty | int | A számítógépes ellenfél erősségét írja le (1-5) |
Név | Argumentumok | Működése, feladata |
makeStrategicDecision | nincs |
Stratégiai döntéseket, hoz és ad hozzá a MessageList-hez. |
makeAttackDecision | nincs |
Támadással kapcsolatos döntéseket hoz, ezeket adja hozzá a MessageList-hez |
loopAI | nincs |
Végtelen ciklus. Ennek segítségével hívódnak meg újra és újra a döntéshozó metódusok. |
A hálózatkezelő alrendszer minden osztálya a központi Game objektummal van kapcsolatban. A program egy futó példánya működhet szerverként, illetve kliensként is. Ez a szerver funkció csak és kizárólag helyi hálózaton keresztüli játékra érvényes, a dedikált szerverek összetettségük folytán külön szoftverként valósulnak meg. Szerverként való működéskor a GameServer osztály egy példánya kapcsolódik a központi Game objektumhoz a "hálózat kiszolgáló" kapcsolaton keresztül. Ilyenkor a futó alkalmazás egyben szerver és egyben kliens is. A kapcsolatban a GameServer osztály a hálózatkezelő, míg a Game objektum a játék adatait szolgáltatja. Minden esetben kapcsolódik a Game objektumhoz egy GameClient objektum is a "hálózat" kapcsolaton keresztül. Itt a Game objektum megint csak a játék adatait szolgáltatja, míg a GameClient a kapcsolatot biztosítja a szerverrel.
A GameServer osztály legfontosabb attribútuma a hálózati socket kezelésére szolgál, amelyen a kliensek csatlakozási és egyéb kérelmeit fogadja. Rendelkezik még egy port attribútummal, amely azon port számát adja, amelyen a kérelmeket fogadja. Valamilyen módon nyílván kell tartani a kapcsolódott klienseket is, ez valamilyen tömb típusú attribútummal valósulhat meg. Szükséges még egy buffer attribútum, amely a hálózaton áthaladó adatok átmeneti tárolását szolgálja.
A GameClient osztály szintén rendelkezik egy socket attribútummal, ami a kapcsolatot biztosítja a szerverrel. A játékos azonosítása miatt rendelkezni fog egy név attribútummal. Szükséges még egy buffer attribútum, amely a hálózaton áthaladó adatok átmeneti tárolását szolgálja.
A GameServer osztályon belül szükséges a csatlakozott kliensekről különböző adatokat tárolni, így célszerű bevezetni egy ServerClient osztályt, amely egy csatlakozott kliens adatait tartalmazza. Így ServerClient objektumok tömbje lesz a GameServer osztály egy attribútuma.
A ServerClient osztály attribútumai a következők: kliens neve, csapat neve, amelyikhez tartozik, channel (csatorna), amelyen keresztül a kliens kommunikál.
A kezdeti osztálydiagram megfelelő osztályokat tartalmaz, nem lehetséges bázisosztályokat bevezetni.
Helyi hálózaton történő játék esetén az egyik játékos elvállalhatja a szerver szerepét. Ilyenkor a Game objektum adott metódusának segítségével létrehozunk egy GameServer objektumot, amely fogadja a csatlakozó kliensek kérelmeit, és szétosztja a megfelelő információt a kliensek között. A szerver létrehozása többnyire nem okozhat hibát, kivéve ha más program által használt portot jelöl ki a felhasználó, ebben az esetben ezt jelzi a szoftver. A szervert létrehozó játékos adja meg a játék típusát, a csatlakozható kliensek számát
A szoftver érzékeli az aktív szervereket, és listát ajánl fel azokról. Ezek közül a felhasználó kiválaszt egyet, és a GameClient objektum példány megfelelő metódusának segítségével megpróbál csatlakozni ahhoz. Sikeres csatlakozás esetén elkezdődhet a játék.
Az előző funkcióhoz hasonlóan itt is egy listát kap a felhasználó, ám az a dedikált szervereket sorolja fel. A csatlakozás itt is ugyanúgy történik.
28. ábra. GameServer osztály állapotdiagramja
29. ábra. GameClient osztály állapotdiagramja
A hálózat alrendszeren belül a GameServer osztály egy példánya kommunikál több GameClient példánnyal. A GameClient objektumok a megfelelő Game objektum kérésére kérelmeket küldhetnek a szervernek, amelyet a GameServer objektum reprezentál. A GameServer objektum figyeli, hogy melyik csatlakozott kliens felől érkezett kérés. Ha érkezett kérés, akkor ellenőrzi, hogy értelmes-e az üzenet. Ammenyiben igen, akkor a szerver válaszüzenetet generál, és azt elküldi a megfelelő klienseknek. Amennyiben nem értelmes az üzenet, akkor szerver egy hibaüzenetet küld vissza a kérelmező kliensnek. A kliensek is fogadnak üzeneteket a szervertől, amelyre üzenettípustól függő választevékenységet hajtanak végre.
Mindkét osztály folyamatos kapcsolatban áll a megfelelő Game objektummal, azon keresztül történik az adatok áramlása.
A GameServer osztálynak rendelkeznie kell egy futtató metódussal, amely elindítja a kapcsolódási és egyéb kérelmek beérkezésének figyelését. Mivel kérelmeket tud fogadni a kliensektől, és válaszokat küld nekik, ezért lesz egy üzenet fogadó és egy üzenet küldő operáció is. Nyilván kell tartani a csatlakozott klienseket is, így lesz kliens hozzáadása és kliens törlése operáció is. Ki kell tudni választani a nyilvántartott kliensek közül azt, amelyiknek a választ küldeni kell. Ez név alapján fog történni, erre külön operáció fog szolgálni.
A GameClient osztályon keresztül tudunk csatlakozni a szerverhez, így szükséges egy csatlakozás operáció. Szintén kell tudnia üzeneteket fogadni és küldeni, amelyeket egy-egy operáció valósít meg. Lehetőséget kell biztosítani a kliens nevének lekérdezésére és megváltoztatására.
A ServerClient osztály elsősorban adattárolási célból jött létre, így lekérdező és beállító operációkat kell megvalósítania.
30. ábra. Hálózati alrendszer osztálydiagramja
felelőssége, feladata: helyi hálózaton keresztüli játéknál valósítja meg a szerver funkciókat. Kezeli a kliensekkel folytatott hálózati forgalmat, feldolgozza a bejövő kérelmeket, és válaszüzeneteket küld szét.
együttműködők: Game, ServerClient
attribútumok
Név |
Típus |
Leírás |
serverSocket |
ServerSocket |
Azon socket, amelyen keresztül a kliensek a szerverhez kapcsolódhatnak. |
port |
int |
A port száma, amelyen keresztül a szerver kommunikál a kliensekkel. |
clients |
ServerClient[] |
A csatlakozott kliensek nyilvántartásához. |
buffer | byte[] | Átmeneti tároló a kérelmek feldolgozásához. |
operációk
Név |
Argumentumok |
Működése, feladata |
run |
nincs |
Elindítja a csatlakozási és egyéb kérelmek figyelését. |
readRequest |
|
Kérelem fogadása egy adott klienstől. |
sendResponse |
|
Válasz küldése egy adott kliensnek. |
felelőssége, feladata: a szerveren belül nyilván kell tartani a csatlakozott klienseket. Egy csatlakozott kliens reprezentálására szolgál ez az osztály.
együttműködők: GameServer
attribútumok
Név |
Típus |
Leírás |
name |
String |
A kliens felhasználói neve. |
team |
String |
Csapat neve, amelyikhez a kliens tartozik. |
channel |
SocketChannel |
A csatorna, amelyiken keresztül a klienssel kommunikál a szerver. |
operációk
Név |
Argumentumok |
Működése, feladata |
getName |
nincs |
Visszaadja a kliens nevét. |
setName |
name |
Beállítja a kliens nevét. |
setTeam | team | A kliens csapatát változtatja meg. |
getTeam |
nincs |
Lekérdezi a kliens csapatát. |
felelőssége, feladata: Hálózatkezelést valósítja meg a kliens oldalon, gondoskodik a szerverrel történő üzenetváltások lebonyolításáról.
együttműködők: Game
attribútumok
Név |
Típus |
Leírás |
socket |
Socket |
Ezen a socket-en keresztül kommunikál a szerverrel a kliens. |
name |
String |
A játékos felhasználói neve. |
buffer |
byte[] |
Átmeneti tároló az üzenetek feldolgozásához. |
operációk
Név |
Argumentumok |
Működése, feladata |
connect |
ip, port |
Csatlakozás a megadott szerverhez. |
readMessage |
nincs |
Szerver üzenet olvasása. |
sendMessage | message | Üzenet küldése a szervernek. |
getName | nincs | Kliens azonosító nevének lekérdezése. |
setName |
name |
Kliens azonosító nevének beállítása. |
A Naplózás alrendszer feladata, tárolni a végrehajtott módosításokat. Ezeknek a módosításoknak a leírásait a Log osztály a játék fő osztályától a Game-től kapja. Mindkét osztálynak csak egy példánya van jelen egy időben ezért 1-1 kapcsolat van közöttük. A Log osztály tartalmaz még egy ún. Note osztályt, ez tárolja el a módoítások leírását, dátummal összekötve. Egy Log típusú objektumhoz tetszőleges számú Note példány tartozhat.
Log osztály: Mivel a naplózott adatok végül egy logfileba kerülnek
bele, tartalamaznia kell egy File referenciát.
Note osztály: A Note
osztály objektumjai tárolják el a naplózott eseményeket és a hozzá tartozó
dátumot, ezért tartalmaznia kell egy Stringet az esemény leírásával és egy Date
típusú objektumot.
31. ábra. Log osztály működése
A Naplózás alrendszer feladata, nyílvántartani a végrehajtott
módosításokat. Ezek AddNote és AddEvent metódusok segítségével
kerülnek eltárolásra. Szükség van még a logfile-t beállító (setLogFile) és
ezeket oda kiíró utasításokra is (writeOut).
32. ábra. Naplózás alrendszer osztálydiagramja
felelőssége, feladata: a program futása során keletkező adatmódosításokat naplózza, melyek segítségével könnyebbé válik a hibakeresés.
együttműködők: Game, Note
attribútumok
Név | Típus | Leírás |
LogFile | File | A log fájl File objektuma |
Név | Argumentumok | Működése, feladata |
addEvent |
String |
Esemény hozzáadása a log-hoz |
addNote |
Note |
Bejegyzés hozzáadása |
getNote |
nincs |
Tárolt bejegyzés lekérdezése |
setLogFile | File | A log fájl megadása |
writeOut | nincs | A bejegyzések log fájlba való kiírása |
felelőssége, feladata: eltárol egy bejegyzést, azaz egy módosítás illetve annak az idejét.
együttműködők: Log.
attribútumok
Név | Típus | Leírás |
Event | String | A végrehajtott módosítás leírása |
EventDate | Date | A módosítás ideje |
A projekt létrejöttének nélkülözhetetlen forrás irodalma:
Internetes oldalak: