Gå til innhold

[LØST] JFrames / spillmeny


Anbefalte innlegg

Heisann, jeg har laga meg et lite spill her, men har litt problemer med å lage en meny som starter spillet opp...

 

selve spillet fungerer fint for seg selv, når jeg kjører metoden min startGame() fra main....men om jeg kjører startGame() fra menyframen så vil ikke spillet tegnes... (selve spillet kjører, men tegnes ikke)

 

noen forslag på hvordan dette kan fikses? (på forelesning har det blitt sagt at dette er fordi det er en tråd som ikke returnerer, men det sier meg veldig lite om hvordan jeg kan løse det... :ermm::ermm: )

 

 

kan hele menygreia fungere uten å ha forskjellige frames? altså bytting av innhold?

(vet CruellaDeVille startet tråd om dette nylig, men svarene der gir meg ikke så veldig mye....vet ikke helt hvordan jeg skal gripe det fatt)

Endret av elminzter
Lenke til kommentar
Videoannonse
Annonse
Her tror jeg vi trenger kildekoden for aa hjelpe deg videre.

6119654[/snapback]

 

 

vel, greit...sånn ser det ut akkurat nå: (har prøvd litt diverse)

 

public void loadMenu() {
 JFrame menuframe = new JFrame("ratz!");
 Menu menu = new Menu();
 menuframe.add(menu);
 menuframe.setSize(800, 630);
 menuframe.setVisible(true);
 menuframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void loadGame() {
 JFrame frame = new JFrame("ratz!");
 try {
 	nextLevel();
 } catch (NoMoreLevelsException e) {
 	//skjer aldri, dette er første level
 }
 gfx = new Gfx();
 frame.add(gfx);
 frame.setSize(800, 630);
 frame.setVisible(true);
 frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
 startGame();
}

public static void main(String[] args) {
 Game game = getInstance(); //bruker singleton
 game.loadGame();
}

 

Både Gfx og Menu klassene extends JPanel og har egne keylisteners...

 

har prøvd å bytte ut loadGame() i main til loadMenu()....altså at main åpner menyen, og så kjører menyen Game.getInstance().loadGame()

 

satser på det ikke trengs å paste mer fra de andre klassene... (?)

 

 

Edit: startGame() inneholder kun while (gameRunning) { ... }

Endret av elminzter
Lenke til kommentar
Vanskelig å svare på dette, siden du ikke vil vise koden, kanskje du kan lage et minimalt eksempel som viser problemstillingen?

 

Vennlig hilsen

HV

6120052[/snapback]

 

hm, ville ikke spamme med kode... :)

 

vel...slik som det er over så fungerer det fint, men om jeg gjør det slik, vil det ikke fungere:

 

Game klassen: (klassen i spillet med mainmetoden som kjører alt...)

public class Game extends JFrame {

private static Game instance;
private static Gfx gfx;

private Game() {
 (...)
}

public static Game getInstance() {
 if (instance == null) {
 	instance = new Game();
 }
 return instance;
}

public void startGame() {
 running = true;
 while (running) {
 	if (!paused) {
   (...)
   //repaint
   gfx.repaint();
 	}
 	try {
   Thread.sleep(40);
 	} catch (Exception e) {
   
 	}
 }
}

public void loadMenu() {
 JFrame menuframe = new JFrame("ratz!");
 Menu menu = new Menu();
 menuframe.add(menu);
 menuframe.setSize(800, 630);
 menuframe.setVisible(true);
 menuframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void loadGame() {
 JFrame frame = new JFrame("ratz!");
 try {
 	nextLevel();
 } catch (NoMoreLevelsException e) {
 	//skjer aldri, dette er første level
 }
 gfx = new Gfx();
 frame.add(gfx);
 frame.setSize(800, 630);
 frame.setVisible(true);
 frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
 startGame();
}

public static void main(String[] args) {
 Game game = getInstance();
 game.loadMenu();
}
}

 

Menu klassen:

public class Menu extends JPanel implements KeyListener {

public Menu() {
 this.setBackground(Color.gray);
 this.setPreferredSize(new Dimension(800,600));
 this.setFocusable(true);
 this.addKeyListener(this);
 this.requestFocus();
}

public void keyPressed(KeyEvent e) {
 if (e.getKeyCode() == KeyEvent.VK_ENTER) {
 	Game.getInstance().loadGame();
 }
}
}

 

Gfx glassen:

public class Gfx extends JPanel implements KeyListener,MouseListener {

public Gfx() {
 this.setBackground(Color.gray);
 this.setPreferredSize(new Dimension(800,600));
 this.setFocusable(true);
 this.addKeyListener(this);
 this.addMouseListener(this);
 this.requestFocus();
}

}

 

 

jah...er masse kode innimellom rundt om kring som jeg har utelatt...men selve funksjonaliteten skulle vel være med her....

 

om jeg prøver å kjøre ting slik som her så loader menuen som den skal og når jeg trykker enter så åpner den en ny frame til spillet...

 

selve spillløkka i startGame() kjører i den nye framen, men ingenting blir tegna! :(

 

 

si fra om det trengs mer kode, jeg utelater ting for at dere skal slippe å bla gjennom hundrevis av kodelinjer....

Endret av elminzter
Lenke til kommentar

Naa skummet jeg lett over, men proev denne endringen og se om det fungerer bedre:

public class Menu extends JPanel implements KeyListener {

public Menu() {
 this.setBackground(Color.gray);
 this.setPreferredSize(new Dimension(800,600));
 this.setFocusable(true);
 this.addKeyListener(this);
 this.requestFocus();
}

public void keyPressed(KeyEvent e) {
 if (e.getKeyCode() == KeyEvent.VK_ENTER) {
     Thread gameThread = new Thread() {
           public void run() {
             Game.getInstance().loadGame();
           }
     };
     gameThread.start();
 }
}
}

Lenke til kommentar

Grunnen til at det ikke fungerte før er at når du trykker på knappen, så kjører du hele rutinen i javas "grafikk thread" (event-dispatching). Alle events som startes av knapper, menyer osv. må ikke invovlere lange, tunge rutiner, fordi da vil alle andre events stå og vente til den er ferdig. I ditt første eksempel startes loadGame() i main-thread, i ditt andre startes loadGame() i event-thread.

 

Les mer om Threads and Swing

Endret av Patton
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...