Hey Leute!
Ich bin gerade dabei Tetris zu programmieren. Jetzt stoße ich aber auf eine Designfrage bzgl Threads:
Ich benutze das MVC:
- Als Model benutze ich ein Array, das das Spielfeld darstellt.
- Im View habe ich ein JPanel eingebettet, das mit Hilfe der paint-Methode basierend auf dem Array des Models das Spielfeld malt. Klappt alles soweit.
- Der Controller initialisiert den View und das Model, erbt von Thread. Hier habe ich die run-Methode eingebettet, die entsprechend immer das Model bearbeitet, damit das Spiel ist wie tetris (Figur drehen, senken etc.)
Dann habe ich noch eine initiale Klasse, die ich Tetris genannt habe. Die sieht so aus:
Nun zu meiner Frage: Rufe ich vom View aus die resetGame() von Tetris auf, so wird ein ganz neues Fenster geöffnet, da ja mein Controller-Thread ein neues Fenster intialisiert.
Wie muss ich das ganze denn umdesignen, dass es Sinn macht?
Ich dachte etwa daran, dass ich in der Klasse Tetris den View initialiseire (der läuft dann ja im main-Thread, nicht im Controller-Thread) und einen eigenen Controller-Thread. Wenn ich das tue, dann "hört" das JFrame (z.B. bei repaint()) aber nicht mehr auf mein Controller, also wenn der sich zB ändert oder? Da ja der View im Main-Thread und nicht mehr im Controller-Thread läuft.
Ich bin jetzt am überlegen, wei ich das umdesigne... Bisher habe ich das reset() im Controller gemacht. DAs ist glaube ich aber kein schöner Stil, da der Thread immer weiterläuft.
Ich hoffe, ihr habt verstanden, um was es mir geht.
Vielen Dank für die Hilfe!!
Ich bin gerade dabei Tetris zu programmieren. Jetzt stoße ich aber auf eine Designfrage bzgl Threads:
Ich benutze das MVC:
- Als Model benutze ich ein Array, das das Spielfeld darstellt.
- Im View habe ich ein JPanel eingebettet, das mit Hilfe der paint-Methode basierend auf dem Array des Models das Spielfeld malt. Klappt alles soweit.
- Der Controller initialisiert den View und das Model, erbt von Thread. Hier habe ich die run-Methode eingebettet, die entsprechend immer das Model bearbeitet, damit das Spiel ist wie tetris (Figur drehen, senken etc.)
Dann habe ich noch eine initiale Klasse, die ich Tetris genannt habe. Die sieht so aus:
Java:
package init;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import controller.TetrisControler;
import view.View2;
public class Tetris {
Thread aktSpiel;
public Tetris() throws InterruptedException {
aktSpiel = new TetrisControler(this);
aktSpiel.start();
}
public void resetGame() {
System.out.println("------->"+ aktSpiel.isAlive());
aktSpiel = new TetrisControler(this);
aktSpiel.start();
}
public static void main(String[] args) throws InterruptedException, ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
new Tetris();
}
}
Nun zu meiner Frage: Rufe ich vom View aus die resetGame() von Tetris auf, so wird ein ganz neues Fenster geöffnet, da ja mein Controller-Thread ein neues Fenster intialisiert.
Wie muss ich das ganze denn umdesignen, dass es Sinn macht?
Ich dachte etwa daran, dass ich in der Klasse Tetris den View initialiseire (der läuft dann ja im main-Thread, nicht im Controller-Thread) und einen eigenen Controller-Thread. Wenn ich das tue, dann "hört" das JFrame (z.B. bei repaint()) aber nicht mehr auf mein Controller, also wenn der sich zB ändert oder? Da ja der View im Main-Thread und nicht mehr im Controller-Thread läuft.
Ich bin jetzt am überlegen, wei ich das umdesigne... Bisher habe ich das reset() im Controller gemacht. DAs ist glaube ich aber kein schöner Stil, da der Thread immer weiterläuft.
Ich hoffe, ihr habt verstanden, um was es mir geht.
Vielen Dank für die Hilfe!!