# Problem beim Aufrufen des Spiels von einem Menü



## oneup (3. Jul 2017)

Ich hab ein Problem bei einem Projekt für die Uni.
Ich habe die Files für besseres Verständnis alle hochgeladen.
Und zwar hab ich ein Spiel das mehr oder weniger funktioniert wenn ich es von der Regulären Main Klasse starte.
Was ich nun in Planung habe ist ein Hauptmenü für das Spiel. Allerdings funktioniert dies nicht so wie ich es geplant hatte.
Wenn ich die Klasse "HindiBones" vom ActionListener des Buttons aus dem Menü aus aufrufe, hängt sich das Programm irgendwie auf und öffnet das Spiel nicht richtig.
Starte ich es von der normale Main Klasse direkt, funktioniert alles.
Die Klasse von der das Spiel eigentlich aufgerufen werden soll befindet sich im "src" ordner und ist die Klasse "Menue". Ich wäre für jede hilfe Dankbar

http://www.mediafire.com/file/tdltfntne156tcr/Test.zip


----------



## JuKu (3. Jul 2017)

Das liegt vermutlich daran, dass du den Aufruf in einem falschen Thread startest und es zum Deadlock kommt.
Ich habe jetzt aber nicht den Code komplett durch geschaut.
Könntest du mal den Code posten, in welchem du das Spiel startest bzw. wo die Klasse HindiBones aufrufst?
Und was genau tut die HindiBones Klasse?


----------



## oneup (3. Jul 2017)

Also wenn ich die Klasse "HindiBones" von der Main Methode aus aufrufe funktioniert alles ganz normal.

```
new HindiBones(BOX*WIDTH, BOX*HEIGHT, "Hindi Bones");
```

In der andere Klasse habe ich wirklich nichts anderes gemacht als den selben befehl einfach unter dem ActionListener zu stellen damit er die Klasse "HindiBones" halt erst aufruft nach dem ich den Knopf gedrückt habe.

Die Klasse HindiBones kombiniert halt das Spielfeld und gibt alles zusammen in einer Spielbaren form aus.

Liegt das Problem nun in der Klasse "HindiBones", die ja eigentlich problemlos funktioniert wenn ich sie normal von der Main Methode aus aufrufe oder liegt das Problem in der anderen Klasse mit dem Button?


----------



## JuKu (15. Jul 2017)

Das Problem liegt im Thread, mit dem du deine Klasse aufrufst.
Ist aber wie gesagt nur eine Vermutung.


----------



## Blender3D (15. Jul 2017)

Deine Klasse Menu ist ein JFrame und die Klasse Hindibones ebenfalls. Du kannst keinen JFrame aus einem JFrame starten --> Deathlock.
In der Klasse Hindibones hast Du bereits den richtigen Ansatz gewählt. Deine Hiscore wird durch removen und adden von JPanels realisiert. So könntest Du es auch mit Deinem Menu machen.
Ausserdem ein Tip niemals bei einem JPanel die Methode paint überladen sonder immer paintComponent.


----------



## Blender3D (15. Jul 2017)

Deine interne Steuerung wäre schöner gebaut, wenn Du für jeden Fall eine Klasse vom Typ JPanel anbietest.
Also MenuPanel, HiscorePanel, HindibonePanel usw. und eine Klasse GameCtrl die die Modi MENU, GAME, HISCORE ... verwaltet.
Mittels setMode( MODE mode ) wird der entsprechende Jpanel als View in Deinem JFrame plaziert.

Der Vorteil: wenn Fehler  in einem Modus auftreten, braucht Du immer nur die betroffene Klasse unter die Lupe zu nehmen.


----------



## oneup (16. Jul 2017)

@Blender3D vielen dank für deinen tipp. Ich werde versuchen alles umzuändern wie du es gesagt hast


----------



## JuKu (22. Jul 2017)

Blender3D hat gesagt.:


> Deine Klasse Menu ist ein JFrame und die Klasse Hindibones ebenfalls. Du kannst keinen JFrame aus einem JFrame starten --> Deathlock.



Genau das meinte ich auch.


----------

