From c6f82fd7c10228b9bdb9789540a9f9b1629ea665 Mon Sep 17 00:00:00 2001 From: Seraina Date: Sat, 14 May 2022 13:28:42 +0200 Subject: [PATCH] Implemented a Thread that listens for changes in day/night in gameStateModel to simplify and reduce the tasks of client thread --- .../dbis/cs108/multiplayer/client/Client.java | 19 ++----- .../client/gui/DayNightChangeListener.java | 54 +++++++++++++++++++ .../client/gui/GameStateModel.java | 14 +++++ .../gui/TrainAnimationDayController.java | 18 +++++++ 4 files changed, 90 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/DayNightChangeListener.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 1e204c2..7bc4968 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -3,6 +3,7 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.gamelogic.ClientGameInfoHandler; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.DayNightChangeListener; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GUI; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.GameStateModel; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ChatApp; @@ -350,23 +351,12 @@ public class Client { switch (parameter) { case GuiParameters.night: //ClientGameInfoHandler; gameStateModel.setDayClone(false); - LOGGER.debug("----------------Night, Your role is:" + gameStateModel.getYourRole() + gameStateModel); - Sprites.setNightSprites(gameStateModel.getPassengerTrainClone()[1], GameController.getGameStateModel().getKickedOff()); - chatApp.getGameController().setNoiseButtonInvisible(); - chatApp.getGameController().setVoteButtonVisibilityNight(gameStateModel); break; case GuiParameters.day: //ClientGameInfoHandler gameStateModel.setDayClone(true); - LOGGER.debug("----------------Day, Your role is:" + gameStateModel.getYourRole()+ gameStateModel); - Sprites.setDaySprites(gameStateModel.getPassengerTrainClone()[1], GameController.getGameStateModel().getKickedOff()); - chatApp.getGameController().setNoiseButtonVisible(); - chatApp.getGameController().setVoteButtonVisibilityDay(gameStateModel); break; case GuiParameters.updateGameState: gameStateModel.setGSFromString(data); - chatApp.getGameController().updateGameSprites(LoungeSceneViewController.getTrainAnimationDayController()); - chatApp.getGameController().updateRoomLabels(); - gameStateModel.setRoleFromPosition(position); break; case GuiParameters.noiseHeardAtPosition: try { @@ -388,13 +378,12 @@ public class Client { break; case GuiParameters.viewChangeToGame: chatApp.getLoungeSceneViewController().addGameView(); - //TODO + gameStateModel.setGameOver(false); + new Thread(new DayNightChangeListener(gameStateModel, chatApp, position)).start(); break; - /*case GuiParameters.viewChangeToStart: - //TODO - break;*/ case GuiParameters.viewChangeToLobby: chatApp.getLoungeSceneViewController().removeGameView(); + gameStateModel.setGameOver(true); //TODO break; case GuiParameters.addNewMemberToLobby: diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/DayNightChangeListener.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/DayNightChangeListener.java new file mode 100644 index 0000000..069103b --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/DayNightChangeListener.java @@ -0,0 +1,54 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui; + + +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.GameController; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge.LoungeSceneViewController; + +/** + * This class adds methods to listen if there is a change in the day&night state and calls methods accordingly + */ +public class DayNightChangeListener implements Runnable { + + private GameStateModel gameStateModel; + private ChatApp chatApp; + private int position; + + public DayNightChangeListener(GameStateModel gameStateModel, ChatApp chatApp, int position) { + this.gameStateModel = gameStateModel; + this.chatApp = chatApp; + this.position = position; + } + + + @Override + public void run() { + try{ + while(!gameStateModel.isGameOver()) { + if(gameStateModel.getDayClone()) { //its Day + LoungeSceneViewController.getTrainAnimationDayController().dontShowFullWagon(); + Sprites.setDaySprites(gameStateModel.getPassengerTrainClone()[1], GameController.getGameStateModel().getKickedOff()); + chatApp.getGameController().setNoiseButtonVisible(); + chatApp.getGameController().setVoteButtonVisibilityDay(gameStateModel); + } else { //its night + if (gameStateModel.getYourRole().equals("h")) { + LoungeSceneViewController.getTrainAnimationDayController().showFullWagon(); + } + Sprites.setNightSprites(gameStateModel.getPassengerTrainClone()[1], GameController.getGameStateModel().getKickedOff()); + chatApp.getGameController().setNoiseButtonInvisible(); + chatApp.getGameController().setVoteButtonVisibilityNight(gameStateModel); + } + chatApp.getGameController().updateGameSprites(LoungeSceneViewController.getTrainAnimationDayController()); + chatApp.getGameController().updateRoomLabels(); + gameStateModel.setRoleFromPosition(position); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java index fb92397..81b037d 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/GameStateModel.java @@ -19,6 +19,11 @@ public class GameStateModel { */ private boolean isDayClone; + /** + * true if the game is over + */ + private boolean gameOver = false; + /** * can take the values h/g/s for human/ghost/spectator. Safes the role the client this GamesStateModel * lives on currently has @@ -48,6 +53,15 @@ public class GameStateModel { isDayClone = false; } + public void setGameOver(boolean gameOver) { + this.gameOver = gameOver; + } + + public boolean isGameOver() { + return gameOver; + } + + /** * Updates the passengerTrainClone * @param names an array of the names of the players diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/TrainAnimationDayController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/TrainAnimationDayController.java index ed96fcf..7a9fbaf 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/TrainAnimationDayController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/TrainAnimationDayController.java @@ -94,6 +94,24 @@ public class TrainAnimationDayController implements Initializable { } }); } + + public void showFullWagon() { + Platform.runLater(new Runnable() { + @Override + public void run() { + wagonFullImageView.setVisible(true); + } + }); + } + + public void dontShowFullWagon() { + Platform.runLater(new Runnable() { + @Override + public void run() { + wagonFullImageView.setVisible(false); + } + }); + } /** * Adds the gameView to the existing LobbyView