WebProg-2014/Gyakorlat4

A MathWikiből
(Változatok közti eltérés)
27. sor: 27. sor:
  
 
== Ûrhajó pusztulása ==
 
== Ûrhajó pusztulása ==
 +
 +
Ehhez sok dolgunk lesz. Át akarjuk írni a következõ osztályokat, hogy mindenki mindenkivel ütköztethetõ legyen:
 +
* '''AsteroidExtended'''
 +
* '''SpaceShipExtended'''
 +
* '''Bullet'''
 +
 +
Elõbb az ötlet (aki magabiztos kezdje el a következõk megírni a programot és csak akkor nézzen bele a részletekbe, ha elakadna):
 +
* Létrehozunk egy interface-t '''Collideable''' névvel, ami azt jelzi, hogy valami tud ütközni. Két metódussal, egyik ami elkéri az adott objektum ütközési "körét" (Circle objektum, már meg van írva). Másik amelyik az ütközésvizsgálatot végzi és igaz / hamisat ad vissza.
 +
* Kibõvítjük az elõbb említett 3 osztályt, úgy hogy mindegyiket leszármaztatjuk egy új osztályba (pl: '''AsteroidCollideable''') és ez az új osztály már implementálja a '''Collideable''' interface-t. Szóval igazából csak azt a két függvényt kell megírni hozzá.
 +
* Végül módosítjuk a '''handleCollisions''' függvényt a '''MainLoop'''-ban, hogy az újfajta ütközéseket kezelje. És nem felejtjük el minden helyen lecserélni az '''AsteroidExtended''' stb.-t '''AsteroidCollideable''' stb.-re.
 +
 +
És akkor most részletesebben:
 +
* '''Collideable''' interface két metódusa:
 +
** '''getCollisionCircle''': privát, '''Circle'''-t ad vissza, nem kap semmit
 +
** '''collision''': publikus, '''boolean'''-t ad vissza, kap egy '''Collideable'''-t
 +
 +
Implementáljuk elõször a '''Bullet'''-hez:
 +
* Hozzunk létre egy új osztályt '''BulletCollideable''' névvel, a feje nézzen ki így:
 +
<java>
 +
public class BulletCollidable extends Bullet implements Collidable {
 +
</java>
 +
* Sírni fog, mert nincs implementálva a két '''Collideable'''-ben lévõ metódus, implementáljuk hát õket:
 +
** a '''getCollisionCircle''' csak adja vissza a '''collisionCircle''' adattagját a '''Bullet'''-nek. Ehhez persze '''protected'''-re kell állítani a láthatóságát.
 +
**

A lap 2015. március 4., 12:22-kori változata

Mindenek elõtt

Hozzatok létre egy új projectet Asteroids2 néven. Hozzatok benne létre egy asteroids package-et. Majd töltsétek le innen a hiányos java file-okat. (Ezek az elõzõ gyakorlat megoldásait tartalmazzák, plusz még egy-két módosítást, így mindenkinek le kell töltenie.)


Pontszámok

Az AsteroidsGame osztálynak van egy statusbar nevû változója, az initUI-ban van inicializálva (azaz itt jön létre egy objektum amit tárol). Láthatjátok, hogy egy 0-t tartalmazó Stringet kap, és ha elindítjátok a játékot azt is láthatjátok, hogy ezáltal a bal alsó sarokban egy 0 van a játékban. Ez lesz a pontszám, de még nem mûködik.

Most nézzünk bele a MainLoop asteroidBulletCollision metódusába. Ez fut le akkor, ha ütközik egy lövedék egy aszteroidával. Láthatjátok, hogy megkapja az aszteroidát ami ütközik és a lövedéket. Az aszteroidának meghívja a destroy metódusát majd a for ciklusban az újonnan létrejött aszteroidákat berakja az asteroidContainer-be (emlékezzetek vissza a destroy visszaadott egy tömböt az újonnan készítendõ aszteroidákról). A destroy hívása után kellene növelnünk a számlálót eggyel, egy aszteroida egy pontot ér.

  • Hozzunk létre egy privát adattagot a MainLoop-nak, amiben tároljuk a pontokat (egész szám), én score-nak fogom nevezni.
  • A következõ függvényhívás átállítja a statusbar értékét a megadottra:
statusbar.setText(String.valueOf( ide kell az érték ));
  • Viszont van egy kis gond, hisz a statusbar az AsteroidsGame adattagja volt, azt itt nem érjük el. Hát csináljunk ide is egy referenciát hozzá:
    • Menjünk vissza az AsteroidsGame osztályba és hozzunk létre egy publikus függvényt getStatusbar névvel, ami visszaadja a statusbar adattagot. A visszatérési értékét ebbõl már tudnotok kell, hogy mi.
    • Térjünk vissza a MainLoop-ra, itt hozzunk létre egy megfelelõ típusú privát adattagot, amiben tároljuk a statusbar-t. Majd ezt vagy a konstruktorban vagy az initBoard-ban állítsuk be a következõ módon:
statusbar = parent.getStatusbar();
    • A parent, ha megnézitek az AsteroidsGame objektum, szóval elkérjük a statusbar-ját és így már mi is "tároljuk".
  • Most, hogy már van statusbar itt is mûködni fog a korábbi setText-es kód, szóval próbáljátok ki.
  • Ha még mindig 0-t mutat, ne felejtsétek el, hogy a score változót növelni kellene amikor egy aszteroida elpusztul, szóval tegyétek meg a növelést a destroy után.


Ûrhajó pusztulása

Ehhez sok dolgunk lesz. Át akarjuk írni a következõ osztályokat, hogy mindenki mindenkivel ütköztethetõ legyen:

  • AsteroidExtended
  • SpaceShipExtended
  • Bullet

Elõbb az ötlet (aki magabiztos kezdje el a következõk megírni a programot és csak akkor nézzen bele a részletekbe, ha elakadna):

  • Létrehozunk egy interface-t Collideable névvel, ami azt jelzi, hogy valami tud ütközni. Két metódussal, egyik ami elkéri az adott objektum ütközési "körét" (Circle objektum, már meg van írva). Másik amelyik az ütközésvizsgálatot végzi és igaz / hamisat ad vissza.
  • Kibõvítjük az elõbb említett 3 osztályt, úgy hogy mindegyiket leszármaztatjuk egy új osztályba (pl: AsteroidCollideable) és ez az új osztály már implementálja a Collideable interface-t. Szóval igazából csak azt a két függvényt kell megírni hozzá.
  • Végül módosítjuk a handleCollisions függvényt a MainLoop-ban, hogy az újfajta ütközéseket kezelje. És nem felejtjük el minden helyen lecserélni az AsteroidExtended stb.-t AsteroidCollideable stb.-re.

És akkor most részletesebben:

  • Collideable interface két metódusa:
    • getCollisionCircle: privát, Circle-t ad vissza, nem kap semmit
    • collision: publikus, boolean-t ad vissza, kap egy Collideable-t

Implementáljuk elõször a Bullet-hez:

  • Hozzunk létre egy új osztályt BulletCollideable névvel, a feje nézzen ki így:
public class BulletCollidable extends Bullet implements Collidable {
  • Sírni fog, mert nincs implementálva a két Collideable-ben lévõ metódus, implementáljuk hát õket:
    • a getCollisionCircle csak adja vissza a collisionCircle adattagját a Bullet-nek. Ehhez persze protected-re kell állítani a láthatóságát.
Személyes eszközök