# GameState



## anonym123 (29. Jan 2018)

Hallo zusammen,
ich habe ein Problem mit meinem Code. Ich programmiere im Moment ein kleines Rennspiel, welches ich in verschiedene States eingeteilt habe. Diese habe ich in einem enum gespeichert. Nun mein Problem, ich kann es nicht aktualisieren und die State wird weiterhin angezeigt und ändert sich nicht zu einer anderen. Ich hoffe mir kann jemand helfen, da ich nicht genau weiß, wie ich es aktualisieren kann.



```
package model;

public enum GameState {
 
    START_SCREEN,
    RUNNING,
    PAUSED,
    SHOW_SCORE,
    GAME_OVER,
    HELP;

  public static GameState state = GameState.START_SCREEN;
 
}
```


```
//show start screen
    Image imgStart = new Image(getClass().getResource("Start.png").toExternalForm());
    startIMG = new ImageView(imgStart);
    if (GameState.state == GameState.START_SCREEN) {
      rootPane.getChildren().add(startIMG);
    }
   
    //button to start game (start screen)
    Button startGame = new Button("Start Game");
    startGame.setTranslateX(-5.0);
    startGame.setTranslateY(300.0);
    if (GameState.state == GameState.START_SCREEN) {
      rootPane.getChildren().addAll(startGame);
    }
    startGame.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
      @Override
      public void handle(MouseEvent e) {
        GameState.state = GameState.RUNNING;
        System.out.println("KLICK");    
      }
    });
```

Das sind ein paar Ausschnitte aus meinem Code, hoffe die helfen weiter.


----------



## VfL_Freak (29. Jan 2018)

Moin,

(a) ich hoffe, die schließende Klammer der ENUM fehlt nur hier ... 
(b) wird denn 'KLICK' ausgegeben?
(c) schon mal 'nen 'normalen' ActionListener am Button versucht?

VG Klaus


----------



## SchwarzWeiß (29. Jan 2018)

VfL_Freak hat gesagt.:


> (a) ich hoffe, die schließende Klammer der ENUM fehlt nur hier ...


Sicher, dass hier eine Klammer fehlt?


----------



## anonym123 (29. Jan 2018)

VfL_Freak hat gesagt.:


> Moin,
> 
> (a) ich hoffe, die schließende Klammer der ENUM fehlt nur hier ...
> (b) wird denn 'KLICK' ausgegeben?
> ...



 Hallo, 
danke schon mal für die Antworten. 
Also bei der ENUM fehlt keine Klammer, dass stimmt so . 
Ja, "KLICK wird ausgegeben. Ich habe nur das Problem, dass dann die RUNNING State nicht angezeigt wird, wenn ich den Button betätige. Mein Auto, welches in der RUNNING State ist kann ich fahren, nachdem ich auf "Start Game" gedrückt habe, aber es wird halt nicht angezeigt.


----------



## SchwarzWeiß (29. Jan 2018)

Was meinst du mit RUNNING State anzeigen? Von welchem Code erwartest du diese Anzeige?


----------



## mrBrown (29. Jan 2018)

Wo sollte auch was angezeigt werden? Du änderst doch nur die Variable...


----------



## anonym123 (29. Jan 2018)

Genau das ist mein Problem, ich weiß nicht wie ich das anzeigen lassen kann. Ich will das wenn man den Button betätigt, dass dann die RUNNING State angezeigt wird, ich weiß aber nicht wie ich das genau machen kann. Wär super, wenn ihr mir da weiterhelfen könntet...


----------



## SchwarzWeiß (29. Jan 2018)

Du nimmst ein Label und änderst den Text beim Button-Aufruf.
EDIT: Oder du erstellst eine Property und sorgst mit einem Binding dafür, dass das Label immer den aktuellen State anzeigt

```
StringProperty propertyGameState = new SimpleStringProperty(GameState.state.name());
```


```
label.textProperty().bind(property);
```
so etwa


----------



## anonym123 (29. Jan 2018)

SchwarzWeiß hat gesagt.:


> Du nimmst ein Label und änderst den Text beim Button-Aufruf.
> EDIT: Oder du erstellst eine Property und sorgst mit einem Binding dafür, dass das Label immer den aktuellen State anzeigt
> 
> ```
> ...


Danke für die Antwort, dass hat aber auch nicht funktioniert...


----------



## SchwarzWeiß (29. Jan 2018)

Was heißt "nicht funktioniert", der Wechsel oder dass es überhaupt angezeigt wird?


----------



## mrBrown (29. Jan 2018)

anonym123 hat gesagt.:


> Danke für die Antwort, dass hat aber auch nicht funktioniert...


Der erste Vorschlag funktioniert schon, du musst es nur umsetzten.

Der zweite ist leider zu unvollständig, als das er funktionieren könnte.


----------



## anonym123 (29. Jan 2018)

SchwarzWeiß hat gesagt.:


> Was heißt "nicht funktioniert", der Wechsel oder dass es überhaupt angezeigt wird?


Also wenn ich den Button betätige wechselt es immer noch nicht zur RUNNING.


----------



## mrBrown (29. Jan 2018)

Ohne zu wissen, was du gemacht hast, ist das in etwa so hilfreich wie "mein auto fährt nicht" wenn der Grund ein leerer Tank ist...


----------



## SchwarzWeiß (29. Jan 2018)

Also mein erster Vorschlag sollte auf jeden Fall funktionieren:


```
startGame.setOnAction(e -> 
      GameState.state = GameState.RUNNING;
      label.setText(GameState.state.name()); 
});
```


----------



## anonym123 (29. Jan 2018)

SchwarzWeiß hat gesagt.:


> Also mein erster Vorschlag sollte auf jeden Fall funktionieren:
> 
> 
> ```
> ...


Kann ich das so machen, weil ich ich will ja keinen Text verändern?


----------



## SchwarzWeiß (29. Jan 2018)

anonym123 hat gesagt.:


> Kann ich das so machen, weil ich ich will ja keinen Text verändern?


Ich dachte dir ging es um die Anzeige des States (und das wäre ja ein Text)? Du musst schon etwas präziser werden, was du eigentlich machen willst und was nicht klappt


----------



## anonym123 (29. Jan 2018)

Tut mir leid, mir fällt das etwas schwer das zu erklären, ich versuch es jetzt nochmal 
Also ich habe ja diese GameStates. In der START_SCREEN wird ein IMG und ein Button angezeigt, dann soll sich RUNNING durch das Betätigen des Buttons öffnen. In der RUNNING befindet sich ein IMG, welches ein Auto ist. Dazu kommt noch, dass sich dort zwei Ellipsen befinden, welche die Rennstrecke bilden. Und diese Objekte sollen durch das Betätigen des Buttons angezeigt werden und START_SCREEN wieder ausgeblendet werden. 
Ich hoffe das war irgendwie verständlicher...


----------



## SchwarzWeiß (29. Jan 2018)

Dann änder doch die Sichtbarkeiten der Buttons, Ellipsen usw. innerhalb von startGame.setOnAction


----------



## anonym123 (29. Jan 2018)

SchwarzWeiß hat gesagt.:


> Dann änder doch die Sichtbarkeiten der Buttons, Ellipsen usw. innerhalb von startGame.setOnAction


Das hatte ich schon probiert, wenn ich von der RUNNING die Sichtbarkeit der Ellipsen und des IMG auf true setze werden diese Objekte aber nicht angezeigt.


----------



## SchwarzWeiß (29. Jan 2018)

anonym123 hat gesagt.:


> Das hatte ich schon probiert, wenn ich von der RUNNING die Sichtbarkeit der Ellipsen und des IMG auf true setze werden diese Objekte aber nicht angezeigt.


Zeig am besten Mal den Code


----------



## SchwarzWeiß (29. Jan 2018)

Du setzt ellipse1 zwar auf sichtbar, hast sie aber noch nirgends hinzugefügt oder?


----------



## anonym123 (29. Jan 2018)

SchwarzWeiß hat gesagt.:


> Du setzt ellipse1 zwar auf sichtbar, hast sie aber noch nirgends hinzugefügt oder?




```
if (GameState.state == GameState.RUNNING) {
      rootPane.getChildren().add(ellipse1);
    }
```
hier habe ich es halt hinzugefügt, aber das funktioniert ja nicht, da es in der RUNNING ist. Wenn ich das umänder zu
if (GameState.state == GameState.START_SCREEN)  dann funktioniert es


----------



## SchwarzWeiß (29. Jan 2018)

Fasse am besten alles in einem Node zusammen, in eine VBox oder sonst was

```
vbRunningNode.getChildren( ).addAll(ellipse1 //usw);
```
und in dem startGame-Button tauschst du dann diesen Node aus:

```
startGame.setOnAction(e -> {
    GameState.state = GameState.RUNNING;
    rootPane.getChildren( ).clear;
    rootPane.getChildren( ).add(vbRunningNode)
 });
```


----------



## anonym123 (29. Jan 2018)

SchwarzWeiß hat gesagt.:


> Fasse am besten alles in einem Node zusammen, in eine VBox oder sonst was
> 
> ```
> vbRunningNode.getChildren( ).addAll(ellipse1 //usw);
> ...


Ich habe es mal so versucht, aber wenn ich den Button betätige dann werden diese Objekte immer noch nicht angezeigt. Die werden bei mir erst angezeigt, wenn ich sie direkt in setOnAction in die rootPane.getChildren().addAll(ellipse1,usw.) einsetze. Und mit den Fences habe ich dann auch ein Problem, da diese nur in der Schleife existieren


----------



## SchwarzWeiß (29. Jan 2018)

anonym123 hat gesagt.:


> Die werden bei mir erst angezeigt, wenn ich sie direkt in setOnAction in die rootPane.getChildren().addAll(ellipse1,usw.) einsetze.


Wenn es so funktioniert, dann ist dein Problem fürs erste aber gelöst oder?


----------



## anonym123 (29. Jan 2018)

SchwarzWeiß hat gesagt.:


> Wenn es so funktioniert, dann ist dein Problem fürs erste aber gelöst oder?


Ja Danke  hast du noch eine Idee wie ich auf die Fences zugreifen kann, weil die sind ja in der for each schleife.

```
Circle[] fences = Track.drawFences(numberF);
    for (Circle c : fences) {
      if (GameState.state == GameState.RUNNING) {
        rootPane.getChildren().addAll(c);
      }
    }
```


----------



## SchwarzWeiß (29. Jan 2018)

Kannst du die fences nicht als Attribut deklarieren?


----------



## anonym123 (29. Jan 2018)

SchwarzWeiß hat gesagt.:


> Kannst du die fences nicht als Attribut deklarieren?


Nein, da diese verschiedene random-Werte für ihre Positionen haben scheint mir das am Einfachsten zu sein. Und wie mir aufgefallen ist, funktionieren viele Funktionen nicht mehr richtig, wenn ich die einzelnen Objekte erst im EventHandler hinzufüge. Deshalb wollte ich das irgendwie über die States machen, aber ich weiß halt nicht wie ich diese immer aktualisieren kann.


----------

