Analízis modell kidolgozása I. 65 Konzulens: Zsolnai Károly Csapattagok Balogh Péter Tamás B6E4VC b4logh.peter@gmail.com Gál István László EKCBOK galpityu@gmail.com Kárász Gábor QHTQ8N raknepseg@gmail.com Simon Endre András HZK8DP ndrewka@gmail.com Szabó Alex PEONHQ delanni.alex@gmail.com
2 3. Analízis modell kidolgozása 3. Analízis modell kidolgozása 3.1 Objektum katalógus 3.1.1 Character A játékos által irányított pálcikaembert reprezentáló objektum, melyből pontosan egy létezik. Számon tartja, hogy melyik szinten van, melyik pályaelemben, milyen pozícióban és, hogy rendelkezik-e már a szint teljesítéséhez szükséges kulccsal. 3.1.2 Clock A megfelelő időzítésért felelős objektum. Feladata, hogy az események előre meghatározott sebességgel való végrehajtódásának ütemezést adjon. 3.1.3 Door Egy adott szint teljesítését ellenőrző objektum, melyből minden szinten pontosan egy darab található. Tartalmazza a pálya teljesítettségének ellenőrzéséhez szükséges logikát, valamint kommunikál a Game objektummal. Felelőssége hogy ha van kulcsunk, átengedjen minket a következő szintre, ütközés esetén. 3.1.4 Game A program alapobjektuma, mely közvetve vagy közvetlenül tartalmazza az összes a programban szereplő objektumot. Feladata, hogy a játék indításkor megalkossa a Clock objektumot, valamint külső fájlból beolvasott adatok alapján létrehozza a pályákat (Level). 3.1.5 Key A Key felelőssége hogy kinyissa az ajtót, ha a játékos megszerezte(ütközött már vele). A kulcs megszerzése nélkül nem teljesíthetőek a pályák. Minden szinten pontosan egy darab található belőle. 3.1.6 Level Minden szinthez tartozik egy ilyen objektum. Feladata,hogy összefogja a hozzá tartozó pályaelemeket (LevelItem), valamint gondoskodjon a köztük zajló kommunikációról. Ezen felül tartalmazza a Karakter (Character) pályaelemeken (LevelItem) belüli és azok közti mozgatásának logikáját. 3.1.7 LevelItem Feladata a Karakter-nézet tényleges játékterének kialakítása, és a játékteret alkotó Spriteok egységbe foglalása és kezelése.
3 3. Analízis modell kidolgozása 3.1.8 Sprite A pályaelemeken (LevelItem) előforduló összes objektum közös interface, melyben ezek közös metódusai vannak definiálva, mint például az ütközésdetektálás. 3.1.9 SpriteFactory A Sprite interfész különböző leszármazottainak gyártásáért felelős. Egységbe foglalja az objektum gyártást, a polimorfizmus kezelését hivatott megkönnyíteni. 3.1.10 Wall A pályaelemeken (LevelItem) megjelenő áthatolhatatlan falakat és oszlopokat megvalósító virtuális építőkocka. Felelőssége hogy a játéktéren legyen, a rajta áthatoló charcter objektumot megállítsa. 3.2 Osztályok leírása 3.2.1 Character Név Felelősség Character A játékos által irányított osztály, felelőssége hogy az irányított objektumot valamilyen módon reprezentálja a világ számára (akár grafikusan, akár szövegesen, koordinátákkal). Ezzel kell a pályákon navigálni úgy, hogy megszerezzük a kulcsot és megoldjuk az adott pályát. Ősosztályok - Interfészek Sprite Attribútumok - position : Point3d - tárolja a karakter pontos helyét - haskey : Boolean - eltárolja, hogy a kulcs fel van-e véve - canmove : Boolean az aktuális pillanatban a játékos tud-e mozogni - movedir : int a mozgás irányát tárolja - game: Game a game objektumot tárolja Metódusok + Character(Point3d) - létrehozáskor beállítja a karakter pozícióját + reset() - a pálya újrakezdése + getposition() - a karakter pozíciójával tér vissza (interfészből) + getwidth() - a karakter szélességével tér vissza (interfészből) + getheight() a karakter magasságával tér vissza (interfészből) + checkhit(sprite) - az ütközésdetektálás megvalósítása (interfészből) + setposition(point3d) - beállítja a karakter pozícióját + gethaskey() - ellenőrzi, hogy a karakter felvette-e már a kulcsot + sethaskey() - beállítja a karakterhez a kulcsot, ha ütközött vele + resethaskey() - törli a karakter kulcsát + move( dir ) dir irányba mozgatja a karaktert + setcanmove() engedélyezi a játékos mozgását, egy adott óraütésre +Tick() az órától kapott óraütést ezen függvény meghívásával tudatosul
4 3. Analízis modell kidolgozása az objektumban 3.2.2 Clock Név Felelősség Clock A játék mozgatórugója. Adott idő eltelte után periodikusan eseményeket generál. Ezek az események eljutnak a játék résztvevőihez, és ezek alapján mozognak. Ősosztályok - Interfészek - Attribútumok - game : Game - tároljuk, metódushívások miatt - period : int - periódus számláló Metódusok + setperiod(int) - beállítja a periódus idejét + run() - elindítja az órát 3.2.3 Door Név Felelősség Door A szint végét jelző osztály. Ha a játékos eléri az ajtót, úgy hogy már birtokolja a kinyitásához szükséges kulcsot (Key), szintet léphet. Ősosztályok - Interfészek Sprite Attribútumok - position : Point3d - az ajtó pontos helye - character : Character - hogy tudjuk, van-e a karakternél kulcs - game : Game - tároljuk, metódushívások miatt Metódusok + Door(Point3d) - beállítja az ajtó pozícióját létrehozáskor + getposition() - az ajtó pozícióját adja vissza (interfészből) + getwidth() az ajtó szélességével tér vissza (interfészből) + getheight() az ajtó magasságával tér vissza (interfészből) + checkhit(sprite) - az ütközésdetektálás megvalósítása (interfészből)
5 3. Analízis modell kidolgozása 3.2.4 Game Név Felelősség Game A játék főbb mozzanataiért felelős osztály, pl Save Game, New Game, Load Game stb. Felelőssége továbbá hogy a Clocktól kapott óraütést eljuttassa az éppen erre váró objektumoknak. Ősosztályok - Interfészek - Attribútumok - clock : Clock - óra a játék eseményeinek generálásáért - level : ArrayList<Level> - láncolt lista a szintek tárolásához - character : Character - karakter, hogy nézetváltásnál eltároljuk - factory : SpriteFactory - a pályákon lévő sprite-ok létrehozásához - view : int - az aktuális nézetet tárolja Metódusok + Tick() - az óra által diktált ütemezést továbbítja a játék objektumainak + startgame() - új játék indítása + loadgame() - mentett játék betöltése + savegame() - az aktuális játék elmentése + nextlevel() - a következő pályára léptet + wingame() - a játékos nyer, ha nincs következő pálya + changeview(int) - nézet váltás a Pálya- és a Karakter-nézet között + getview() visszaadja, hogy épp melyik nézetben vagyunk + openmenu() - menü megnyitása + closemenu() - menü bezárása + showcredits() - megmutatja a készítőket + resetgame() - újrakezdi a játékot + move(int) a kívülről jövő mozgatás utasítások ezt a metódust hívják meg
6 3. Analízis modell kidolgozása 3.2.5 Key Név Felelősség Key A pályaelemen elhelyezett osztály. Felelőssége hogy kinyissa az ajtót, azaz engedélyezze az átjárást az ajtón keresztül, ha a játékos által irányított karakter már ütközött egy Key objektummal. Ősosztályok - Interfészek Sprite Attribútumok - position : Point3d - megadja a kulcs pontos helyét - visibility : Boolean - tárolja, hogy látható-e a kulcs - character : Character - metódushívások miatt tároljuk Metódusok + Key(Point3d) - létrehozáskor beállítja a kulcs pozícióját + getposition() - a kulcs pozíciójával tér vissza (interfészből) + getwidth() - a kulcs szélességével tér vissza (interfészből) + getheight() a kulcs magasságával tér vissza (interfészből) + checkhit(sprite) - az ütközésdetektálás megvalósítása (interfészből) + setinvisible() - beállítja a kulcs láthatatlanságát 3.2.6 Level Név Felelősség Level Felelőssége hogy az adott szinten egységbe foglalja a pályához tartozó pályaelemeket, számon tartsa, hogy éppen pályaelemeket irányítunk vagy a karakterrel mozgunk és a pálya végén új pályát indítson. Ősosztályok - Interfészek - Attribútumok - id : int - a pálya azonosítóját tárolja - levelitems : LevelItem[ ][ ] - a pályához tartozó pályaelemeket tárolja - activelevelitem : LevelItem - a pályaelemek közül az aktív pályaelem - EmptyItemPos_x : int - az üres pályaelem x koordinátája a pályán - EmptyItemPos_y : int - az üres pályaelem y koordinátája a pályán - character : Character - karakter, hogy nézetváltásnál eltároljuk Metódusok + getid() - a pálya azonosítójával tér vissza + moveemptyitem(int) - az üres pályaelem mozgatása + addlevelitem(levelitem) - pályaelem hozzáadása a pályához + addcharacter(charachter) a karakter hozzáadása a pályához + setactiveitem(levelitem) beállítja az aktív pályaelemet + getactiveitem() a jelenleg aktív pályaelemet adja vissza + Tick() az órától kapott óraütés ezt hívja meg közvetetten
7 3. Analízis modell kidolgozása 3.2.7 LevelItem Név Felelősség LevelItem Felelőssége a pályaelemek megvalósítása, a pályán előforduló spriteok egységbe foglalása. Szomszédos LevelItemekkel is kell kommunikálnia, hogy átjárható-e a két pályaelem közti rész. Ősosztályok - Interfészek - Attribútumok - pos_x : int - tárolja a pályaelem x koordinátáját a LevelItem[][]-ben - pos_y : int - tárolja a pályaelem y koordinátáját a LevelItem[][]-ben - id : int - a pályaelem azonosítója - sprites : List<Sprite> : pályelemen lévő spriteok tárolása Metódusok + checkneighbour(int) - megnézi, hogy dir irányban átjárhatóak-e a pályaelemek + getpos_x() - visszaadja a pályaelem x koordinátáját + getpos_y() - visszaadja a pályaelem y koordinátáját + move(int) - adott irányba mozgatja a pályaelemet + addsprite(sprite) - hozzáad egy Sprite-ot a pályaelemhez + intersectall() - megnézi hogy akrakter üzközik-e az pályán található Sprite-okkal + Tick() az órától kapott óraütést ezen függvény meghívásával tudatosul az objektumban + checkedges(point3d position, int dir) a játékos koordinátái, és a mozgásának iránya alapján ellenőrzi, hogy a karakter épp elhagyja-e a pályát, ha igen, ellenőrzi, hogy ez lehetséges-e ( LevelItemek illeszkedése alapján) 3.2.8 Sprite Név Felelősség Sprite A Wall, Character, Key, Door, azaz a pályaelemkre helyezhető osztályok közös interface-e. Így valósulhat meg a játékban a polimorfizmus. Az ezt megvalósító osztályok biztosan implementálják az ütközés detektálására felelős függvényt. Felelőssége tehát a polimorfizmus biztosítása és az ütközések detektálása. Ősosztályok - Metódusok + checkhit(sprite) - az ütközésdetektálás intrefésze + getposition() - a sprite pozíciójával + getwidth() - a sprite szélességével tér vissza + getheight() - visszatér a sprite magasságával
8 3. Analízis modell kidolgozása 3.2.9 SpriteFactory Név Felelősség SpriteFactory A SpriteFactory felelőssége hogy a közös Sprite őstől származó objektumokat egy egységes felületen keresztül hozhassuk létre. Interfészek Ősosztályok - Attribútumok - game : Game - kell, mert létrehoz olyan spriteokat, amik meghívják - character : Character - kell, mert létrehoz olyan spriteokat, amik meghívják Metódusok + creatsprite(int) - létrehoz egy adott típusú spriteot + SpriteFactory() - konstruktor + setgame(game) - beállítja a game attribútumot + setchar(character) - beállítja a character attribútumot 3.2.10 Wall Név Wall Felelősség Felelőssége a pályaelemeken a falak, a padló, oszlopok stb. megvalósítása. Lényegében a pályaelemekre helyezhető virtuális tégla, melynek mérete megadható. Ősosztályok - Interfészek Sprite Attribútumok - position : Point3d - megadja a falelem pontos helyét - width : int - tárolja a falelem szélességét - height : int - tárolja a falelem magasságát Metódusok + Wall(Point3d, int, int) - létrehozáskor beállítja a falelem pozícióját, szélességét és magasságát + getposition() - a falelem pozíciójával tér vissza (interfészből) + getwidth() - a falelem szélességével tér vissza (interfészből) + getheight() - visszatér a falelem magasságával (interfészből) + checkhit(sprite) - az ütközésdetektálás megvalósítása (interfészből)
9 3. Analízis modell kidolgozása 3.3 Statikus struktúra diagramok
10 3. Analízis modell kidolgozása 3.4 Szekvencia diagramok 3.4.1 Idő léptetése
11 3. Analízis modell kidolgozása 3.4.2 Játék indítása
12 3. Analízis modell kidolgozása 3.4.3 Játék bezárása
13 3. Analízis modell kidolgozása 3.4.4 Pályaelem és karakter irányítása
14 3. Analízis modell kidolgozása 3.4.5 Ütközésdetektálás
15 3. Analízis modell kidolgozása 3.4.6 A pálya vége
16 3. Analízis modell kidolgozása 3.4.7 A pálya széléhez ér a karakter 3.4.8 A pálya újrakezdése
17 3. Analízis modell kidolgozása 3.4.9 Kulcs felvétele 3.4.10 Nézet váltása
18 3. Analízis modell kidolgozása 3.5 State-chartok A játékhoz egyetlen state-chartot terveztünk, a nézetváltáshoz. Az, hogy a játékos miként látja az aktuális pályát, a játékban két állapotként jelenik meg. A game osztály view változója tárolja az éppen aktuális nézetet, a changeview() metódusa pedig a nézetek közti váltást valósítja meg. Az ide vonatkozó szekvencia diagram a 3.4.4. részben nézhető meg. Az állapotok közti átmenteket az alábbi diagrammal szemléltettük:
19 3. Analízis modell kidolgozása 3.6 Napló Tevékenység Időtartam Résztvevők Tevékenység leírása kezdete 2012. 02.21. 18:00 2 óra Balogh Gál Értekezlet, Martos Csocsó Klub Döntés: Kárász iteratív modellfejlesztés használata Simon Szabó fő objektumok nevének, szerepének tisztázása, első, nem részletes UML terv cél: egyszerűség, de a specifikáció teljes kielégítése 2012. 02.22. 17:00 1 óra Balogh Az első értekezleten készült tervek digitalizálása, megosztás a többiekkel 2012. 02. 23. 15:00 1 óra Simon Objektumok, az előző fejezetben készült Use-Casek és a leírás alapján lehetséges szekvencia diagramok meghatározása, megosztás a többiekkel. Ezek alapján a jegyzőkönyv vázának kitöltése. 2012. 02. 25. 12:00 1 óra Balogh 3.1 fejezet megírása 2012. 02. 25. 13:05 1 óra Simon 3.2 fejezet részleges megírása 2012. 02. 26. 15:35 1,5 óra Balogh Előzetes tervek alapján részletes static structure diagram készítés, a korábbi szekvencia diagramokat tartalmazó lista átnézése, a fontos esetek kiválogatása, a diagramok szóbeli leírása (time lineok, főbb mozzanatok) 2012. 02. 26. 17:00 7 óra Balogh Gál A rendelkezésre álló dokumentumok alapján online csapatmunka. Terv: Kárász Simon Szabó Simon készíti a szekvencia diagramot piszkozat formájában, ez alapján a struktúradiagramot javítja, ha kell. A piszkozat szekvencia diagramot elküldi Baloghnak, aki ez alapján stílusosan formázza, publikálható formára hozza. A kiadott változatokat a többiek folyamatosan nyomon követik, véleményezik, ellenőrzik. A hibásnak ítélt megoldásokat megvitatjuk közösen.
20 3. Analízis modell kidolgozása Ezen felül Gál és Szabó a 3.2 fejezet és az objektumok diagram konzisztenciáját felügyelték Kárász a kiadott, folyamatosan frissülő diagramok anyagait illesztette a megosztott dokumentumba. 2012. 02. 27. 00:15 1 óra Gál Dokumentáció ellenőrzése, finomítások, végleges kinézet megszerkesztése 2012. 02. 27. 02:13 1,5 óra Simon Végső konzisztencia ellenőrzés, nyomtatás