From d2d5ae62eb83ef148ab289033bc1bd6d9152e05f Mon Sep 17 00:00:00 2001 From: David Wu Date: Sun, 10 Sep 2017 17:11:20 +1200 Subject: [PATCH] Tutorial states implemented and working. Game currently prints to terminal the "tutorial text". Next step is to create display on application for these text. Game ends when tutorial ends. Fixed game not loading xml issue. #story[1189] --- .../src/main/java/mock/app/Event.java | 1 + .../Controllers/HostController.java | 2 + .../Controllers/MainController.java | 2 + .../Controllers/RaceController.java | 85 +++++++++++++++++++ .../Controllers/StartController.java | 3 - .../java/visualiser/enums/TutorialState.java | 66 ++++++++++++++ .../mock/mockXML/raceSinglePlayer.xml | 1 - .../mock/mockXML/raceThreePlayers.xml | 3 - .../resources/mock/mockXML/raceTutorial.xml | 2 +- .../resources/visualiser/scenes/race.fxml | 26 +++--- 10 files changed, 173 insertions(+), 18 deletions(-) create mode 100644 racevisionGame/src/main/java/visualiser/enums/TutorialState.java diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 2f43b9cb..daab1162 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -94,6 +94,7 @@ public class Event { } if (gameType == 2){ + System.out.println("In gametype 2"); raceXMLFile = "mock/mockXML/raceTutorial.xml"; boatsXMLFile = "mock/mockXML/boatTutorial.xml"; regattaXMLFile = "mock/mockXML/regattaTutorial.xml"; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index e0f8654d..839abc57 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -159,4 +159,6 @@ public class HostController extends Controller { this.gameType = gameType; } + public int getGameType(){ return this.gameType; } + } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java index ef749d90..b81bf918 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java @@ -98,6 +98,8 @@ public class MainController extends Controller { hostController.setGameType(gameType); } + public int getGameType(){ return hostController.getGameType(); } + /** * Main Controller for the applications will house the menu and the displayed pane. * diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index e864993d..0ae11f67 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -24,6 +24,7 @@ import shared.dataInput.RaceDataSource; import shared.model.Leg; import shared.model.Mark; import visualiser.app.App; +import visualiser.enums.TutorialState; import visualiser.gameController.ControllerClient; import visualiser.gameController.Keys.ControlKey; import visualiser.gameController.Keys.KeyFactory; @@ -34,6 +35,8 @@ import visualiser.utils.GPSConverter; import java.io.IOException; import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Optional; import java.util.ResourceBundle; import java.util.logging.Level; @@ -58,6 +61,13 @@ public class RaceController extends Controller { private boolean isHost; + private TutorialState currentState; + + private ArrayList tutorialStates; + + private boolean isTutorial = false; + + /** * state of the info table */ @@ -110,13 +120,25 @@ public class RaceController extends Controller { if(controlKey != null) { try { controlKey.onAction(); // Change key state if applicable + + if (isTutorial){ + if (controlKey.getProtocolCode().equals(currentState.getAction())){ + updateTutorialState(); + } + } + + controllerClient.sendKey(controlKey); event.consume(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); Logger.getGlobal().log(Level.WARNING, "RaceController was interrupted on thread: " + Thread.currentThread() + "while sending: " + controlKey, e); + } catch (Exception e) { + e.printStackTrace(); } } + + if(event.getCode() == KeyCode.ESCAPE) { try { @@ -246,6 +268,8 @@ public class RaceController extends Controller { } + + /** * Initialises the frame rate functionality. This allows for toggling the frame rate, and connect the fps label to the race's fps property. * @param visualiserRace The race to connect the fps label to. @@ -422,6 +446,18 @@ public class RaceController extends Controller { this.controllerClient = controllerClient; this.isHost = isHost; + + //Check if the game is a tutorial + if (parent.getGameType()==2){ + isTutorial = true; + tutorialStates = new ArrayList<>(Arrays.asList(TutorialState.values())); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + System.out.println(currentState); + System.out.println(tutorialStates); + + } + initialiseRace(); //Display this controller. @@ -519,4 +555,53 @@ public class RaceController extends Controller { infoTableShow = !infoTableShow; } + private void updateTutorialState() throws Exception { + switch (currentState){ + case UPWIND: + System.out.println("You turned upwind. Now go downwind."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case DOWNWIND: + System.out.println("You turned downwind. Now go tack/gybe."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case TACKGYBE: + System.out.println("You tack/gybe. Now go VMG."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case VMG: + System.out.println("You VMG. Now sails-in."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case SAILSIN: + System.out.println("You sails-in. Now sails-out."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + case SAILSOUT: + System.out.println("You sails-out. Tutorial finished. Well done!"); + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Finished Tutorial"); + alert.setHeaderText("You have finished the tutorial."); + alert.setContentText("Now you know the controls you are ready to race!"); + Optional result = alert.showAndWait(); + if (result.get() == ButtonType.OK) { + parent.endEvent(); + racePane.setVisible(false); + App.app.showMainStage(App.getStage()); + } + break; + default: + System.out.println("Something went wrong."); + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + break; + } + + } + } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java index b46bf79f..6d073ed8 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java @@ -86,9 +86,6 @@ public class StartController extends Controller { - - - /** * Ctor. */ diff --git a/racevisionGame/src/main/java/visualiser/enums/TutorialState.java b/racevisionGame/src/main/java/visualiser/enums/TutorialState.java new file mode 100644 index 00000000..57c17e77 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/enums/TutorialState.java @@ -0,0 +1,66 @@ +package visualiser.enums; + +import javafx.scene.input.KeyCode; +import network.Messages.BoatAction; +import network.Messages.Enums.BoatActionEnum; +import visualiser.gameController.Keys.ControlKey; +import static visualiser.app.App.keyFactory; + +import java.util.ArrayList; + +/** + * Created by zwu18 on 10/09/17. + */ +public enum TutorialState { + + + +// keyState.put("Z", new ZoomInKey()); +// keyState.put("X", new ZoomOutKey()); +// keyState.put("SPACE", new VMGKey()); +// keyState.put("SHIFT", new SailsToggleKey()); +// keyState.put("ENTER", new TackGybeKey()); +// keyState.put("UP", new UpWindKey()); +// keyState.put("DOWN", new DownWindKey()); + + /** + * State for upwind in tutorial + */ + UPWIND(BoatActionEnum.UPWIND), + + /** + * State for downwind in tutorial + */ + DOWNWIND(BoatActionEnum.DOWNWIND), + + /** + * State for tacking/gybing in tutorial + */ + TACKGYBE(BoatActionEnum.TACK_GYBE), + + /** + * State for vmg in tutorial + */ + VMG(BoatActionEnum.AUTO_PILOT), + + /** + * State for sails-in in tutorial + */ + SAILSIN(BoatActionEnum.SAILS_IN), + + /** + * State for sails-out in tutorial + */ + SAILSOUT(BoatActionEnum.SAILS_OUT); + + private BoatActionEnum action; + + TutorialState(BoatActionEnum action){ + this.action = action; + } + + public BoatActionEnum getAction(){ + return action; + } + +} diff --git a/racevisionGame/src/main/resources/mock/mockXML/raceSinglePlayer.xml b/racevisionGame/src/main/resources/mock/mockXML/raceSinglePlayer.xml index e9e9378a..c4efcd17 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/raceSinglePlayer.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/raceSinglePlayer.xml @@ -5,7 +5,6 @@ RACE_CREATION_TIME - diff --git a/racevisionGame/src/main/resources/mock/mockXML/raceThreePlayers.xml b/racevisionGame/src/main/resources/mock/mockXML/raceThreePlayers.xml index e0b81837..c4efcd17 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/raceThreePlayers.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/raceThreePlayers.xml @@ -5,9 +5,6 @@ RACE_CREATION_TIME - - - diff --git a/racevisionGame/src/main/resources/mock/mockXML/raceTutorial.xml b/racevisionGame/src/main/resources/mock/mockXML/raceTutorial.xml index 19d358cd..ecc59e40 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/raceTutorial.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/raceTutorial.xml @@ -5,7 +5,7 @@ RACE_CREATION_TIME - + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/race.fxml b/racevisionGame/src/main/resources/visualiser/scenes/race.fxml index b6496743..5adc3efd 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/race.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/race.fxml @@ -1,5 +1,11 @@ + + + + + + @@ -22,7 +28,7 @@ - + @@ -46,16 +52,16 @@ - + -