Analízis modell kidolgozása – I. 65 – Zetor Konzulens:
Zsolnai Károly
Csapattagok Balogh Péter Tamás Gál István László Kárász Gábor Simon Endre András Szabó Alex
B6E4VC EKCBOK QHTQ8N HZK8DP PEONHQ
[email protected] [email protected] [email protected] [email protected] [email protected] 2012. február 27.
2
3. Analízis modell kidolgozása Zetor
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.
2012. február 27.
3
3. Analízis modell kidolgozása Zetor 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 3.2.1
Osztályok leírása Character
Név
Character
Felelősség
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”
2012. február 27.
4
3. Analízis modell kidolgozása Zetor az objektumban
3.2.2
Clock
Név
Clock
Felelősség
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
3.2.3
+ setPeriod(int) - beállítja a periódus idejét + run() - elindítja az órát
Door
Név
Door
Felelősség
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)
2012. február 27.
5
3. Analízis modell kidolgozása Zetor 3.2.4
Game
Név
Game
Felelősség
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
- 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
2012. február 27.
6
3. Analízis modell kidolgozása Zetor 3.2.5
Key
Név
Key
Felelősség
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
3.2.6
+ 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
Level
Név
Level
Felelősség
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
2012. február 27.
7
3. Analízis modell kidolgozása Zetor 3.2.7
LevelItem
Név
LevelItem
Felelősség
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
3.2.8
+ 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)
Sprite
Név
Sprite
Felelősség
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
2012. február 27.
8
3. Analízis modell kidolgozása Zetor 3.2.9
SpriteFactory
Név
SpriteFactory
Felelősség
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)
2012. február 27.
9
3. Analízis modell kidolgozása Zetor
3.3
Statikus struktúra diagramok
2012. február 27.
10
3. Analízis modell kidolgozása Zetor
3.4
Szekvencia diagramok
3.4.1 Idő léptetése
2012. február 27.
11
3. Analízis modell kidolgozása Zetor
3.4.2 Játék indítása
2012. február 27.
12
3. Analízis modell kidolgozása Zetor 3.4.3 Játék bezárása
2012. február 27.
13
3. Analízis modell kidolgozása Zetor
3.4.4 Pályaelem és karakter irányítása
2012. február 27.
14
3. Analízis modell kidolgozása Zetor
3.4.5 Ütközésdetektálás
2012. február 27.
15
3. Analízis modell kidolgozása Zetor
3.4.6 A pálya vége
2012. február 27.
16
3. Analízis modell kidolgozása Zetor
3.4.7 A pálya széléhez ér a karakter
3.4.8 A pálya újrakezdése
2012. február 27.
17
3. Analízis modell kidolgozása Zetor
3.4.9 Kulcs felvétele
3.4.10 Nézet váltása
2012. február 27.
18
3. Analízis modell kidolgozása Zetor
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:
2012. február 27.
19
3. Analízis modell kidolgozása Zetor
3.6
Napló
Tevékenység kezdete 2012. 02.21. 18:00
2 óra
Balogh Gál Kárász Simon Szabó
2012. 02.22. 17:00
1 óra
Balogh
2012. 02. 23. 15:00
1 óra
Simon
2012. 02. 25. 12:00 2012. 02. 25. 13:05 2012. 02. 26. 15:35
1 óra 1 óra 1,5 óra
Balogh Simon Balogh
2012. 02. 26. 17:00
7 óra
Balogh Gál Kárász Simon Szabó
2012. február 27.
Időtartam
Résztvevők
Tevékenység leírása Értekezlet, Martos Csocsó Klub Döntés: • iteratív modellfejlesztés használata • 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 Az első értekezleten készült tervek digitalizálása, megosztás a többiekkel 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. 3.1 fejezet megírása 3.2 fejezet részleges megírása 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) A rendelkezésre álló dokumentumok alapján online csapatmunka. Terv: • 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 Zetor •
2012. 02. 27. 00:15
1 óra
Gál
2012. 02. 27. 02:13
1,5 óra
Simon
2012. február 27.
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. Dokumentáció ellenőrzése, finomítások, végleges kinézet megszerkesztése Végső konzisztencia ellenőrzés, nyomtatás