...
I denne øvingen består verdenen av objekter (asteroider og en sol) som svever fritt i rommet og et romskip med motorer som kan snurre og skyve. Alle objekter har en posisjon, fart og masse, og virker på hverandre i henhold til formelen for gravitasjon. Romskipet har i tillegg vinkelfart og mulighet for å fyre av motorer bak (dytter) og på siden (snurrer).
Code Block | ||
---|---|---|
| ||
emfs
/inheritance/ #java #package
BaseSpaceObject.java @ git@github.com:hallvard/jexercise/no.hal.jex.collection/src/inheritance/BaseSpaceObject.java;
Asteroids.java @ git@github.com:hallvard/jexercise/no.hal.jex.collection/src/inheritance/Asteroids.java;
AsteroidsProgram.java @ git@github.com:hallvard/jexercise/no.hal.jex.collection/src/inheritance/AsteroidsProgram.java;
;
/inheritance/ #java #package #test
SpaceObjectTest.java @ git@github.com:hallvard/jexercise/no.hal.jex.collection/src-gen/inheritance/SpaceObjectTest.java;
SpaceObject.jextest @ git@github.com:hallvard/jexercise/no.hal.jex.collection/tests/inheritance/SpaceObject.jextest; |
Del 1 - Rom-objekter
| Det er i hovedsak to typer rom-objekter, de som svever fritt (planeter, asteroider og stjerner) og romskipet, som har motorkraft. Det som er felles for alle rom-objektene ønsker vi å samle i superklassen SpaceObject, som de to mer spesialiserte typene Asteroid og SpaceShip arver fra. Dette er illustrert i diagrammet til venstre. Vi har brukt typen Point2D for å angi at posisjon (position) og fart (speed) beskrives av to verdier (koordinatpar/vektorkoordinater). Massen beregnes, så den er angitt som en operasjon og ikke som et attributt. Det som ikke kommer frem i dette diagrammet er hvordan vi også ønsker å bygge på Polygon-klassen i JavaFX, for å gjøre det lettere å vise rom-objektene som grafikk i et vindu på skjermen. Med Polygon som superklasse for SpaceObject, så vil en kunne angi et sett punkter som utgjør konturen til rom-objektene. Siden Polygon i praksis også har en posisjon (i kraft av å være en Node), så trenger en ikke lagre denne som et eget felt i SpaceObject, så den faktiske implementasjon blir litt annerledes enn vist til venstre. Og for å gjøre det litt lettere å utnytte mulighetene i Polygon-klassen (spesielt koordinat-håndtering er litt fiklete), så har vi lage en hjelpeklasse, kalt BaseSpaceObject, som kan brukes som den direkte superklassen til SpaceObject og som selv arver fra Polygon. Dette er illustrert til høyre. Kode m/dokumentasjon for BaseSpaceObject-klassen finner du nederst på denne siden. De spesifikke metodene i SpaceObject, Asteroids og SpaceShip, som du må implementere er som følger: SpaceObject
Asteroid
SpaceShip
|
|
...
intersects-metoden skal returnere true dersom to SpaceObject-instanser (this og argumentet) overlapper. Sjekk for overlapp kan gjøres på mange måter, f.eks. sjekke overlapp av såkalt "bounding box" (minste omsluttende rektangel) eller om midten og/eller hjørnene i det ene polygonet er inni det andre (og vice versa), eller en kombinasjon av flere av disse. contains-metoden BaseSpaceObject i er nyttig her. Enkle teknikker vil dekke mange relevante tilfeller, men for å ta alle hjørnetilfellene
Det som altså fungerer best er en kombinasjon av alle disse teknikkene! |
|
JExercise-testkode for del 1 finner du her: inheritance/SpaceObjectTest.java. Originalkoden (jextest) for testen finner du her: inheritance/SpaceObject.jextesttestkode og originalkoden (jextest er tilgjengelig i emfs-filtreet i starten av oppgaven.
Del 2 - Oppsett av verden og simulering
...