Skagen Skrevet 13. februar 2010 Del Skrevet 13. februar 2010 Hei! Holder på å gjøre en øving med å lage et Sokoban-spill. Jeg tenkte å bruke klasser, og har derfor klasser for bl.a celler, brett, spiller, o.l. Men jeg har problemer med å nå eksempelvis brett-instansen fra spiller-instansen. Koden min ser ut noe som dette: Sokoban.java: package oeving4; public class Sokoban { // static members, etc ... public Level level = new Level(); public Player player = new Player(); // metoder og sånt her ... public static void main(String[] args) { // foreløpig tom } } Level.java: package oeving4; public class Level { private Cell[][] grid = {}; public Cell getCell(int x, int y) { return grid[x][y]; } // Flere irrelevante metoder her ... } Player.java: package oeving4; public class Player { private int x = 0; private int y = 0; public void tryMove(Direction direction) { int dx = 0; int dy = 0; Cell nextCell = level.getCell(x + dx, y + dy); // Mer kode ... } } I Player-klassen får jeg melding om "level can not be resolved" i linja hvor jeg instansierer nextCell med level.getCell(). Hvordan får jeg til at instansene av Level- og Player-klassene blir tilgjengelig i andre instanser enn Sokoban-klassen? Har prøvd å bruke static, public static, og public når jeg instaniserer dem i Sokoban-klassen, samt instansiere dem i main-metoden som ligger i Sokoban-klassen. Noen tips? Lenke til kommentar
miXer Skrevet 13. februar 2010 Del Skrevet 13. februar 2010 Så lenge de ligger i samme package skal vel det gå greit. Lenke til kommentar
Skagen Skrevet 13. februar 2010 Forfatter Del Skrevet 13. februar 2010 Var det jeg også trodde, men Eclipse mener at level-instansen ikke eksisterer. Siden level og player begge instansieres i Sokoban-klassen tenkte jeg at de kanskje kunne nå hverandre igjennom den. Lenke til kommentar
miXer Skrevet 13. februar 2010 Del Skrevet 13. februar 2010 Altså, du har en klasse som er Sokoban som er hovedklassen din(inneholder main), du vil altså bruke metodene i en klasse uten å instansiere dem? Da må de vel være abstract? Eller tar jeg feil her? Lenke til kommentar
Skagen Skrevet 13. februar 2010 Forfatter Del Skrevet 13. februar 2010 Alle klassene er instansiert, men Eclipse mener de likevel ikke eksisterer eller kan nås via navnene jeg gir instansene. Men jeg gav opp denne tilnærminga, så er ingen vits å fortsette tråden. Lenke til kommentar
duckers Skrevet 13. februar 2010 Del Skrevet 13. februar 2010 Problemet er at klassen Player ikke har kjennskap til level. For å løse problemet ditt må metoden tryMove kalles med level også. (Antar player.tryMove kalles fra Sokoban en plass) Altså metodehodet må endres til: public void tryMove(Direction direction, Level level){} Dette fører imidlertid ikke til verdens beste innkapsling. Kanskje burde metoden tryMove flyttes til klassen level, og så returnerer denne en ny posisjon som spilleren kan oppdateres med etterpå? Lenke til kommentar
Skagen Skrevet 13. februar 2010 Forfatter Del Skrevet 13. februar 2010 Ja, du er inne på noe der. En heller dårlig løsning jeg fant før jeg forkastet hele greia, var å lage en lokal level-variabel inni Player-klassen, og gi level-instansen som et argument til konstruktøren: package oeving4; public class Player { private int x = 0; private int y = 0; private Level level = null; public Player(Level level) { this.level = level; } public void tryMove(Direction direction) { int dx = 0; int dy = 0; Cell nextCell = level.getCell(x + dx, y + dy); // Mer kode ... } } Og så i Sokoban-klassen: public Level level = new Level(); public Player player = new Player(level); Lenke til kommentar
quantum Skrevet 14. februar 2010 Del Skrevet 14. februar 2010 Altså, du har en klasse som er Sokoban som er hovedklassen din(inneholder main), du vil altså bruke metodene i en klasse uten å instansiere dem? Da må de vel være abstract? Eller tar jeg feil her? Ja. Du tenker kanskje på static. Lenke til kommentar
miXer Skrevet 14. februar 2010 Del Skrevet 14. februar 2010 Altså, du har en klasse som er Sokoban som er hovedklassen din(inneholder main), du vil altså bruke metodene i en klasse uten å instansiere dem? Da må de vel være abstract? Eller tar jeg feil her? Ja. Du tenker kanskje på static. Jepp var visst det! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå