From 066557584f3cc7f0d5dd380ab4a3e3d00ec2d621 Mon Sep 17 00:00:00 2001 From: Haoming Yin Date: Sat, 23 Sep 2017 19:37:13 +1200 Subject: [PATCH] Implemented turning mode toggle - when the mode is toggled, a boat action package will be sent to notify server to change the boat's turning mode - turning mode toggle is now fully functional #story[1245] --- .../java/seng302/gameServer/GameState.java | 37 +++++++-- .../gameServer/messages/BoatAction.java | 4 +- src/main/java/seng302/model/GameKeyBind.java | 4 +- src/main/java/seng302/model/ServerYacht.java | 81 +++++++++++-------- .../java/seng302/visualiser/GameClient.java | 7 ++ .../visualiser/controllers/ViewManager.java | 13 +-- .../dialogs/KeyBindingDialogController.java | 60 ++++++++++++-- .../views/dialogs/KeyBindingDialog.fxml | 8 +- 8 files changed, 152 insertions(+), 62 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 8ff2556c..5e8992ad 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -1,12 +1,35 @@ package seng302.gameServer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; import javafx.scene.paint.Color; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.xml.sax.InputSource; -import seng302.gameServer.messages.*; -import seng302.model.*; +import seng302.gameServer.messages.BoatAction; +import seng302.gameServer.messages.BoatStatus; +import seng302.gameServer.messages.ChatterMessage; +import seng302.gameServer.messages.CustomizeRequestType; +import seng302.gameServer.messages.MarkRoundingMessage; +import seng302.gameServer.messages.MarkType; +import seng302.gameServer.messages.Message; +import seng302.gameServer.messages.RoundingBoatStatus; +import seng302.gameServer.messages.YachtEventCodeMessage; +import seng302.gameServer.messages.YachtEventType; +import seng302.model.GeoPoint; +import seng302.model.Limit; +import seng302.model.Player; +import seng302.model.PolarTable; +import seng302.model.ServerYacht; import seng302.model.mark.CompoundMark; import seng302.model.mark.Mark; import seng302.model.mark.MarkOrder; @@ -14,10 +37,6 @@ import seng302.model.token.Token; import seng302.model.token.TokenType; import seng302.utilities.GeoUtility; import seng302.utilities.XMLParser; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import java.util.*; import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; /** @@ -272,6 +291,12 @@ public class GameState implements Runnable { case DOWNWIND: playerYacht.turnDownwind(); break; + case CONTINUOUSLY_TURNING: + playerYacht.setContinuouslyTurning(true); + break; + case DEFAULT_TURNING: + playerYacht.setContinuouslyTurning(false); + break; } } diff --git a/src/main/java/seng302/gameServer/messages/BoatAction.java b/src/main/java/seng302/gameServer/messages/BoatAction.java index 9003958a..9bd2131f 100644 --- a/src/main/java/seng302/gameServer/messages/BoatAction.java +++ b/src/main/java/seng302/gameServer/messages/BoatAction.java @@ -14,7 +14,9 @@ public enum BoatAction { TACK_GYBE(4), UPWIND(5), DOWNWIND(6), - MAINTAIN_HEADING(7); + MAINTAIN_HEADING(7), + CONTINUOUSLY_TURNING(8), + DEFAULT_TURNING(9); private final int type; private static final Map intToTypeMap = new HashMap<>(); diff --git a/src/main/java/seng302/model/GameKeyBind.java b/src/main/java/seng302/model/GameKeyBind.java index e400e6b5..1c765adc 100644 --- a/src/main/java/seng302/model/GameKeyBind.java +++ b/src/main/java/seng302/model/GameKeyBind.java @@ -10,7 +10,7 @@ public class GameKeyBind { private static GameKeyBind instance; private Map keyToActionMap; private Map actionToKeyMap; - private boolean continuouslyTurning; + private Boolean continuouslyTurning; private GameKeyBind() { @@ -71,7 +71,7 @@ public class GameKeyBind { continuouslyTurning = !continuouslyTurning; } - public boolean isContinuouslyTurning() { + public Boolean isContinuouslyTurning() { return continuouslyTurning; } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index e7d936ca..7dce048c 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -1,5 +1,6 @@ package seng302.model; +import java.util.HashMap; import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,10 +9,6 @@ import seng302.gameServer.messages.BoatStatus; import seng302.model.mark.Mark; import seng302.model.token.TokenType; import seng302.utilities.GeoUtility; - -import java.util.HashMap; -import java.util.Observable; -import java.util.Observer; import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; /** @@ -57,6 +54,8 @@ public class ServerYacht { private TokenType powerUp; private Long powerUpStartTime; + //turning mode + private Boolean continuouslyTurning; public ServerYacht(BoatMeshType boatType, Integer sourceId, String hullID, String shortName, String boatName, String country) { @@ -81,6 +80,8 @@ public class ServerYacht { this.hasEnteredRoundingZone = false; this.hasPassedLine = false; this.hasPassedThroughGate = false; + + this.continuouslyTurning = false; } @@ -188,44 +189,52 @@ public class ServerYacht { public void turnUpwind() { disableAutoPilot(); Double normalizedHeading = normalizeHeading(); - if (normalizedHeading == 0) { - if (lastHeading < 180) { - adjustHeading(-TURN_STEP); - } else { - adjustHeading(TURN_STEP); - } - } else if (normalizedHeading == 180) { - if (lastHeading < 180) { - adjustHeading(TURN_STEP); - } else { - adjustHeading(-TURN_STEP); - } - } else if (normalizedHeading < 180) { - adjustHeading(-TURN_STEP); - } else { + if (continuouslyTurning) { adjustHeading(TURN_STEP); + } else { + if (normalizedHeading == 0) { + if (lastHeading < 180) { + adjustHeading(-TURN_STEP); + } else { + adjustHeading(TURN_STEP); + } + } else if (normalizedHeading == 180) { + if (lastHeading < 180) { + adjustHeading(TURN_STEP); + } else { + adjustHeading(-TURN_STEP); + } + } else if (normalizedHeading < 180) { + adjustHeading(-TURN_STEP); + } else { + adjustHeading(TURN_STEP); + } } } public void turnDownwind() { disableAutoPilot(); Double normalizedHeading = normalizeHeading(); - if (normalizedHeading == 0) { - if (lastHeading < 180) { - adjustHeading(TURN_STEP); - } else { - adjustHeading(-TURN_STEP); - } - } else if (normalizedHeading == 180) { - if (lastHeading < 180) { - adjustHeading(-TURN_STEP); - } else { - adjustHeading(TURN_STEP); - } - } else if (normalizedHeading < 180) { - adjustHeading(TURN_STEP); - } else { + if (continuouslyTurning) { adjustHeading(-TURN_STEP); + } else { + if (normalizedHeading == 0) { + if (lastHeading < 180) { + adjustHeading(TURN_STEP); + } else { + adjustHeading(-TURN_STEP); + } + } else if (normalizedHeading == 180) { + if (lastHeading < 180) { + adjustHeading(-TURN_STEP); + } else { + adjustHeading(TURN_STEP); + } + } else if (normalizedHeading < 180) { + adjustHeading(TURN_STEP); + } else { + adjustHeading(-TURN_STEP); + } } } @@ -429,4 +438,8 @@ public class ServerYacht { public BoatMeshType getBoatType() { return boatType; } + + public void setContinuouslyTurning(Boolean continuouslyTurning) { + this.continuouslyTurning = continuouslyTurning; + } } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index d6227d98..72da551e 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -460,4 +460,11 @@ public class GameClient { return allBoatsMap; } + public void sendToggleTurningModePacket() { + if (gameKeyBind.isContinuouslyTurning()) { + socketThread.sendBoatAction(BoatAction.CONTINUOUSLY_TURNING); + } else { + socketThread.sendBoatAction(BoatAction.DEFAULT_TURNING); + } + } } diff --git a/src/main/java/seng302/visualiser/controllers/ViewManager.java b/src/main/java/seng302/visualiser/controllers/ViewManager.java index 49f76953..603e2295 100644 --- a/src/main/java/seng302/visualiser/controllers/ViewManager.java +++ b/src/main/java/seng302/visualiser/controllers/ViewManager.java @@ -27,6 +27,7 @@ import seng302.gameServer.ServerAdvertiser; import seng302.utilities.BonjourInstallChecker; import seng302.utilities.Sounds; import seng302.visualiser.GameClient; +import seng302.visualiser.controllers.dialogs.KeyBindingDialogController; public class ViewManager { @@ -213,6 +214,9 @@ public class ViewManager { JFXDialog dialog = new JFXDialog((StackPane) node, dialogContent.load(), DialogTransition.CENTER); + KeyBindingDialogController keyBindingDialogController = dialogContent + .getController(); + keyBindingDialogController.setGameClient(this.gameClient); dialog.show(); Sounds.playButtonClick(); } @@ -338,15 +342,6 @@ public class ViewManager { scene.setOnKeyPressed(gameClient::keyPressed); scene.setOnKeyReleased(gameClient::keyReleased); - // uncomment to make it full screen -// Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds(); -// stage.setX(visualBounds.getMinX()); -// stage.setY(visualBounds.getMinY()); -// stage.setWidth(visualBounds.getWidth()); -// stage.setHeight(visualBounds.getHeight()); -// stage.setMaximized(true); -// stage.setFullScreen(true); - stage.setMinHeight(500); stage.setMinWidth(800); stage.setTitle("Party Parrots At Sea"); diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/KeyBindingDialogController.java b/src/main/java/seng302/visualiser/controllers/dialogs/KeyBindingDialogController.java index 8621fd5b..7a372d4a 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/KeyBindingDialogController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/KeyBindingDialogController.java @@ -1,7 +1,6 @@ package seng302.visualiser.controllers.dialogs; import com.jfoenix.controls.JFXButton; -import com.jfoenix.controls.JFXDialogLayout; import com.jfoenix.controls.JFXToggleButton; import java.net.URL; import java.util.ArrayList; @@ -17,16 +16,13 @@ import javafx.scene.control.Label; import javafx.scene.input.KeyEvent; import seng302.model.GameKeyBind; import seng302.model.KeyAction; +import seng302.visualiser.GameClient; import seng302.visualiser.controllers.ViewManager; public class KeyBindingDialogController implements Initializable { //--------FXML BEGIN--------// @FXML - private JFXDialogLayout keyBindDialog; - @FXML - private Label keyBindingDialogHeader; - @FXML private JFXButton zoomInbtn; @FXML private JFXButton zoomOutBtn; @@ -43,7 +39,9 @@ public class KeyBindingDialogController implements Initializable { @FXML private JFXButton resetBtn; @FXML - private JFXButton confirmBtn; + private Label upwindLabel; + @FXML + private Label downwindLabel; @FXML private JFXToggleButton turningToggle; //---------FXML END---------// @@ -51,6 +49,7 @@ public class KeyBindingDialogController implements Initializable { private GameKeyBind gameKeyBind; private List buttons = new ArrayList<>(); private Map buttonActionMap; + private GameClient gameClient; // to send turning mode packet @Override public void initialize(URL location, ResourceBundle resources) { @@ -68,6 +67,8 @@ public class KeyBindingDialogController implements Initializable { button.setOnKeyPressed(event -> keyPressed(event, button)); }); + turningToggle.setOnMouseClicked(event -> toggleTurningMode()); + resetBtn.setOnMouseClicked(event -> { gameKeyBind.setToDefault(); loadKeyBind(); @@ -81,8 +82,19 @@ public class KeyBindingDialogController implements Initializable { buttons.forEach( button -> button .setText(gameKeyBind.getKeyCode(buttonActionMap.get(button)).getName())); + turningToggle.setSelected(gameKeyBind.isContinuouslyTurning()); + if (gameKeyBind.isContinuouslyTurning()) { + upwindLabel.setText("ClOCKWISE TURNING"); + downwindLabel.setText("ANTICLOCKWISE TURNING"); + } else { + upwindLabel.setText("UPWIND"); + downwindLabel.setText("DOWNWIND"); + } } + /** + * Bind buttons with specific action in a map. + */ private void bindButtonWithAction() { buttonActionMap = new HashMap<>(); for (int i = 0; i < 7; i++) { @@ -90,10 +102,17 @@ public class KeyBindingDialogController implements Initializable { } } + /** + * Prompt success / failure message for reassigning key action + */ private void showSnackBar(String message) { ViewManager.getInstance().showSnackbar(message); } + /** + * When a mouse enters the button, the color and font size should change to highlight + * @param button + */ private void mouseEnter(Button button) { button.setStyle("" + "-fx-background-color: -fx-pp-theme-color;" @@ -101,10 +120,20 @@ public class KeyBindingDialogController implements Initializable { + "-fx-font-size: 15;"); } + /** + * Prompt "press key..." to inform users assign a new key bind by pressing a key + * @param button + */ private void buttonPressed(Button button) { button.setText("PRESS KEY..."); } + + /** + * When mouse leaves the button, return the button to the normal state in terms of text, + * color and font size + * @param button + */ private void mouseExit(Button button) { button.setText(GameKeyBind.getInstance().getKeyCode(buttonActionMap.get(button)).getName()); button.setStyle("" @@ -113,6 +142,12 @@ public class KeyBindingDialogController implements Initializable { + "-fx-font-size: 13;"); } + /** + * When a key is pressed, check if the new binding conflicts to any existed settings, if not + * assign the selected action with the new key binding to GameKeyBind. + * @param event + * @param button + */ private void keyPressed(KeyEvent event, Button button) { KeyAction buttonAction = buttonActionMap.get(button); if (gameKeyBind.bindKeyToAction(event.getCode(), buttonAction)) { @@ -123,4 +158,17 @@ public class KeyBindingDialogController implements Initializable { } event.consume(); } + + /** + * When the turning mode is toggled, update gameKeyBind and send out packet to notify the server + */ + private void toggleTurningMode() { + gameKeyBind.toggleTurningMode(); + gameClient.sendToggleTurningModePacket(); + loadKeyBind(); + } + + public void setGameClient(GameClient gameClient) { + this.gameClient = gameClient; + } } diff --git a/src/main/resources/views/dialogs/KeyBindingDialog.fxml b/src/main/resources/views/dialogs/KeyBindingDialog.fxml index 9d7c503a..44c2cfbf 100644 --- a/src/main/resources/views/dialogs/KeyBindingDialog.fxml +++ b/src/main/resources/views/dialogs/KeyBindingDialog.fxml @@ -59,13 +59,13 @@ -