You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

Denne oppgaven er en videreføring av de tidligere spilloppgavene TicTacToe, Sokoban, Sudoku og Battleship, hvor en skal gjøre rutenettet observerbart og implementere et par grensesnitt, så spillogikken kan kobles til et ferdig skrevet grafisk brukergrensesnitt. I tillegg skal spillet utvides med ekstra funksjonalitet (Jeg glemte helt, skulle videreutvikling av spill inkluderes eller ikke? Har fjernet de midlertidig, men skal legge de til og reviewe hvis det skulle med allikevel.)

I denne oppgaven skal spillogikken og rutenettet fra tidligere spill kobles til et forbedret grensesnitt med bilder. Det vil være en del ferdige og nesten ferdige filer fra før av, alle i pakken patterns.observable.gridgame. Spillklassen din skal implementere grensesnittet GenericGridGame. Koden i brukergrensesnittet er dokumentert godt, les denne for å finne ut nøyaktig hva de påkrevde metodene skal gjøre.

GenericGameController må du instansiere spillet ditt på indikert sted (se kommentaren i koden).

GenericGridGameflere metoder..void addGridListener(GridListener gridListener)void removeGridListener(GridListener gridListener)GridListenervoid gridChanged(ObservableGrid grid, int x, int y, int w, int h)DinSpillklasseGenericGridGameControllergridListeners*

Den ferdigskrevne GenericGameController implementerer GridListener-grensesnittet, som gjør GenericGameController til en observatør av spillklassen din og krever metoden:

  • gridChanged(GenericGridGame<T> gridGame, int col, int row, int width, int height) - metoden kalles for å gi beskjed om at en eller flere ruter i rutenettet (grid) innenfor det angitte rektanglet er endret. Rektanglet er angitt med posisjon x, y og dimensjonene w, h (bredde, høyde).

Hvis f.eks. metoden kalles med x=1, y=2, w=2 og h=1, så angir det at rutene 1,2 og 2,2 er endret. Det er opp til rutenett-klassen å avgjøre om endringer av flere ruter rapporteres med ett eller flere kall til gridChanged-metoden. Så endringer i rutene 1,2 og 2,2 kan også rapporteres med to kall, ett hvor x=1, y=2 og ett hvor x=2, y=2, med w=1 og h=1 for begge. Så selv om en kaller denne metoden, så er det ikke dermed sagt at alle rutene i det angitte rektangelet er endret (strengt tatt trenger ingen å være det).

 

Grensesnittet GenericGridGame inkluderer følgende metoder for lytterhåndtering:

  • void addGridListener(GridListener) - registrerer en lytter skal skal ha beskjed hver gang rutenettet endres
  • removeGridListener(GridListener) - avregistrere en lytter som tidligere er registrert med addGridListener

Tanken er at lyttere skal kunne registrere seg selv som lytter til spillet ditt. Spillklassen din må da holde styr på sine lyttere, og bør bruke de to sistnevnte metodene til dette. Dette er observert-delen av observatør-observert-teknikken.

 

GenericGridGame har også metodene

  • T getCell(int col, int row)
  • String[] getImages(T t)

Disse kan være vanskelige å skjønne - tanken er at t er innholdet i en celle, av klasse T. Ved å inspisere controller-koden kan du se at getImages direkte bruker resultatet fra getCell. T kan være så enkelt som en char, eller det kan være et objekt av en klasse du har definert selv for innhold i en rute. Selve metoden getImages skal returnere et array av strenger som inneholder enten:

  • navnet på en/flere bildefiler (eks. for TicTacToe: "x.png"), eller
  • en/flere strenger (eks for TicTacToe: "x") som representerer innhold i ruten

Logikken for å gå fra T til String[] skrives i spillklassen i metoden getImages. Et array skal returneres fordi du får da muligheten til å legge flere bilder over hverandre hvis bildene du bruker har gjennomsiktighet. Dersom du kun vil bruke ett enkelt bilde per rute, eller velger å bruke en streng (alternativ 2 over) skal du kun returnere et array av lengde 1, hvor det ene elementet er bildefilnavnet eller strengen som beskrevet over.

Dersom du velger å bruke bilder skal de ligge i pakken patterns.observable.gridgame, sammen med resten av .java-filene.


For å kjøre spillet ditt i JavaFX kan du høyreklikke på GenericGame.fxml > Run As > FXML Application

 

  • No labels