From cc264f318ea56a4524ad1f2c5cd805b70f8abf9a Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Wed, 26 Jul 2017 22:57:01 +1200 Subject: [PATCH 1/9] Added ControllerClient and ControllerServer - StartController sets up client-wide ControllerClient on socket to game server. - RaceController now calls ControllerClient.sendKey with each keypress - ConnectionAcceptor runs ControllerServer for each successfully connected client #story[1089] --- .../java/mock/app/ConnectionAcceptor.java | 3 ++ .../src/main/java/mock/app/Event.java | 1 - .../Controllers/ConnectionController.java | 2 +- .../Controllers/MainController.java | 5 +- .../Controllers/RaceController.java | 16 +++++- .../Controllers/StartController.java | 7 ++- .../gameController/ControllerClient.java | 46 +++++++++++++++++ .../gameController/ControllerServer.java | 51 +++++++++++++++++++ .../gameController/Keys/KeyFactory.java | 2 +- 9 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java create mode 100644 racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 4c2b38ce..97a974a9 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -4,6 +4,7 @@ import network.Messages.Enums.XMLMessageType; import network.Messages.LatestMessages; import network.Messages.XMLMessage; import org.mockito.Mock; +import visualiser.gameController.ControllerServer; import java.io.DataOutputStream; import java.io.IOException; @@ -75,7 +76,9 @@ public class ConnectionAcceptor implements Runnable { Socket mockSocket = serverSocket.accept(); DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); MockOutput mockOutput = new MockOutput(latestMessages, outToVisualiser); + ControllerServer controllerServer = new ControllerServer(mockSocket); new Thread(mockOutput).start(); + new Thread(controllerServer).start(); mockOutputList.add(mockOutput); System.out.println(String.format("%d number of Visualisers Connected.", mockOutputList.size())); } catch (IOException e) { diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 3ba6841c..b2c5b243 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -94,7 +94,6 @@ public class Event { MockRace newRace = new MockRace(boatDataSource, raceDataSource, regattaDataSource, this.latestMessages, this.boatPolars, Constants.RaceTimeScale); new Thread(newRace).start(); - } /** diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index 87477bea..7652f98e 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -53,7 +53,7 @@ public class ConnectionController extends Controller { statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty()); connectionTable.getSelectionModel().selectedItemProperty().addListener((obs, prev, curr) -> { - if (curr != null && ((RaceConnection)curr).check()) connectButton.setDisable(false); + if (curr != null && curr.check()) connectButton.setDisable(false); else connectButton.setDisable(true); }); connectButton.setDisable(true); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java index 262c3c8a..d258e695 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java @@ -4,6 +4,7 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.layout.AnchorPane; import visualiser.app.VisualiserInput; +import visualiser.gameController.ControllerClient; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRace; @@ -36,8 +37,8 @@ public class MainController extends Controller { * @param visualiserInput The object used to read packets from the race server. * @param visualiserRace The object modelling the race. */ - public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace) { - raceController.startRace(visualiserInput, visualiserRace); + public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) { + raceController.startRace(visualiserInput, visualiserRace, controllerClient); } /** diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index 427e152c..476d4309 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -19,11 +19,13 @@ import javafx.util.Callback; import network.Messages.Enums.RaceStatusEnum; import shared.model.Leg; import visualiser.app.VisualiserInput; +import visualiser.gameController.ControllerClient; import visualiser.gameController.Keys.ControlKey; import visualiser.gameController.Keys.KeyFactory; import visualiser.model.*; import java.awt.*; +import java.io.IOException; import java.net.URL; import java.text.DecimalFormat; import java.util.ResourceBundle; @@ -58,6 +60,11 @@ public class RaceController extends Controller { */ private Sparkline sparkline; + /** + * Service for sending keystrokes to server + */ + private ControllerClient controllerClient; + @FXML private GridPane canvasBase; @FXML private Pane arrow; @@ -90,7 +97,11 @@ public class RaceController extends Controller { String codeString = event.getCode().toString(); ControlKey controlKey = KeyFactory.getKey(codeString); if(controlKey != null) { - System.out.println(controlKey.toString() + " is Pressed."); + try { + controllerClient.sendKey(controlKey); + } catch (IOException e) { + e.printStackTrace(); + } } }); } @@ -324,10 +335,11 @@ public class RaceController extends Controller { * @param visualiserInput Object used to read packets from server. * @param visualiserRace Object modelling the race. */ - public void startRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace) { + public void startRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) { this.visualiserInput = visualiserInput; this.visualiserRace = visualiserRace; + this.controllerClient = controllerClient; initialiseRace(); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java index 2735023e..8db4ec60 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java @@ -19,6 +19,7 @@ import shared.exceptions.InvalidRaceDataException; import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; import visualiser.app.VisualiserInput; +import visualiser.gameController.ControllerClient; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRace; @@ -76,6 +77,8 @@ public class StartController extends Controller implements Observer { */ private VisualiserRace visualiserRace; + private ControllerClient controllerClient; + /** * An array of colors used to assign colors to each boat - passed in to the VisualiserRace constructor. */ @@ -258,7 +261,7 @@ public class StartController extends Controller implements Observer { startWrapper.setVisible(false); start.setVisible(false); - parent.beginRace(visualiserInput, visualiserRace); + parent.beginRace(visualiserInput, visualiserRace, controllerClient); } } }.start(); @@ -308,6 +311,8 @@ public class StartController extends Controller implements Observer { try { //Begin reading packets from the socket/server. this.visualiserInput = new VisualiserInput(socket); + //Send controller input to server + this.controllerClient = new ControllerClient(socket); //Store a reference to latestMessages so that we can observe it. LatestMessages latestMessages = this.visualiserInput.getLatestMessages(); latestMessages.addObserver(this); diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java new file mode 100644 index 00000000..8a74e394 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -0,0 +1,46 @@ +package visualiser.gameController; + +import visualiser.gameController.Keys.ControlKey; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.nio.ByteBuffer; + +/** + * Basic service for sending key presses to game server + */ +public class ControllerClient { + /** + * Socket to server + */ + Socket socket; + + /** + * Output stream wrapper for socket to server + */ + DataOutputStream outputStream; + + /** + * Initialise controller client with live socket. + * @param socket to server + */ + public ControllerClient(Socket socket) { + this.socket = socket; + try { + this.outputStream = new DataOutputStream(socket.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Send a keypress to server + * @param key to send + * @throws IOException if socket write fails + */ + public void sendKey(ControlKey key) throws IOException { + // TODO - get and send action number currently corresponding to key (context dependent) + System.out.println(key.toString()); + } +} diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java new file mode 100644 index 00000000..012d3087 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -0,0 +1,51 @@ +package visualiser.gameController; + +import visualiser.gameController.Keys.ControlKey; +import visualiser.gameController.Keys.KeyFactory; + +import java.io.DataInputStream; +import java.io.IOException; +import java.net.Socket; + +/** + * Service for dispatching key press data to race from client + */ +public class ControllerServer implements Runnable { + /** + * Socket to client + */ + private Socket socket; + /** + * Wrapper for input from client + */ + private DataInputStream inputStream; + + /** + * Initialise server-side controller with live client socket + * @param socket to client + */ + public ControllerServer(Socket socket) { + this.socket = socket; + try { + this.inputStream = new DataInputStream(this.socket.getInputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Wait for controller key input from client and loop. + */ + @Override + public void run() { + while(true) { + byte[] key = new byte[1]; + try { + inputStream.read(key); + // TODO - handle messages received + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java index 6e4d403b..70e9c670 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java @@ -8,7 +8,7 @@ import javafx.scene.input.KeyCode; public class KeyFactory { /** - * Get the Control Key incharge of a key press + * Get the Control Key in charge of a key press * @param key key pressed (String value of KeyCode) * @return the Control Key behaviour of the key pressed. */ From 86e8cb756004acb51d2ee81b9b5c686c799171d6 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Wed, 26 Jul 2017 23:22:05 +1200 Subject: [PATCH 2/9] Refactored KeyFactory to ensure single instance of each key state handler. #story[1089] --- .../Controllers/RaceController.java | 4 +- .../gameController/InputChecker.java | 8 ++- .../gameController/Keys/ControlKey.java | 5 +- .../gameController/Keys/DownWindKey.java | 9 +-- .../gameController/Keys/KeyFactory.java | 55 ++++++++++++------- .../gameController/Keys/SailsToggleKey.java | 9 +-- .../gameController/Keys/TackGybeKey.java | 9 +-- .../gameController/Keys/UpWindKey.java | 9 +-- .../gameController/Keys/VMGKey.java | 5 +- .../gameController/Keys/ZoomInKey.java | 4 +- .../gameController/Keys/ZoomOutKey.java | 9 +-- 11 files changed, 63 insertions(+), 63 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index 476d4309..97f1896d 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -92,10 +92,12 @@ public class RaceController extends Controller { @Override public void initialize(URL location, ResourceBundle resources) { + KeyFactory keyFactory = KeyFactory.getFactory(); + // Initialise keyboard handler race.addEventFilter(KeyEvent.KEY_PRESSED, event -> { String codeString = event.getCode().toString(); - ControlKey controlKey = KeyFactory.getKey(codeString); + ControlKey controlKey = keyFactory.getKey(codeString); if(controlKey != null) { try { controllerClient.sendKey(controlKey); diff --git a/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java index 19361b32..34a7d544 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java +++ b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java @@ -20,10 +20,12 @@ public class InputChecker { * @param scene Scene the controller is to run in parallel with. */ public void runWithScene(Scene scene){ + KeyFactory keyFactory = KeyFactory.getFactory(); + scene.setOnKeyPressed(event -> { String codeString = event.getCode().toString(); if (!currentlyActiveKeys.containsKey(codeString)) { - ControlKey controlKey = KeyFactory.getKey(codeString); + ControlKey controlKey = keyFactory.getKey(codeString); if (controlKey != null) { controlKey.onAction(); System.out.println(controlKey.toString() + " is Pressed."); @@ -34,7 +36,7 @@ public class InputChecker { scene.setOnKeyReleased(event -> { String codeString = event.getCode().toString(); - ControlKey controlKey = KeyFactory.getKey(codeString); + ControlKey controlKey = keyFactory.getKey(codeString); if (controlKey != null) { controlKey.onRelease(); System.out.println(controlKey.toString() + " is Released."); @@ -46,7 +48,7 @@ public class InputChecker { @Override public void handle(long now) { for (String key: currentlyActiveKeys.keySet()){ - ControlKey controlKey = KeyFactory.getKey(key); + ControlKey controlKey = keyFactory.getKey(key); if (controlKey != null){ controlKey.onHold(); System.out.println(controlKey.toString() + " is Held."); diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java index 7f067fb1..1af6b4d8 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java @@ -8,16 +8,13 @@ import javafx.scene.input.KeyCode; public abstract class ControlKey { private String name; - private KeyCode keyCode; /** * Constructor for Control * @param name name of the key - * @param keyCode key code for the key */ - public ControlKey(String name, KeyCode keyCode){ + public ControlKey(String name){ this.name = name; - this.keyCode = keyCode; } /** diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java index 3f36bf08..03be1c3f 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java @@ -1,7 +1,5 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; - /** * Key to send downwind packet to server */ @@ -9,12 +7,11 @@ public class DownWindKey extends ControlKey { /** * Constructor for Control + * @param name name of the key * - * @param name name of the key - * @param keyCode key code for the key */ - public DownWindKey(String name, KeyCode keyCode) { - super(name, keyCode); + public DownWindKey(String name) { + super(name); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java index 70e9c670..ef1368f0 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java @@ -1,36 +1,51 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; +import java.util.HashMap; +import java.util.Map; /** * Factory for creating Keys, these could be predefined in the future. */ public class KeyFactory { + /** + * Retrieve command given key + */ + private Map keyState; + + /** + * Singleton instance to enforce consistent key state + */ + private static KeyFactory theFactory = new KeyFactory(); + + /** + * Singleton constructor for key state, set up initial state of each action. + */ + private KeyFactory() { + this.keyState = new HashMap<>(); + keyState.put("Z", new ZoomInKey("Zoom In")); + keyState.put("X", new ZoomOutKey("Zoom Out")); + keyState.put("SPACE", new VMGKey("VMG")); + keyState.put("SHIFT", new SailsToggleKey("Toggle Sails")); + keyState.put("ENTER", new TackGybeKey("Tack/Gybe")); + keyState.put("PAGE_UP", new UpWindKey("Upwind")); + keyState.put("PAGE_DOWN", new DownWindKey("Downwind")); + } + + /** + * Get singleton instance of KeyFactory to interact with key state + * @return automatically constructed KeyFactory + */ + public static KeyFactory getFactory() { + return theFactory; + } /** * Get the Control Key in charge of a key press * @param key key pressed (String value of KeyCode) * @return the Control Key behaviour of the key pressed. */ - public static ControlKey getKey(String key){ - switch(key){ - case "Z": - return new ZoomInKey("Z", KeyCode.Z); - case "X": - return new ZoomOutKey("X", KeyCode.X); - case "SPACE": - return new VMGKey("SPACE", KeyCode.SPACE); - case "SHIFT": - return new SailsToggleKey("SHIFT", KeyCode.SHIFT); - case "ENTER": - return new TackGybeKey("ENTER", KeyCode.ENTER); - case "PAGE_UP": - return new UpWindKey("PAGE_UP", KeyCode.PAGE_UP); - case "PAGE_DOWN": - return new DownWindKey("PAGE_DOWN", KeyCode.PAGE_DOWN); - default: - return null; - } + public ControlKey getKey(String key){ + return keyState.get(key); } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java index f8a4278d..0a0c43d1 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java @@ -1,7 +1,5 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; - /** * Key to toggle the sails */ @@ -9,12 +7,11 @@ public class SailsToggleKey extends ControlKey { /** * Constructor for Control + * @param name name of the key * - * @param name name of the key - * @param keyCode key code for the key */ - public SailsToggleKey(String name, KeyCode keyCode) { - super(name, keyCode); + public SailsToggleKey(String name) { + super(name); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java index 8e2e424c..6bd91b47 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java @@ -1,7 +1,5 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; - /** * key to toggle between tacking and gybing */ @@ -9,12 +7,11 @@ public class TackGybeKey extends ControlKey { /** * Constructor for Control + * @param name name of the key * - * @param name name of the key - * @param keyCode key code for the key */ - public TackGybeKey(String name, KeyCode keyCode) { - super(name, keyCode); + public TackGybeKey(String name) { + super(name); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java index 0744f8df..b7465683 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java @@ -1,7 +1,5 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; - /** * Key to go upwind */ @@ -9,12 +7,11 @@ public class UpWindKey extends ControlKey { /** * Constructor for Control + * @param name name of the key * - * @param name name of the key - * @param keyCode key code for the key */ - public UpWindKey(String name, KeyCode keyCode) { - super(name, keyCode); + public UpWindKey(String name) { + super(name); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java index a9a15695..bd2cd16f 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java @@ -11,10 +11,9 @@ public class VMGKey extends ControlKey{ * Constructor for Control * * @param name name of the key - * @param keyCode key code for the key */ - public VMGKey(String name, KeyCode keyCode) { - super(name, keyCode); + public VMGKey(String name) { + super(name); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java index 0d990a54..35b6ce94 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java @@ -7,8 +7,8 @@ import javafx.scene.input.KeyCode; */ public class ZoomInKey extends ControlKey { - public ZoomInKey(String name, KeyCode keyCode) { - super(name, keyCode); + public ZoomInKey(String name) { + super(name); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomOutKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomOutKey.java index 62289847..6da2210c 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomOutKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomOutKey.java @@ -1,7 +1,5 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; - /** * Key to zoom out of the game. */ @@ -9,12 +7,11 @@ public class ZoomOutKey extends ControlKey{ /** * Constructor for Control + * @param name name of the key * - * @param name name of the key - * @param keyCode key code for the key */ - public ZoomOutKey(String name, KeyCode keyCode) { - super(name, keyCode); + public ZoomOutKey(String name) { + super(name); } @Override From e670ded66d574b5fa882f5fc9b3331e30fb16457 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Wed, 26 Jul 2017 23:40:39 +1200 Subject: [PATCH 3/9] ControllerClient can retrieve valid protocol code from each key press - ControlKey now includes protocolCode property - RaceController now fires action with each key press - Shift toggles sail state appropriately #story[1089] --- .../visualiser/Controllers/RaceController.java | 1 + .../gameController/ControllerClient.java | 2 +- .../gameController/Keys/ControlKey.java | 18 +++++++++++++++++- .../gameController/Keys/DownWindKey.java | 2 +- .../gameController/Keys/SailsToggleKey.java | 7 +++++-- .../gameController/Keys/TackGybeKey.java | 2 +- .../gameController/Keys/UpWindKey.java | 2 +- .../visualiser/gameController/Keys/VMGKey.java | 2 +- 8 files changed, 28 insertions(+), 8 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index 97f1896d..2a4a4163 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -101,6 +101,7 @@ public class RaceController extends Controller { if(controlKey != null) { try { controllerClient.sendKey(controlKey); + controlKey.onAction(); // Change key state if applicable } catch (IOException e) { e.printStackTrace(); } diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java index 8a74e394..d3e9fea8 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -41,6 +41,6 @@ public class ControllerClient { */ public void sendKey(ControlKey key) throws IOException { // TODO - get and send action number currently corresponding to key (context dependent) - System.out.println(key.toString()); + System.out.println(key.toString() + ": " + key.getProtocolCode()); } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java index 1af6b4d8..ad8a559a 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java @@ -8,13 +8,29 @@ import javafx.scene.input.KeyCode; public abstract class ControlKey { private String name; + protected int protocolCode; /** - * Constructor for Control + * Constructor for key state with specified protocol code + * @param name of action + * @param protocolCode -1 if not sent + */ + public ControlKey(String name, int protocolCode) { + this.name = name; + this.protocolCode = protocolCode; + } + + /** + * Constructor for key state not sent over network * @param name name of the key */ public ControlKey(String name){ this.name = name; + this.protocolCode = -1; + } + + public int getProtocolCode() { + return protocolCode; } /** diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java index 03be1c3f..6d929ca1 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java @@ -11,7 +11,7 @@ public class DownWindKey extends ControlKey { * */ public DownWindKey(String name) { - super(name); + super(name, 6); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java index 0a0c43d1..d29d3a8f 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java @@ -11,12 +11,15 @@ public class SailsToggleKey extends ControlKey { * */ public SailsToggleKey(String name) { - super(name); + super(name, 2); } + /** + * Toggle command associated with sails key + */ @Override public void onAction() { - + protocolCode = protocolCode == 2? 1 : 2; } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java index 6bd91b47..cf9a0699 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java @@ -11,7 +11,7 @@ public class TackGybeKey extends ControlKey { * */ public TackGybeKey(String name) { - super(name); + super(name, 4); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java index b7465683..85f7fc4b 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java @@ -11,7 +11,7 @@ public class UpWindKey extends ControlKey { * */ public UpWindKey(String name) { - super(name); + super(name, 5); } @Override diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java index bd2cd16f..e6d82ba7 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java @@ -13,7 +13,7 @@ public class VMGKey extends ControlKey{ * @param name name of the key */ public VMGKey(String name) { - super(name); + super(name, 1); } @Override From 0352e3310d49a708855e1ee731af23abf092bef4 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Thu, 27 Jul 2017 00:48:19 +1200 Subject: [PATCH 4/9] Set up Boat Action Message encoding - Fixed command number for sails out #story[1089] --- .../main/java/network/BinaryMessageEncoder.java | 9 +++++++++ .../java/network/Messages/Enums/MessageType.java | 1 + .../gameController/ControllerClient.java | 15 +++++++++++++-- .../gameController/ControllerServer.java | 2 +- .../gameController/Keys/SailsToggleKey.java | 2 +- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/racevisionGame/src/main/java/network/BinaryMessageEncoder.java b/racevisionGame/src/main/java/network/BinaryMessageEncoder.java index f7dc12a7..ced31af1 100644 --- a/racevisionGame/src/main/java/network/BinaryMessageEncoder.java +++ b/racevisionGame/src/main/java/network/BinaryMessageEncoder.java @@ -94,6 +94,15 @@ public class BinaryMessageEncoder { this.fullMessage = tempFullMessageByteBuffer.array(); } + /** + * Construct a binary message from message type and message body. + * @param headerMessageType of message + * @param messageBody of message + */ + public BinaryMessageEncoder(MessageType headerMessageType, byte[] messageBody) { + this(headerMessageType, System.currentTimeMillis(), 69, (short)messageBody.length, messageBody); + } + /** * Returns the full encoded message. This includes the header, body, and CRC. * @return Full encoded message. diff --git a/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java b/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java index 6b8fd775..086673f5 100644 --- a/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java +++ b/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java @@ -19,6 +19,7 @@ public enum MessageType { MARKROUNDING(38), COURSEWIND(44), AVGWIND(47), + BOATACTION(100), NOTAMESSAGE(0); ///Primitive value of the enum. diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java index d3e9fea8..0981f570 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -1,10 +1,13 @@ package visualiser.gameController; +import network.BinaryMessageEncoder; +import network.Messages.Enums.MessageType; import visualiser.gameController.Keys.ControlKey; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; +import java.net.SocketException; import java.nio.ByteBuffer; /** @@ -27,6 +30,7 @@ public class ControllerClient { */ public ControllerClient(Socket socket) { this.socket = socket; + try { this.outputStream = new DataOutputStream(socket.getOutputStream()); } catch (IOException e) { @@ -40,7 +44,14 @@ public class ControllerClient { * @throws IOException if socket write fails */ public void sendKey(ControlKey key) throws IOException { - // TODO - get and send action number currently corresponding to key (context dependent) - System.out.println(key.toString() + ": " + key.getProtocolCode()); + int protocolCode = key.getProtocolCode(); + if(protocolCode > -1) { + ByteBuffer buffer = ByteBuffer.allocate(4); + buffer.putInt(protocolCode); + byte[] message = new byte[]{buffer.get(3)}; + BinaryMessageEncoder binaryMessage = new BinaryMessageEncoder(MessageType.BOATACTION, message); + //outputStream.write(binaryMessage.getFullMessage()); + System.out.println("Binary message constructed"); + } } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index 012d3087..2e391d2a 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -39,7 +39,7 @@ public class ControllerServer implements Runnable { @Override public void run() { while(true) { - byte[] key = new byte[1]; + byte[] key = new byte[16]; try { inputStream.read(key); // TODO - handle messages received diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java index d29d3a8f..bc9b81a6 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java @@ -19,7 +19,7 @@ public class SailsToggleKey extends ControlKey { */ @Override public void onAction() { - protocolCode = protocolCode == 2? 1 : 2; + protocolCode = protocolCode == 2? 3 : 2; } @Override From 0ea7fb8c8411d7d0d83ff20b0c3bd9ea704d23cc Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 27 Jul 2017 12:23:44 +1200 Subject: [PATCH 5/9] Merging main features into story 6. App now sends and receives key strokes. #story[1007, 1089] --- .../java/network/BinaryMessageDecoder.java | 4 ++ .../MessageDecoders/BoatActionDecoder.java | 20 ++++++ .../RaceVisionByteEncoder.java | 7 ++ .../java/network/Messages/BoatAction.java | 22 ++++++ .../Messages/Enums/BoatActionEnum.java | 71 +++++++++++++++++++ .../gameController/ControllerClient.java | 21 ++++-- .../gameController/ControllerServer.java | 14 +++- 7 files changed, 150 insertions(+), 9 deletions(-) create mode 100644 racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java create mode 100644 racevisionGame/src/main/java/network/Messages/BoatAction.java create mode 100644 racevisionGame/src/main/java/network/Messages/Enums/BoatActionEnum.java diff --git a/racevisionGame/src/main/java/network/BinaryMessageDecoder.java b/racevisionGame/src/main/java/network/BinaryMessageDecoder.java index 1c34ca85..ecc6b2f3 100644 --- a/racevisionGame/src/main/java/network/BinaryMessageDecoder.java +++ b/racevisionGame/src/main/java/network/BinaryMessageDecoder.java @@ -193,6 +193,10 @@ public class BinaryMessageDecoder { AverageWindDecoder awDecoder = new AverageWindDecoder(messageBody); return awDecoder.getAverageWind(); + case BOATACTION: + BoatActionDecoder baDecoder = new BoatActionDecoder(messageBody); + return new BoatAction(baDecoder.getBoatAction()); + default: //System.out.println("Broken Message!"); //throw new InvalidMessageException("Broken message! Did not recognise message type: " + headerMessageType + "."); diff --git a/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java b/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java new file mode 100644 index 00000000..bf2076b5 --- /dev/null +++ b/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java @@ -0,0 +1,20 @@ +package network.MessageDecoders; + +import network.Messages.Enums.BoatActionEnum; + +import java.util.Arrays; + +public class BoatActionDecoder { + byte byteBoatAction; + BoatActionEnum boatAction; + + public BoatActionDecoder(byte[] encodedBoatAction) { + byteBoatAction = encodedBoatAction[0]; + + boatAction = BoatActionEnum.fromByte(byteBoatAction); + } + + public BoatActionEnum getBoatAction() { + return boatAction; + } +} \ No newline at end of file diff --git a/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java b/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java index 0808d16d..4c57cf0c 100644 --- a/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java +++ b/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java @@ -339,4 +339,11 @@ public class RaceVisionByteEncoder { return result.array(); } + public static byte[] boatActionMessage(BoatAction boatAction){ + ByteBuffer boatActionMessage = ByteBuffer.allocate(1); + boatActionMessage.put(intToBytes(boatAction.getBoatAction(), 1)); + byte [] result = boatActionMessage.array(); + return result; + } + } diff --git a/racevisionGame/src/main/java/network/Messages/BoatAction.java b/racevisionGame/src/main/java/network/Messages/BoatAction.java new file mode 100644 index 00000000..d20943a5 --- /dev/null +++ b/racevisionGame/src/main/java/network/Messages/BoatAction.java @@ -0,0 +1,22 @@ +package network.Messages; + +import network.Messages.Enums.BoatActionEnum; +import network.Messages.Enums.MessageType; + +/** + * Created by David on 10/07/2017. + */ +public class BoatAction extends AC35Data { + + private byte boatAction; + + public BoatAction(BoatActionEnum boatAction){ + super(MessageType.BOATACTION); + this.boatAction = boatAction.getValue(); + } + + public byte getBoatAction() { + return boatAction; + } + +} \ No newline at end of file diff --git a/racevisionGame/src/main/java/network/Messages/Enums/BoatActionEnum.java b/racevisionGame/src/main/java/network/Messages/Enums/BoatActionEnum.java new file mode 100644 index 00000000..84f6e0fd --- /dev/null +++ b/racevisionGame/src/main/java/network/Messages/Enums/BoatActionEnum.java @@ -0,0 +1,71 @@ +package network.Messages.Enums; + +import java.util.HashMap; +import java.util.Map; + +/** + * Boat actions + */ +public enum BoatActionEnum { + NOT_A_STATUS(-1), + AUTO_PILOT(1), + SAILS_IN(2), + SAILS_OUT(3), + TACK_GYBE(4), + UPWIND(5), + DOWNWIND(6); + + private byte value; + + /** + * Ctor. Creates a BoatActionEnum from a given primitive integer value, cast to a byte. + * @param value Integer, which is cast to byte, to construct from. + */ + private BoatActionEnum(int value) { + this.value = (byte) value; + } + + /** + * Returns the primitive value of the enum. + * @return Primitive value of the enum. + */ + public byte getValue() { + return value; + } + + + /** + * Stores a mapping between Byte values and BoatActionEnum values. + */ + private static final Map byteToStatusMap = new HashMap<>(); + + + /* + Static initialization block. Initializes the byteToStatusMap. + */ + static { + for (BoatActionEnum type : BoatActionEnum.values()) { + BoatActionEnum.byteToStatusMap.put(type.value, type); + } + } + + + /** + * Returns the enumeration value which corresponds to a given byte value. + * @param boatActionEnum Byte value to convert to a BoatActionEnum value. + * @return The BoatActionEnum value which corresponds to the given byte value. + */ + public static BoatActionEnum fromByte(byte boatActionEnum) { + //Gets the corresponding MessageType from the map. + BoatActionEnum type = BoatActionEnum.byteToStatusMap.get(boatActionEnum); + + if (type == null) { + //If the byte value wasn't found, return the NOT_A_STATUS boatActionEnum. + return BoatActionEnum.NOT_A_STATUS; + } else { + //Otherwise, return the boatActionEnum. + return type; + } + + } +} \ No newline at end of file diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java index 0981f570..69940a15 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -1,6 +1,9 @@ package visualiser.gameController; import network.BinaryMessageEncoder; +import network.MessageEncoders.RaceVisionByteEncoder; +import network.Messages.BoatAction; +import network.Messages.Enums.BoatActionEnum; import network.Messages.Enums.MessageType; import visualiser.gameController.Keys.ControlKey; @@ -46,12 +49,18 @@ public class ControllerClient { public void sendKey(ControlKey key) throws IOException { int protocolCode = key.getProtocolCode(); if(protocolCode > -1) { - ByteBuffer buffer = ByteBuffer.allocate(4); - buffer.putInt(protocolCode); - byte[] message = new byte[]{buffer.get(3)}; - BinaryMessageEncoder binaryMessage = new BinaryMessageEncoder(MessageType.BOATACTION, message); - //outputStream.write(binaryMessage.getFullMessage()); - System.out.println("Binary message constructed"); + + byte[] bytes = new byte[4]; + ByteBuffer.wrap(bytes).putInt(key.getProtocolCode()); + + BoatAction boatAction = new BoatAction(BoatActionEnum.fromByte(bytes[3])); + + byte[] encodedBoatAction = RaceVisionByteEncoder.boatActionMessage(boatAction); + + BinaryMessageEncoder binaryMessage = new BinaryMessageEncoder(MessageType.BOATACTION, System.currentTimeMillis(), 0, + (short) encodedBoatAction.length, encodedBoatAction); + + outputStream.write(binaryMessage.getFullMessage()); } } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index 2e391d2a..67e9c4c0 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -1,5 +1,8 @@ package visualiser.gameController; +import network.BinaryMessageDecoder; +import network.MessageDecoders.BoatActionDecoder; +import network.Messages.Enums.BoatActionEnum; import visualiser.gameController.Keys.ControlKey; import visualiser.gameController.Keys.KeyFactory; @@ -39,10 +42,15 @@ public class ControllerServer implements Runnable { @Override public void run() { while(true) { - byte[] key = new byte[16]; + byte[] message = new byte[20]; try { - inputStream.read(key); - // TODO - handle messages received + if (inputStream.available() > 0) { + inputStream.read(message); + BinaryMessageDecoder encodedMessage = new BinaryMessageDecoder(message); + BoatActionDecoder boatActionDecoder = new BoatActionDecoder(encodedMessage.getMessageBody()); + BoatActionEnum decodedMessage = boatActionDecoder.getBoatAction(); + int key = decodedMessage.getValue(); + } } catch (IOException e) { e.printStackTrace(); } From 6492ba89ab5b97d54d7caf84e4c17b606a4186a1 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 27 Jul 2017 12:36:34 +1200 Subject: [PATCH 6/9] Merging main features into story 6. App now sends and receives key strokes. #story[1007, 1089] --- .../src/main/java/mock/app/Event.java | 2 +- .../gameController/ControllerClient.java | 1 + .../gameController/ControllerServer.java | 1 + .../main/resources/mock/mockXML/boatTest.xml | 15 ----- .../mock/mockXML/boatsSinglePlayer.xml | 55 +++++++++++++++++++ .../main/resources/mock/mockXML/raceTest.xml | 5 -- 6 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 racevisionGame/src/main/resources/mock/mockXML/boatsSinglePlayer.xml diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index b2c5b243..c94a691f 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -43,7 +43,7 @@ public class Event { private Event() { try { this.raceXML = getRaceXMLAtCurrentTime(XMLReader.readXMLFileToString("mock/mockXML/raceTest.xml", StandardCharsets.UTF_8)); - this.boatXML = XMLReader.readXMLFileToString("mock/mockXML/boatTest.xml", StandardCharsets.UTF_8); + this.boatXML = XMLReader.readXMLFileToString("mock/mockXML/boatsSinglePlayer.xml", StandardCharsets.UTF_8); this.regattaXML = XMLReader.readXMLFileToString("mock/mockXML/regattaTest.xml", StandardCharsets.UTF_8); this.xmlFileType = XMLFileType.Contents; diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java index 69940a15..07abc7ed 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -60,6 +60,7 @@ public class ControllerClient { BinaryMessageEncoder binaryMessage = new BinaryMessageEncoder(MessageType.BOATACTION, System.currentTimeMillis(), 0, (short) encodedBoatAction.length, encodedBoatAction); + System.out.println("Sending out key: " + protocolCode); outputStream.write(binaryMessage.getFullMessage()); } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index 67e9c4c0..0eac28d3 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -50,6 +50,7 @@ public class ControllerServer implements Runnable { BoatActionDecoder boatActionDecoder = new BoatActionDecoder(encodedMessage.getMessageBody()); BoatActionEnum decodedMessage = boatActionDecoder.getBoatAction(); int key = decodedMessage.getValue(); + System.out.println("Received key: " + key); } } catch (IOException e) { e.printStackTrace(); diff --git a/racevisionGame/src/main/resources/mock/mockXML/boatTest.xml b/racevisionGame/src/main/resources/mock/mockXML/boatTest.xml index 84f911bc..b43abe7f 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/boatTest.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/boatTest.xml @@ -33,23 +33,8 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/racevisionGame/src/main/resources/mock/mockXML/boatsSinglePlayer.xml b/racevisionGame/src/main/resources/mock/mockXML/boatsSinglePlayer.xml new file mode 100644 index 00000000..98058f3d --- /dev/null +++ b/racevisionGame/src/main/resources/mock/mockXML/boatsSinglePlayer.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/racevisionGame/src/main/resources/mock/mockXML/raceTest.xml b/racevisionGame/src/main/resources/mock/mockXML/raceTest.xml index 63fac32d..83e36f85 100644 --- a/racevisionGame/src/main/resources/mock/mockXML/raceTest.xml +++ b/racevisionGame/src/main/resources/mock/mockXML/raceTest.xml @@ -5,12 +5,7 @@ CREATION_TIME - - - - - From f91f7055de0582c19ffe1ca8d5eb922b8e80bfeb Mon Sep 17 00:00:00 2001 From: fjc40 Date: Thu, 27 Jul 2017 13:52:55 +1200 Subject: [PATCH 7/9] Visualiser RaceController: event.consume() is required to stop the keyboard event from propogating to other controls. --- .../src/main/java/visualiser/Controllers/RaceController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index 2a4a4163..a15e826c 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -102,6 +102,7 @@ public class RaceController extends Controller { try { controllerClient.sendKey(controlKey); controlKey.onAction(); // Change key state if applicable + event.consume(); } catch (IOException e) { e.printStackTrace(); } From 67c7c88b32bd9add0a07d03438283fd188e61d71 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 27 Jul 2017 14:06:40 +1200 Subject: [PATCH 8/9] Print statements now print off the actual key action. #story[1089] --- .../java/visualiser/gameController/ControllerClient.java | 5 +++-- .../java/visualiser/gameController/ControllerServer.java | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java index 07abc7ed..eb46d361 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -52,15 +52,16 @@ public class ControllerClient { byte[] bytes = new byte[4]; ByteBuffer.wrap(bytes).putInt(key.getProtocolCode()); + BoatActionEnum boatActionEnum = BoatActionEnum.fromByte(bytes[3]); - BoatAction boatAction = new BoatAction(BoatActionEnum.fromByte(bytes[3])); + BoatAction boatAction = new BoatAction(boatActionEnum); byte[] encodedBoatAction = RaceVisionByteEncoder.boatActionMessage(boatAction); BinaryMessageEncoder binaryMessage = new BinaryMessageEncoder(MessageType.BOATACTION, System.currentTimeMillis(), 0, (short) encodedBoatAction.length, encodedBoatAction); - System.out.println("Sending out key: " + protocolCode); + System.out.println("Sending out key: " + boatActionEnum); outputStream.write(binaryMessage.getFullMessage()); } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index 0eac28d3..fb6a257b 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -49,8 +49,7 @@ public class ControllerServer implements Runnable { BinaryMessageDecoder encodedMessage = new BinaryMessageDecoder(message); BoatActionDecoder boatActionDecoder = new BoatActionDecoder(encodedMessage.getMessageBody()); BoatActionEnum decodedMessage = boatActionDecoder.getBoatAction(); - int key = decodedMessage.getValue(); - System.out.println("Received key: " + key); + System.out.println("Received key: " + decodedMessage); } } catch (IOException e) { e.printStackTrace(); From 1b5926007cbf9b91287f577acee5e4dc46fda551 Mon Sep 17 00:00:00 2001 From: fjc40 Date: Thu, 27 Jul 2017 14:07:25 +1200 Subject: [PATCH 9/9] Visualiser ConnectionController: Clicking the host button doesn't create more than one server. --- .../Controllers/ConnectionController.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index 7652f98e..92ca8809 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -43,6 +43,13 @@ public class ConnectionController extends Controller { private ObservableList connections; + + /** + * Represents whether the client is currently hosting a game already - this is to ensure they don't launch multiple servers. + */ + private boolean currentlyHostingGame = false; + + @Override public void initialize(URL location, ResourceBundle resources) { // TODO - replace with config file @@ -104,12 +111,17 @@ public class ConnectionController extends Controller { */ public void addLocal() { try { - Event game = Event.getEvent(); - urlField.textProperty().set(game.getAddress()); - portField.textProperty().set(Integer.toString(game.getPort())); + //We don't want to host more than one game. + if (!currentlyHostingGame) { + Event game = Event.getEvent(); + urlField.textProperty().set(game.getAddress()); + portField.textProperty().set(Integer.toString(game.getPort())); + + game.start(); + addConnection(); - game.start(); - addConnection(); + currentlyHostingGame = true; + } } catch (InvalidRaceDataException e) { e.printStackTrace(); } catch (XMLReaderException e) {