WebProg-2014/Gyakorlat4

A MathWikiből
(Változatok közti eltérés)
35. sor: 35. sor:
 
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):
 
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.
 
* 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á.
+
* Kibõvítjük az elõbb említett 3 osztályt, úgy hogy implementálja a '''Collideable''' interface-t. Szóval igazából csak azt a két függvényt kell megírni hozzá (mindegyikhez).
* 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.
+
* Végül módosítjuk a '''handleCollisions''' függvényt a '''MainLoop'''-ban, hogy az újfajta ütközéseket kezelje.
  
 
És akkor most részletesebben:
 
És akkor most részletesebben:
* '''Collideable''' interface két metódusa:
+
* '''Collidable''' interface két metódusa:
 
** '''getCollisionCircle''': privát, '''Circle'''-t ad vissza, nem kap semmit
 
** '''getCollisionCircle''': privát, '''Circle'''-t ad vissza, nem kap semmit
** '''collision''': publikus, '''boolean'''-t ad vissza, kap egy '''Collideable'''-t
+
** '''collision''': publikus, '''boolean'''-t ad vissza, kap egy '''Collidable'''-t
  
 
Implementáljuk elõször a '''Bullet'''-hez:
 
Implementáljuk elõször a '''Bullet'''-hez:
* Hozzunk létre egy új osztályt '''BulletCollideable''' névvel, a feje nézzen ki így:
+
* A '''Bullet''' feje nézzen ki így:
 
<java>
 
<java>
public class BulletCollidable extends Bullet implements Collidable {
+
public class Bullet implements Collidable {
 
</java>
 
</java>
* Sírni fog, mert nincs implementálva a két '''Collideable'''-ben lévõ metódus, implementáljuk hát õket:
+
* Sírni fog, mert nincs implementálva a két '''Collidable'''-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 '''getCollisionCircle''' csak adja vissza a '''collisionCircle''' adattagját a '''Bullet'''-nek.
**
+
** a '''collision''' könnyen kitalálható, csak annyit mondok, hogy a '''getCollisionCircle'''-el mindkettõnek (this és bemenet) is el lehet kérni a körét, aminek van '''overlap''' nevû metódusa, ami megmondja, hogy két kör metsz-e.
 +
 
 +
Most implementáljátok a másik kettõt is, ugyanígy kell mindent csinálni. Ha megvan mind a három collideable akkor tudunk továbblépni.
 +
 
 +
Tisztogassunk elõször, töröljük ki az alábbi metódusokat:
 +
* a '''Bullet'''-ben: '''collideWithAsteroid'''
 +
* az '''AsteroidExtended'''-ben '''collideWithBullet'''
 +
 
 +
Ha ez megvan, akkor

A lap 2015. március 4., 12:54-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 implementálja a Collideable interface-t. Szóval igazából csak azt a két függvényt kell megírni hozzá (mindegyikhez).
  • Végül módosítjuk a handleCollisions függvényt a MainLoop-ban, hogy az újfajta ütközéseket kezelje.

És akkor most részletesebben:

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

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

  • A Bullet feje nézzen ki így:
public class Bullet implements Collidable {
  • Sírni fog, mert nincs implementálva a két Collidable-ben lévõ metódus, implementáljuk hát õket:
    • a getCollisionCircle csak adja vissza a collisionCircle adattagját a Bullet-nek.
    • a collision könnyen kitalálható, csak annyit mondok, hogy a getCollisionCircle-el mindkettõnek (this és bemenet) is el lehet kérni a körét, aminek van overlap nevû metódusa, ami megmondja, hogy két kör metsz-e.

Most implementáljátok a másik kettõt is, ugyanígy kell mindent csinálni. Ha megvan mind a három collideable akkor tudunk továbblépni.

Tisztogassunk elõször, töröljük ki az alábbi metódusokat:

  • a Bullet-ben: collideWithAsteroid
  • az AsteroidExtended-ben collideWithBullet

Ha ez megvan, akkor

Személyes eszközök