GameState

anonym123

Mitglied
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.


Java:
package model;

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

  public static GameState state = GameState.START_SCREEN;
 
}

Code:
//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

Top Contributor
Moin,

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

VG Klaus
 

anonym123

Mitglied
Moin,

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

VG Klaus

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.
 

anonym123

Mitglied
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ß

Bekanntes Mitglied
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
Java:
StringProperty propertyGameState = new SimpleStringProperty(GameState.state.name());
Java:
label.textProperty().bind(property);
so etwa
 
Zuletzt bearbeitet:

anonym123

Mitglied
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
Java:
StringProperty propertyGameState = new SimpleStringProperty(GameState.state.name());
Java:
label.textProperty().bind(property);
so etwa
Danke für die Antwort, dass hat aber auch nicht funktioniert...
 

mrBrown

Super-Moderator
Mitarbeiter
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ß

Bekanntes Mitglied
Also mein erster Vorschlag sollte auf jeden Fall funktionieren:

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

anonym123

Mitglied
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...
 

anonym123

Mitglied
Du setzt ellipse1 zwar auf sichtbar, hast sie aber noch nirgends hinzugefügt oder?
Code:
 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ß

Bekanntes Mitglied
Fasse am besten alles in einem Node zusammen, in eine VBox oder sonst was
Java:
vbRunningNode.getChildren( ).addAll(ellipse1 //usw);
und in dem startGame-Button tauschst du dann diesen Node aus:
Java:
 startGame.setOnAction(e -> {
    GameState.state = GameState.RUNNING;
    rootPane.getChildren( ).clear;
    rootPane.getChildren( ).add(vbRunningNode)
 });
 
Zuletzt bearbeitet:

anonym123

Mitglied
Fasse am besten alles in einem Node zusammen, in eine VBox oder sonst was
Java:
vbRunningNode.getChildren( ).addAll(ellipse1 //usw);
und in dem startGame-Button tauschst du dann diesen Node aus:
Java:
 startGame.setOnAction(e -> {
    GameState.state = GameState.RUNNING;
    rootPane.getChildren( ).clear;
    rootPane.getChildren( ).add(vbRunningNode)
 });
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
 

anonym123

Mitglied
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.
Code:
Circle[] fences = Track.drawFences(numberF);
    for (Circle c : fences) {
      if (GameState.state == GameState.RUNNING) {
        rootPane.getChildren().addAll(c);
      }
    }
 

anonym123

Mitglied
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.
 

Neue Themen


Oben