Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Del 2 - Oppsett av verden og simulering

PlantUML Macro
class "Pane (fra JavaFX)" as Pane {
}
class Asteroids {
}
Pane <|-- Asteroids
class SpaceObject {
}
Asteroids *-right-> "*" SpaceObject: spaceObjects

class Asteroids1 {
}
class Asteroids2 {
}
class Asteroids3 {
}

Asteroids <|-- Asteroids1
Asteroids <|-- Asteroids2
Asteroids2 <|-- Asteroids3

Denne delen tar utgangspunkt i en delvis ferdigskrevet Asteroids-klasse. Oppgaven til Asteroids-klassen er todel: 1) å rigge opp verdenen med rom-objekter og 2) kjøre selve simuleringen. I koden for Asteroids-klassen, som ligger nederst på denne siden, legges det opp til at dette gjøres i henholdsvis init()- og run()-metoden, men du står forsåvidt fritt til å (gjen)bruke denne koden som du vil. Men for at du skal lære mest mulig om arv, så prøv å legge mest mulig av din egen kode i subklasser av Asteroids, heller enn å skrive den om. Vi foreslår at du gjør oppgaven i følgende trinn, med én subklasse pr. trinn.

Astroids-klassen har noen finesser, som kan nyttige ved feilsøking:

  • trykk '+' og '-' for zoome inn og ut
  • trykk ' ' (mellomrom) for å stoppe/starte simuleringen og '>' for å kjøre ett steg (tick)

Bruk du AsteroidsProgram som hovedprogramklasse. main-metoden til AsteroidsProgram tar inn navnet til Asteroids-(sub)klassen som eneste programargument. Det enkleste er å lage en main-metode i din egen Asteroids-(sub)klasse (her kalt Asteroids1), slik:

Code Block
public static void main(String[] args) {
   AsteroidsProgram.main(new String[]{inheritance.Asteroids1.class.getName()}); // lager en String-tabell med klassenavnet som eneste element
}

Trinn 1 - Asteroids1

I dette trinnet er målet å få lagt inn noen SpaceObject-instanser, se (til) at simuleringen beveger dem på skjermen og få kollisjonsdeteksjon til å fungere.

SpaceObject-instansene opprettes i init()-metoden og legges inn med den ferdigskrevne add-metoden i Asteroids-klassen. For å få simuleringen til å virke, så må du fylle inn kode i tick()-metoden:

  • For hvert SpaceObject må du utføre ett simuleringstrinn.
  • For hvert SpaceObject-par må du sjekke for kollisjon, altså om de overlapper hverandre (se intersects-metoden i SpaceObject-klassen over).

Se http://stackoverflow.com/questions/345838/ball-to-ball-collision-detection-and-handling dersom du vil simulere kollisjoner som (fullstendig) elastiske støt.

Trinn 2 - Asteroids2

I dette trinnet er målet å få gravitasjonslogikken til å fungere og sjekke det ved å legge inn en sol (stor, gul og rund Asteroid-instans) og masse asteroider (Asteroid-instanser av med ulik tetthet og størrelse).

Utvid tick()-metoden slik at du for hvert SpaceObject-par beregner og håndterer den gjensidige gravitasjonskraften.

Trinn 3 - Asteroids3

I dette trinnet implementerer du støtte for å styre romskipet med piltastene (KeyCode.LEFTKeyCode.RIGHT og KeyCode.UP). Finn selv ut hvilke Asteroids-metoder som må redefineres, for å få dette til. Sørg for å legge til et romskip og prøv å unngå å kollidere eller å bli fanget av sola!

...