From 6ae23f039bdacbdaf73baa885dc976c18a1357e9 Mon Sep 17 00:00:00 2001 From: hba56 Date: Tue, 11 Jul 2017 00:36:49 +1200 Subject: [PATCH 01/14] Added basic structure for the controller module of the game application #story[1006] --- controller/pom.xml | 15 +++ .../Controllers/MainWindowController.java | 7 ++ controller/src/main/java/seng302/Main.java | 101 ++++++++++++++++++ controller/src/main/resources/mainWindow.fxml | 10 ++ 4 files changed, 133 insertions(+) create mode 100644 controller/pom.xml create mode 100644 controller/src/main/java/seng302/Controllers/MainWindowController.java create mode 100644 controller/src/main/java/seng302/Main.java create mode 100644 controller/src/main/resources/mainWindow.fxml diff --git a/controller/pom.xml b/controller/pom.xml new file mode 100644 index 00000000..38099bbf --- /dev/null +++ b/controller/pom.xml @@ -0,0 +1,15 @@ + + + + team-7 + seng302 + 1.0-SNAPSHOT + + 4.0.0 + + 1 + + + \ No newline at end of file diff --git a/controller/src/main/java/seng302/Controllers/MainWindowController.java b/controller/src/main/java/seng302/Controllers/MainWindowController.java new file mode 100644 index 00000000..f5fdbcf2 --- /dev/null +++ b/controller/src/main/java/seng302/Controllers/MainWindowController.java @@ -0,0 +1,7 @@ +package seng302.Controllers; + +/** + * Controller for the main window fxml of the Game Controller + */ +public class MainWindowController { +} diff --git a/controller/src/main/java/seng302/Main.java b/controller/src/main/java/seng302/Main.java new file mode 100644 index 00000000..c2b7720b --- /dev/null +++ b/controller/src/main/java/seng302/Main.java @@ -0,0 +1,101 @@ +package seng302; + +import javafx.animation.AnimationTimer; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; + +import java.io.IOException; +import java.util.HashMap; + +/** + * Entry point for the controller side of the application + */ +public class Main extends Application { + //holds a boolean state for each important key to show if pressed down or not + private HashMap currentlyActiveKeys = new HashMap<>(); + + /** + * Entry point for running the programme + * + * @param args for starting the programme + */ + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage stage) { + try { + FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("mainWindow.fxml")); + Parent root = loader.load(); + + Scene scene = new Scene(root, 200, 100); + stage.setScene(scene); + stage.setTitle("Controller"); + + scene.setOnKeyPressed(event -> { + String codeString = event.getCode().toString(); + if (!currentlyActiveKeys.containsKey(codeString)) { + currentlyActiveKeys.put(codeString, true); + } + }); + + scene.setOnKeyReleased(event -> + currentlyActiveKeys.remove(event.getCode().toString()) + ); + + new AnimationTimer() { + @Override + public void handle(long now) { + if (removeActiveKey("Z")) { + System.out.println("zoom in"); + } + + if (removeActiveKey("X")) { + System.out.println("zoom out"); + } + + if (removeActiveKey("SPACE")) { + System.out.println("VMG"); + } + + if (removeActiveKey("SHIFT")) { + System.out.println("sails in/out"); + } + + if (removeActiveKey("Enter")) { + System.out.println("tack/gybe"); + } + + if (removeActiveKey("PAGE_UP")) { + System.out.println("up wind"); + } + + if (removeActiveKey("PAGE_DOWN")) { + System.out.println("down wind"); + } + } + }.start(); + + stage.show(); + } catch (IOException e) { + //Catch all exceptions, print, and exit. + e.printStackTrace(); + System.exit(1); + } + } + + private boolean removeActiveKey(String codeString) { + Boolean isActive = currentlyActiveKeys.get(codeString); + + if (isActive != null && isActive) { + currentlyActiveKeys.put(codeString, false); + return true; + } else { + return false; + } + } +} diff --git a/controller/src/main/resources/mainWindow.fxml b/controller/src/main/resources/mainWindow.fxml new file mode 100644 index 00000000..f7eeebd1 --- /dev/null +++ b/controller/src/main/resources/mainWindow.fxml @@ -0,0 +1,10 @@ + + + + + + +
+ +
+
From 83ac3e4e3398a6199951a227f765486146ed1db9 Mon Sep 17 00:00:00 2001 From: hba56 Date: Wed, 12 Jul 2017 11:59:59 +1200 Subject: [PATCH 02/14] updated the game controller to use the visualiser as the scene #story[1006] --- .../Controllers/MainWindowController.java | 7 -- controller/src/main/java/seng302/Main.java | 101 ------------------ controller/src/main/resources/mainWindow.fxml | 10 -- {controller => gameController}/pom.xml | 0 .../src/main/java/seng302/InputChecker.java | 49 +++++++++ .../src/main/java/seng302/InputKeys.java | 20 ++++ 6 files changed, 69 insertions(+), 118 deletions(-) delete mode 100644 controller/src/main/java/seng302/Controllers/MainWindowController.java delete mode 100644 controller/src/main/java/seng302/Main.java delete mode 100644 controller/src/main/resources/mainWindow.fxml rename {controller => gameController}/pom.xml (100%) create mode 100644 gameController/src/main/java/seng302/InputChecker.java create mode 100644 gameController/src/main/java/seng302/InputKeys.java diff --git a/controller/src/main/java/seng302/Controllers/MainWindowController.java b/controller/src/main/java/seng302/Controllers/MainWindowController.java deleted file mode 100644 index f5fdbcf2..00000000 --- a/controller/src/main/java/seng302/Controllers/MainWindowController.java +++ /dev/null @@ -1,7 +0,0 @@ -package seng302.Controllers; - -/** - * Controller for the main window fxml of the Game Controller - */ -public class MainWindowController { -} diff --git a/controller/src/main/java/seng302/Main.java b/controller/src/main/java/seng302/Main.java deleted file mode 100644 index c2b7720b..00000000 --- a/controller/src/main/java/seng302/Main.java +++ /dev/null @@ -1,101 +0,0 @@ -package seng302; - -import javafx.animation.AnimationTimer; -import javafx.application.Application; -import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.stage.Stage; - -import java.io.IOException; -import java.util.HashMap; - -/** - * Entry point for the controller side of the application - */ -public class Main extends Application { - //holds a boolean state for each important key to show if pressed down or not - private HashMap currentlyActiveKeys = new HashMap<>(); - - /** - * Entry point for running the programme - * - * @param args for starting the programme - */ - public static void main(String[] args) { - launch(args); - } - - @Override - public void start(Stage stage) { - try { - FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("mainWindow.fxml")); - Parent root = loader.load(); - - Scene scene = new Scene(root, 200, 100); - stage.setScene(scene); - stage.setTitle("Controller"); - - scene.setOnKeyPressed(event -> { - String codeString = event.getCode().toString(); - if (!currentlyActiveKeys.containsKey(codeString)) { - currentlyActiveKeys.put(codeString, true); - } - }); - - scene.setOnKeyReleased(event -> - currentlyActiveKeys.remove(event.getCode().toString()) - ); - - new AnimationTimer() { - @Override - public void handle(long now) { - if (removeActiveKey("Z")) { - System.out.println("zoom in"); - } - - if (removeActiveKey("X")) { - System.out.println("zoom out"); - } - - if (removeActiveKey("SPACE")) { - System.out.println("VMG"); - } - - if (removeActiveKey("SHIFT")) { - System.out.println("sails in/out"); - } - - if (removeActiveKey("Enter")) { - System.out.println("tack/gybe"); - } - - if (removeActiveKey("PAGE_UP")) { - System.out.println("up wind"); - } - - if (removeActiveKey("PAGE_DOWN")) { - System.out.println("down wind"); - } - } - }.start(); - - stage.show(); - } catch (IOException e) { - //Catch all exceptions, print, and exit. - e.printStackTrace(); - System.exit(1); - } - } - - private boolean removeActiveKey(String codeString) { - Boolean isActive = currentlyActiveKeys.get(codeString); - - if (isActive != null && isActive) { - currentlyActiveKeys.put(codeString, false); - return true; - } else { - return false; - } - } -} diff --git a/controller/src/main/resources/mainWindow.fxml b/controller/src/main/resources/mainWindow.fxml deleted file mode 100644 index f7eeebd1..00000000 --- a/controller/src/main/resources/mainWindow.fxml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - -
- -
-
diff --git a/controller/pom.xml b/gameController/pom.xml similarity index 100% rename from controller/pom.xml rename to gameController/pom.xml diff --git a/gameController/src/main/java/seng302/InputChecker.java b/gameController/src/main/java/seng302/InputChecker.java new file mode 100644 index 00000000..7a01be06 --- /dev/null +++ b/gameController/src/main/java/seng302/InputChecker.java @@ -0,0 +1,49 @@ +package seng302; + +import javafx.animation.AnimationTimer; +import javafx.scene.Scene; + +import java.util.HashMap; + +/** + * Class for checking what keys are currently being used + */ +public class InputChecker { + private HashMap currentlyActiveKeys = new HashMap<>(); + + public void runWithScene(Scene scene){ + scene.setOnKeyPressed(event -> { + String codeString = event.getCode().toString(); + if (!currentlyActiveKeys.containsKey(codeString)) { + currentlyActiveKeys.put(codeString, true); + } + }); + + scene.setOnKeyReleased(event -> + currentlyActiveKeys.remove(event.getCode().toString()) + ); + + new AnimationTimer() { + @Override + public void handle(long now) { + for (String key : InputKeys.listOfKeys){ + if (removeActiveKey(key)) { + System.out.println(key); + } + } + + } + }.start(); + } + + private boolean removeActiveKey(String codeString) { + Boolean isActive = currentlyActiveKeys.get(codeString); + + if (isActive != null && isActive) { + currentlyActiveKeys.put(codeString, false); + return true; + } else { + return false; + } + } +} diff --git a/gameController/src/main/java/seng302/InputKeys.java b/gameController/src/main/java/seng302/InputKeys.java new file mode 100644 index 00000000..57270017 --- /dev/null +++ b/gameController/src/main/java/seng302/InputKeys.java @@ -0,0 +1,20 @@ +package seng302; + +import java.util.Arrays; +import java.util.List; + +/** + * Class to store the basic keys used by this controller + */ +public class InputKeys { + protected static String zoomIn = "Z"; + protected static String zoomOut = "X"; + protected static String vmg = "SPACE"; + protected static String sailsToggle = "SHIFT"; + protected static String tackGybe = "Enter"; + protected static String upWind = "PAGE_UP"; + protected static String downWind = "Page_Down"; + + protected static List listOfKeys = Arrays.asList(zoomIn, zoomOut, vmg, + sailsToggle, tackGybe, upWind, downWind); +} From fef8540b1000e40621cee70f5b8dceef3e58fe5d Mon Sep 17 00:00:00 2001 From: hba56 Date: Wed, 12 Jul 2017 12:09:34 +1200 Subject: [PATCH 03/14] fix for the pom files #story[1006] --- gameController/pom.xml | 64 ++++++++++++++++++++--- visualiser/pom.xml | 5 ++ visualiser/src/main/java/seng302/App.java | 4 ++ 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/gameController/pom.xml b/gameController/pom.xml index 38099bbf..ce245a92 100644 --- a/gameController/pom.xml +++ b/gameController/pom.xml @@ -1,15 +1,67 @@ - - + + 4.0.0 team-7 seng302 1.0-SNAPSHOT - 4.0.0 - 1 + + jar + gameController + gameController + 1.0-SNAPSHOT + + + + + junit + junit + 4.12 + test + + + + + 1.8 + 1.8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + + + seng302.App + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + package + + shade + + + + + + \ No newline at end of file diff --git a/visualiser/pom.xml b/visualiser/pom.xml index 156c8e60..f33141c1 100644 --- a/visualiser/pom.xml +++ b/visualiser/pom.xml @@ -53,6 +53,11 @@ network 1.0-SNAPSHOT + + seng302 + gameController + 1.0-SNAPSHOT + diff --git a/visualiser/src/main/java/seng302/App.java b/visualiser/src/main/java/seng302/App.java index a003c681..fca492eb 100644 --- a/visualiser/src/main/java/seng302/App.java +++ b/visualiser/src/main/java/seng302/App.java @@ -31,6 +31,10 @@ public class App extends Application { FXMLLoader loader = new FXMLLoader(getClass().getResource("/scenes/main.fxml")); Parent root = loader.load(); Scene scene = new Scene(root, 1200, 800); + + InputChecker inputChecker = new InputChecker(); + inputChecker.runWithScene(scene); + stage.setScene(scene); stage.setTitle("RaceVision - Team 7"); stage.show(); From b7e2427528d77d2a70bc71cc3475f01a9d418bd4 Mon Sep 17 00:00:00 2001 From: hba56 Date: Fri, 14 Jul 2017 16:48:28 +1200 Subject: [PATCH 04/14] fix for the pom files #story[1006] --- gameController/pom.xml | 2 ++ visualiser/pom.xml | 1 + 2 files changed, 3 insertions(+) diff --git a/gameController/pom.xml b/gameController/pom.xml index ce245a92..83c89921 100644 --- a/gameController/pom.xml +++ b/gameController/pom.xml @@ -13,6 +13,8 @@ gameController 1.0-SNAPSHOT + https://eng-git.canterbury.ac.nz/SENG302-2016/team-7 + diff --git a/visualiser/pom.xml b/visualiser/pom.xml index f33141c1..9387a9ec 100644 --- a/visualiser/pom.xml +++ b/visualiser/pom.xml @@ -53,6 +53,7 @@ network 1.0-SNAPSHOT + seng302 gameController From 054816c15a7587e08e65a1ef1de18682d7ddee4d Mon Sep 17 00:00:00 2001 From: hba56 Date: Fri, 14 Jul 2017 17:07:10 +1200 Subject: [PATCH 05/14] fix for the pom files #story[1006] --- gameController/pom.xml | 69 ------------------- visualiser/pom.xml | 6 -- visualiser/src/main/java/seng302/App.java | 1 + .../seng302/gameController}/InputChecker.java | 2 +- .../seng302/gameController}/InputKeys.java | 2 +- 5 files changed, 3 insertions(+), 77 deletions(-) delete mode 100644 gameController/pom.xml rename {gameController/src/main/java/seng302 => visualiser/src/main/java/seng302/gameController}/InputChecker.java (97%) rename {gameController/src/main/java/seng302 => visualiser/src/main/java/seng302/gameController}/InputKeys.java (94%) diff --git a/gameController/pom.xml b/gameController/pom.xml deleted file mode 100644 index 83c89921..00000000 --- a/gameController/pom.xml +++ /dev/null @@ -1,69 +0,0 @@ - - 4.0.0 - - team-7 - seng302 - 1.0-SNAPSHOT - - - - jar - gameController - gameController - 1.0-SNAPSHOT - - https://eng-git.canterbury.ac.nz/SENG302-2016/team-7 - - - - - junit - junit - 4.12 - test - - - - - 1.8 - 1.8 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.5.1 - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.3 - - - - - seng302.App - ${maven.compiler.source} - ${maven.compiler.target} - - - - - - - package - - shade - - - - - - - - - \ No newline at end of file diff --git a/visualiser/pom.xml b/visualiser/pom.xml index 9387a9ec..156c8e60 100644 --- a/visualiser/pom.xml +++ b/visualiser/pom.xml @@ -54,12 +54,6 @@ 1.0-SNAPSHOT - - seng302 - gameController - 1.0-SNAPSHOT - - diff --git a/visualiser/src/main/java/seng302/App.java b/visualiser/src/main/java/seng302/App.java index fca492eb..363349e3 100644 --- a/visualiser/src/main/java/seng302/App.java +++ b/visualiser/src/main/java/seng302/App.java @@ -8,6 +8,7 @@ import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; import javafx.stage.WindowEvent; +import seng302.gameController.InputChecker; public class App extends Application { diff --git a/gameController/src/main/java/seng302/InputChecker.java b/visualiser/src/main/java/seng302/gameController/InputChecker.java similarity index 97% rename from gameController/src/main/java/seng302/InputChecker.java rename to visualiser/src/main/java/seng302/gameController/InputChecker.java index 7a01be06..2ca1a5d5 100644 --- a/gameController/src/main/java/seng302/InputChecker.java +++ b/visualiser/src/main/java/seng302/gameController/InputChecker.java @@ -1,4 +1,4 @@ -package seng302; +package seng302.gameController; import javafx.animation.AnimationTimer; import javafx.scene.Scene; diff --git a/gameController/src/main/java/seng302/InputKeys.java b/visualiser/src/main/java/seng302/gameController/InputKeys.java similarity index 94% rename from gameController/src/main/java/seng302/InputKeys.java rename to visualiser/src/main/java/seng302/gameController/InputKeys.java index 57270017..9c921061 100644 --- a/gameController/src/main/java/seng302/InputKeys.java +++ b/visualiser/src/main/java/seng302/gameController/InputKeys.java @@ -1,4 +1,4 @@ -package seng302; +package seng302.gameController; import java.util.Arrays; import java.util.List; From f9b2a62f8dd3e65afd97b1c5e87dbe68e2439786 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Sat, 15 Jul 2017 20:38:18 +1200 Subject: [PATCH 06/14] The Controller now takes in key presses. - Each key is now registered in an Abstract Factory which takes in an action to perform. - Comments are added behind each function in to give some indication of how it could be extended/modified in the future. #story[1006] --- .../seng302/gameController/InputChecker.java | 23 ++++++++++-- .../seng302/gameController/InputKeys.java | 20 ----------- .../gameController/Keys/ControlKey.java | 27 ++++++++++++++ .../gameController/Keys/DownWindKey.java | 24 +++++++++++++ .../gameController/Keys/KeyFactory.java | 36 +++++++++++++++++++ .../gameController/Keys/SailsToggleKey.java | 24 +++++++++++++ .../gameController/Keys/TackGybeKey.java | 24 +++++++++++++ .../gameController/Keys/UpWindKey.java | 24 +++++++++++++ .../seng302/gameController/Keys/VMGKey.java | 24 +++++++++++++ .../gameController/Keys/ZoomInKey.java | 18 ++++++++++ .../gameController/Keys/ZoomOutKey.java | 24 +++++++++++++ 11 files changed, 245 insertions(+), 23 deletions(-) delete mode 100644 visualiser/src/main/java/seng302/gameController/InputKeys.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/KeyFactory.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java create mode 100644 visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java diff --git a/visualiser/src/main/java/seng302/gameController/InputChecker.java b/visualiser/src/main/java/seng302/gameController/InputChecker.java index 2ca1a5d5..4d8f911d 100644 --- a/visualiser/src/main/java/seng302/gameController/InputChecker.java +++ b/visualiser/src/main/java/seng302/gameController/InputChecker.java @@ -2,6 +2,8 @@ package seng302.gameController; import javafx.animation.AnimationTimer; import javafx.scene.Scene; +import seng302.gameController.Keys.ControlKey; +import seng302.gameController.Keys.KeyFactory; import java.util.HashMap; @@ -11,6 +13,10 @@ import java.util.HashMap; public class InputChecker { private HashMap currentlyActiveKeys = new HashMap<>(); + /** + * Controller loop that detects key presses that runs parallel to the main scene. + * @param scene Scene the controller is to run in parallel with. + */ public void runWithScene(Scene scene){ scene.setOnKeyPressed(event -> { String codeString = event.getCode().toString(); @@ -26,16 +32,27 @@ public class InputChecker { new AnimationTimer() { @Override public void handle(long now) { - for (String key : InputKeys.listOfKeys){ - if (removeActiveKey(key)) { - System.out.println(key); + for (String key: currentlyActiveKeys.keySet()){ + ControlKey controlKey = KeyFactory.getKey(key); + if (controlKey != null){ + controlKey.onAction(); } } +// for (String key : InputKeys.stringKeysMap.keySet()){ +// if (removeActiveKey(key)) { +// System.out.println(key); +// } +// } } }.start(); } + /** + * removes a key from the active dictionary + * @param codeString string of the key press to remove + * @return whether or not the key has been removed or not. + */ private boolean removeActiveKey(String codeString) { Boolean isActive = currentlyActiveKeys.get(codeString); diff --git a/visualiser/src/main/java/seng302/gameController/InputKeys.java b/visualiser/src/main/java/seng302/gameController/InputKeys.java deleted file mode 100644 index 9c921061..00000000 --- a/visualiser/src/main/java/seng302/gameController/InputKeys.java +++ /dev/null @@ -1,20 +0,0 @@ -package seng302.gameController; - -import java.util.Arrays; -import java.util.List; - -/** - * Class to store the basic keys used by this controller - */ -public class InputKeys { - protected static String zoomIn = "Z"; - protected static String zoomOut = "X"; - protected static String vmg = "SPACE"; - protected static String sailsToggle = "SHIFT"; - protected static String tackGybe = "Enter"; - protected static String upWind = "PAGE_UP"; - protected static String downWind = "Page_Down"; - - protected static List listOfKeys = Arrays.asList(zoomIn, zoomOut, vmg, - sailsToggle, tackGybe, upWind, downWind); -} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java b/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java new file mode 100644 index 00000000..fe2b83e0 --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java @@ -0,0 +1,27 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * Key for the controller, part of the abstract factory KeyFactory + */ +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){ + this.name = name; + this.keyCode = keyCode; + } + + /** + * What this key should do when the command is issued for it to do its job. + */ + public abstract void onAction();//may want to make it take in a visualiser and stuff in the future. +} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java b/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java new file mode 100644 index 00000000..cf1a28cc --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java @@ -0,0 +1,24 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * Key to send downwind packet to server + */ +public class DownWindKey extends ControlKey { + + /** + * Constructor for Control + * + * @param name name of the key + * @param keyCode key code for the key + */ + public DownWindKey(String name, KeyCode keyCode) { + super(name, keyCode); + } + + @Override + public void onAction() { + + } +} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/KeyFactory.java b/visualiser/src/main/java/seng302/gameController/Keys/KeyFactory.java new file mode 100644 index 00000000..ecd92a9e --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/KeyFactory.java @@ -0,0 +1,36 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * Factory for creating Keys, these could be predefined in the future. + */ +public class KeyFactory { + + /** + * Get the Control Key incharge 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; + } + } + +} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java b/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java new file mode 100644 index 00000000..b26d7f62 --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java @@ -0,0 +1,24 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * Key to toggle the sails + */ +public class SailsToggleKey extends ControlKey { + + /** + * Constructor for Control + * + * @param name name of the key + * @param keyCode key code for the key + */ + public SailsToggleKey(String name, KeyCode keyCode) { + super(name, keyCode); + } + + @Override + public void onAction() { + + } +} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java b/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java new file mode 100644 index 00000000..4ff5cd1f --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java @@ -0,0 +1,24 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * key to toggle between tacking and gybing + */ +public class TackGybeKey extends ControlKey { + + /** + * Constructor for Control + * + * @param name name of the key + * @param keyCode key code for the key + */ + public TackGybeKey(String name, KeyCode keyCode) { + super(name, keyCode); + } + + @Override + public void onAction() { + + } +} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java b/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java new file mode 100644 index 00000000..fde830ec --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java @@ -0,0 +1,24 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * Key to go upwind + */ +public class UpWindKey extends ControlKey { + + /** + * Constructor for Control + * + * @param name name of the key + * @param keyCode key code for the key + */ + public UpWindKey(String name, KeyCode keyCode) { + super(name, keyCode); + } + + @Override + public void onAction() { + + } +} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java b/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java new file mode 100644 index 00000000..7da30550 --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java @@ -0,0 +1,24 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * Key to trigger auto VMG + */ +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); + } + + @Override + public void onAction() { + + } +} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java b/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java new file mode 100644 index 00000000..c0bdc7f1 --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java @@ -0,0 +1,18 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * key to zoom into the game + */ +public class ZoomInKey extends ControlKey { + + public ZoomInKey(String name, KeyCode keyCode) { + super(name, keyCode); + } + + @Override + public void onAction() { + + } +} diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java b/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java new file mode 100644 index 00000000..bcb844e9 --- /dev/null +++ b/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java @@ -0,0 +1,24 @@ +package seng302.gameController.Keys; + +import javafx.scene.input.KeyCode; + +/** + * Key to zoom out of the game. + */ +public class ZoomOutKey extends ControlKey{ + + /** + * Constructor for Control + * + * @param name name of the key + * @param keyCode key code for the key + */ + public ZoomOutKey(String name, KeyCode keyCode) { + super(name, keyCode); + } + + @Override + public void onAction() { + + } +} From d6d195f381f1caa615c8a197a9afcdfe6774da78 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 24 Jul 2017 01:59:37 +1200 Subject: [PATCH 07/14] Added Modularity to Input Checker. - Added onHold - Added onRelease - Added ManualTesting Class in the tests - Added Unimplemented new methods to classes #story[1006] --- .idea/kotlinc.xml | 7 ---- visualiser/src/main/java/seng302/App.java | 3 -- .../seng302/gameController/InputChecker.java | 16 +++++-- .../gameController/Keys/ControlKey.java | 18 ++++++++ .../gameController/Keys/DownWindKey.java | 10 +++++ .../gameController/Keys/SailsToggleKey.java | 10 +++++ .../gameController/Keys/TackGybeKey.java | 10 +++++ .../gameController/Keys/UpWindKey.java | 10 +++++ .../seng302/gameController/Keys/VMGKey.java | 10 +++++ .../gameController/Keys/ZoomInKey.java | 10 +++++ .../gameController/Keys/ZoomOutKey.java | 10 +++++ .../seng302/GameControllerManualTest.java | 42 +++++++++++++++++++ 12 files changed, 143 insertions(+), 13 deletions(-) delete mode 100644 .idea/kotlinc.xml create mode 100644 visualiser/src/test/java/seng302/GameControllerManualTest.java diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml deleted file mode 100644 index 1c24f9a8..00000000 --- a/.idea/kotlinc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/visualiser/src/main/java/seng302/App.java b/visualiser/src/main/java/seng302/App.java index 363349e3..7bc8a18f 100644 --- a/visualiser/src/main/java/seng302/App.java +++ b/visualiser/src/main/java/seng302/App.java @@ -33,9 +33,6 @@ public class App extends Application { Parent root = loader.load(); Scene scene = new Scene(root, 1200, 800); - InputChecker inputChecker = new InputChecker(); - inputChecker.runWithScene(scene); - stage.setScene(scene); stage.setTitle("RaceVision - Team 7"); stage.show(); diff --git a/visualiser/src/main/java/seng302/gameController/InputChecker.java b/visualiser/src/main/java/seng302/gameController/InputChecker.java index 4d8f911d..99873107 100644 --- a/visualiser/src/main/java/seng302/gameController/InputChecker.java +++ b/visualiser/src/main/java/seng302/gameController/InputChecker.java @@ -7,6 +7,8 @@ import seng302.gameController.Keys.KeyFactory; import java.util.HashMap; +import static javafx.application.Application.launch; + /** * Class for checking what keys are currently being used */ @@ -21,12 +23,18 @@ public class InputChecker { scene.setOnKeyPressed(event -> { String codeString = event.getCode().toString(); if (!currentlyActiveKeys.containsKey(codeString)) { + ControlKey controlKey = KeyFactory.getKey(codeString); + controlKey.onAction(); currentlyActiveKeys.put(codeString, true); } }); - scene.setOnKeyReleased(event -> - currentlyActiveKeys.remove(event.getCode().toString()) + scene.setOnKeyReleased(event -> { + String codeString = event.getCode().toString(); + ControlKey controlKey = KeyFactory.getKey(codeString); + controlKey.onRelease(); + currentlyActiveKeys.remove(event.getCode().toString()); + } ); new AnimationTimer() { @@ -35,7 +43,8 @@ public class InputChecker { for (String key: currentlyActiveKeys.keySet()){ ControlKey controlKey = KeyFactory.getKey(key); if (controlKey != null){ - controlKey.onAction(); + controlKey.onHold(); + System.out.println(controlKey.toString() + " is Pressed."); } } // for (String key : InputKeys.stringKeysMap.keySet()){ @@ -63,4 +72,5 @@ public class InputChecker { return false; } } + } diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java b/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java index fe2b83e0..4ab10842 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java +++ b/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java @@ -20,8 +20,26 @@ public abstract class ControlKey { this.keyCode = keyCode; } + /** + * To String method + * @return returns the name of the key + */ + public String toString(){ + return this.name; + } + /** * What this key should do when the command is issued for it to do its job. */ public abstract void onAction();//may want to make it take in a visualiser and stuff in the future. + + /** + * What to do when the key is held + */ + public abstract void onHold(); + + /** + * What to do when the key is released. + */ + public abstract void onRelease(); } diff --git a/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java b/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java index cf1a28cc..22098b33 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java +++ b/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java @@ -21,4 +21,14 @@ public class DownWindKey extends ControlKey { public void onAction() { } + + @Override + public void onHold() { + + } + + @Override + public void onRelease() { + + } } diff --git a/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java b/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java index b26d7f62..b161a53c 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java +++ b/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java @@ -21,4 +21,14 @@ public class SailsToggleKey extends ControlKey { public void onAction() { } + + @Override + public void onHold() { + + } + + @Override + public void onRelease() { + + } } diff --git a/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java b/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java index 4ff5cd1f..48da9025 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java +++ b/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java @@ -21,4 +21,14 @@ public class TackGybeKey extends ControlKey { public void onAction() { } + + @Override + public void onHold() { + + } + + @Override + public void onRelease() { + + } } diff --git a/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java b/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java index fde830ec..f665abc3 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java +++ b/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java @@ -21,4 +21,14 @@ public class UpWindKey extends ControlKey { public void onAction() { } + + @Override + public void onHold() { + + } + + @Override + public void onRelease() { + + } } diff --git a/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java b/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java index 7da30550..c6fb919d 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java +++ b/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java @@ -21,4 +21,14 @@ public class VMGKey extends ControlKey{ public void onAction() { } + + @Override + public void onHold() { + + } + + @Override + public void onRelease() { + + } } diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java b/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java index c0bdc7f1..49714cb7 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java +++ b/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java @@ -15,4 +15,14 @@ public class ZoomInKey extends ControlKey { public void onAction() { } + + @Override + public void onHold() { + + } + + @Override + public void onRelease() { + + } } diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java b/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java index bcb844e9..3898f364 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java +++ b/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java @@ -21,4 +21,14 @@ public class ZoomOutKey extends ControlKey{ public void onAction() { } + + @Override + public void onHold() { + + } + + @Override + public void onRelease() { + + } } diff --git a/visualiser/src/test/java/seng302/GameControllerManualTest.java b/visualiser/src/test/java/seng302/GameControllerManualTest.java new file mode 100644 index 00000000..95a0ea46 --- /dev/null +++ b/visualiser/src/test/java/seng302/GameControllerManualTest.java @@ -0,0 +1,42 @@ +package seng302; + +import javafx.application.Application; +import javafx.application.Platform; +import javafx.event.EventHandler; +import javafx.scene.Scene; +import javafx.scene.layout.GridPane; +import javafx.stage.Stage; +import javafx.stage.WindowEvent; +import seng302.gameController.InputChecker; + +/** + * Start to manually test the game controller + */ +public class GameControllerManualTest extends Application { + + @Override + public void start(Stage stage) throws Exception { + stage.setOnCloseRequest(new EventHandler() { + @Override + public void handle(WindowEvent event) { + Platform.exit(); + System.exit(0); + } + }); + + GridPane root = new GridPane(); + Scene scene = new Scene(root, 1200, 800); + + InputChecker inputChecker = new InputChecker(); + inputChecker.runWithScene(scene); + + stage.setScene(scene); + stage.setTitle("RaceVision - Team 7 - Input Tester Manual Test"); + stage.show(); + } + + + public static void main(String[] args) { + launch(args); + } +} From ec50310137893b72bdd2e8f5689d0938b39edb5f Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 24 Jul 2017 02:10:02 +1200 Subject: [PATCH 08/14] Added Messages to Controller For Testing Purposes - Added Pressed, Released, and Held Messages to Controller #story[1006] --- .../seng302/gameController/InputChecker.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/visualiser/src/main/java/seng302/gameController/InputChecker.java b/visualiser/src/main/java/seng302/gameController/InputChecker.java index 99873107..e5e8c2d1 100644 --- a/visualiser/src/main/java/seng302/gameController/InputChecker.java +++ b/visualiser/src/main/java/seng302/gameController/InputChecker.java @@ -24,18 +24,23 @@ public class InputChecker { String codeString = event.getCode().toString(); if (!currentlyActiveKeys.containsKey(codeString)) { ControlKey controlKey = KeyFactory.getKey(codeString); - controlKey.onAction(); + if (controlKey != null) { + controlKey.onAction(); + System.out.println(controlKey.toString() + " is Pressed."); + } currentlyActiveKeys.put(codeString, true); } }); scene.setOnKeyReleased(event -> { - String codeString = event.getCode().toString(); - ControlKey controlKey = KeyFactory.getKey(codeString); - controlKey.onRelease(); - currentlyActiveKeys.remove(event.getCode().toString()); - } - ); + String codeString = event.getCode().toString(); + ControlKey controlKey = KeyFactory.getKey(codeString); + if (controlKey != null) { + controlKey.onRelease(); + System.out.println(controlKey.toString() + " is Released."); + } + currentlyActiveKeys.remove(event.getCode().toString()); + }); new AnimationTimer() { @Override @@ -44,7 +49,7 @@ public class InputChecker { ControlKey controlKey = KeyFactory.getKey(key); if (controlKey != null){ controlKey.onHold(); - System.out.println(controlKey.toString() + " is Pressed."); + System.out.println(controlKey.toString() + " is Held."); } } // for (String key : InputKeys.stringKeysMap.keySet()){ From 1ebbb8d4c76cdf7a5a37f8650fc30924e5382559 Mon Sep 17 00:00:00 2001 From: hba56 Date: Mon, 24 Jul 2017 12:05:00 +1200 Subject: [PATCH 09/14] merged in the changes from the master branch so that latter mergers can run smoothly #story[1087] --- racevisionGame/src/main/java/visualiser/app/App.java | 1 - .../main/java/visualiser}/gameController/InputChecker.java | 6 +++--- .../java/visualiser}/gameController/Keys/ControlKey.java | 2 +- .../java/visualiser}/gameController/Keys/DownWindKey.java | 2 +- .../java/visualiser}/gameController/Keys/KeyFactory.java | 2 +- .../visualiser}/gameController/Keys/SailsToggleKey.java | 2 +- .../java/visualiser}/gameController/Keys/TackGybeKey.java | 2 +- .../java/visualiser}/gameController/Keys/UpWindKey.java | 2 +- .../main/java/visualiser}/gameController/Keys/VMGKey.java | 2 +- .../java/visualiser}/gameController/Keys/ZoomInKey.java | 2 +- .../java/visualiser}/gameController/Keys/ZoomOutKey.java | 2 +- .../gameController}/GameControllerManualTest.java | 4 ++-- 12 files changed, 14 insertions(+), 15 deletions(-) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/InputChecker.java (95%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/ControlKey.java (96%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/DownWindKey.java (92%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/KeyFactory.java (96%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/SailsToggleKey.java (92%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/TackGybeKey.java (92%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/UpWindKey.java (92%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/VMGKey.java (92%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/ZoomInKey.java (90%) rename {visualiser/src/main/java/seng302 => racevisionGame/src/main/java/visualiser}/gameController/Keys/ZoomOutKey.java (92%) rename {visualiser/src/test/java/seng302 => racevisionGame/src/test/java/visualiser/gameController}/GameControllerManualTest.java (92%) diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java index 4bf544b2..9a86cfd4 100644 --- a/racevisionGame/src/main/java/visualiser/app/App.java +++ b/racevisionGame/src/main/java/visualiser/app/App.java @@ -8,7 +8,6 @@ import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; import javafx.stage.WindowEvent; -import seng302.gameController.InputChecker; public class App extends Application { diff --git a/visualiser/src/main/java/seng302/gameController/InputChecker.java b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java similarity index 95% rename from visualiser/src/main/java/seng302/gameController/InputChecker.java rename to racevisionGame/src/main/java/visualiser/gameController/InputChecker.java index e5e8c2d1..19361b32 100644 --- a/visualiser/src/main/java/seng302/gameController/InputChecker.java +++ b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java @@ -1,9 +1,9 @@ -package seng302.gameController; +package visualiser.gameController; import javafx.animation.AnimationTimer; import javafx.scene.Scene; -import seng302.gameController.Keys.ControlKey; -import seng302.gameController.Keys.KeyFactory; +import visualiser.gameController.Keys.ControlKey; +import visualiser.gameController.Keys.KeyFactory; import java.util.HashMap; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java similarity index 96% rename from visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java index 4ab10842..7f067fb1 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/ControlKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java similarity index 92% rename from visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java index 22098b33..3f36bf08 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/DownWindKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/DownWindKey.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/KeyFactory.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java similarity index 96% rename from visualiser/src/main/java/seng302/gameController/Keys/KeyFactory.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java index ecd92a9e..6e4d403b 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/KeyFactory.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/KeyFactory.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java similarity index 92% rename from visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java index b161a53c..f8a4278d 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/SailsToggleKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java similarity index 92% rename from visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java index 48da9025..8e2e424c 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/TackGybeKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/TackGybeKey.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java similarity index 92% rename from visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java index f665abc3..0744f8df 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/UpWindKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/UpWindKey.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java similarity index 92% rename from visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java index c6fb919d..a9a15695 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/VMGKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java similarity index 90% rename from visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java index 49714cb7..0d990a54 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/ZoomInKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomOutKey.java similarity index 92% rename from visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java rename to racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomOutKey.java index 3898f364..62289847 100644 --- a/visualiser/src/main/java/seng302/gameController/Keys/ZoomOutKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomOutKey.java @@ -1,4 +1,4 @@ -package seng302.gameController.Keys; +package visualiser.gameController.Keys; import javafx.scene.input.KeyCode; diff --git a/visualiser/src/test/java/seng302/GameControllerManualTest.java b/racevisionGame/src/test/java/visualiser/gameController/GameControllerManualTest.java similarity index 92% rename from visualiser/src/test/java/seng302/GameControllerManualTest.java rename to racevisionGame/src/test/java/visualiser/gameController/GameControllerManualTest.java index 95a0ea46..6c7c4f81 100644 --- a/visualiser/src/test/java/seng302/GameControllerManualTest.java +++ b/racevisionGame/src/test/java/visualiser/gameController/GameControllerManualTest.java @@ -1,4 +1,4 @@ -package seng302; +package visualiser.gameController; import javafx.application.Application; import javafx.application.Platform; @@ -7,7 +7,7 @@ import javafx.scene.Scene; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; -import seng302.gameController.InputChecker; +import visualiser.gameController.InputChecker; /** * Start to manually test the game controller From 9f99e212324e27c81f259bc29b20427eab56758a Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 24 Jul 2017 17:27:49 +1200 Subject: [PATCH 10/14] Added functionality for more than one visualiser to connect to the mock. - more than one visualiser can now connect to the mock. - Created class ConnectionAcceptor that will accept and allocate to each socket - Issue of sockets connecting after the race starts then disconnecting will use a socket slot. #story[1010] --- .idea/copyright/profiles_settings.xml | 3 + .../src/main/java/mock/app/App.java | 2 + .../java/mock/app/ConnectionAcceptor.java | 201 ++++++++++++++++++ .../src/main/java/mock/app/Event.java | 7 +- .../src/main/java/mock/app/MockOutput.java | 138 ++---------- .../java/network/Messages/LatestMessages.java | 3 +- .../Controllers/ConnectionController.java | 1 + .../java/visualiser/app/VisualiserInput.java | 3 +- .../java/visualiser/model/RaceConnection.java | 4 + 9 files changed, 233 insertions(+), 129 deletions(-) create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000..e7bedf33 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/racevisionGame/src/main/java/mock/app/App.java b/racevisionGame/src/main/java/mock/app/App.java index 06f628d5..d8dbebae 100644 --- a/racevisionGame/src/main/java/mock/app/App.java +++ b/racevisionGame/src/main/java/mock/app/App.java @@ -16,6 +16,8 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java new file mode 100644 index 00000000..844e7509 --- /dev/null +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -0,0 +1,201 @@ +package mock.app; + +import network.Messages.Enums.XMLMessageType; +import network.Messages.LatestMessages; +import network.Messages.XMLMessage; +import org.mockito.Mock; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.lang.reflect.Array; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; + +/** + * Connection acceptor for multiple clients + */ +public class ConnectionAcceptor implements Runnable { + + + /** + * Port to expose server on. + */ + private int serverPort = 4942; + /** + * Socket used to listen for clients on. + */ + private ServerSocket serverSocket; + //mock outputs + private ArrayBlockingQueue mockOutputList = new ArrayBlockingQueue<>(16); + //latest messages + private LatestMessages latestMessages; + //Acknowledgement number for packets + private int ackNumber = 0; + //race xml sequence number + private short raceXMLSequenceNumber; + //boat xml sequence number + private short boatXMLSequenceNumber; + //regatta xml sequence number + private short regattaXMLSequenceNumber; + + /** + * Connection Acceptor Constructor + * @param latestMessages Latest messages to be sent + * @throws IOException if a server socket cannot be instantiated. + */ + public ConnectionAcceptor(LatestMessages latestMessages) throws IOException { + + this.latestMessages =latestMessages; + this.serverSocket = new ServerSocket(serverPort); + CheckClientConnection checkClientConnection = new CheckClientConnection(mockOutputList); + new Thread(checkClientConnection).start(); + } + + /** + * Run the Acceptor + */ + @Override + public void run() { + while(true){//should be connections not filled up + try { + System.out.println("Waiting for a connection...");//TEMP DEBUG REMOVE + Socket mockSocket = serverSocket.accept(); + DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); + MockOutput mockOutput = new MockOutput(latestMessages, outToVisualiser); + new Thread(mockOutput).start(); + mockOutputList.add(mockOutput); + System.out.println(String.format("%d number of Visualisers Connected.", mockOutputList.size())); + } catch (IOException e) { + e.printStackTrace(); + } + + } + } + + /** + * Nested class to remove disconnected clients + */ + class CheckClientConnection implements Runnable{ + + private ArrayBlockingQueue mocks; + + /** + * Constructor + * @param mocks Mocks "connected" + */ + public CheckClientConnection(ArrayBlockingQueue mocks){ + this.mocks = mocks; + } + + /** + * Run the remover. + */ + @Override + public void run() { + double timeSinceLastHeartBeat = System.currentTimeMillis(); + while(true) { + ArrayBlockingQueue m = new ArrayBlockingQueue(16, true, mocks); + for (MockOutput mo : m) { + try { + mo.sendHeartBeat(); + } catch (IOException e) { + mocks.remove(mo); + } + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + /** + * Sets the Race XML to send. + * @param raceXml XML to send to the Client. + */ + public void setRaceXml(String raceXml) { + //Create the message. + XMLMessage message = this.createXMLMessage(raceXml, XMLMessageType.RACE); + + //Place it in LatestMessages. + this.latestMessages.setRaceXMLMessage(message); + } + + /** + * Sets the Regatta XMl to send. + * @param regattaXml XML to send to Client. + */ + public void setRegattaXml(String regattaXml) { + //Create the message. + XMLMessage message = this.createXMLMessage(regattaXml, XMLMessageType.REGATTA); + + //Place it in LatestMessages. + this.latestMessages.setRegattaXMLMessage(message); + } + + /** + * Sets the Boats XML to send. + * @param boatsXml XMl to send to the Client. + */ + public void setBoatsXml(String boatsXml) { + //Create the message. + XMLMessage message = this.createXMLMessage(boatsXml, XMLMessageType.BOAT); + + //Place it in LatestMessages. + this.latestMessages.setBoatXMLMessage(message); + } + + /** + * Creates an XMLMessage of a specified subtype using the xml contents string. + * @param xmlString The contents of the xml file. + * @param messageType The subtype of xml message (race, regatta, boat). + * @return The created XMLMessage object. + */ + private XMLMessage createXMLMessage(String xmlString, XMLMessageType messageType) { + + //Get the correct sequence number to use, and increment it. + short sequenceNumber = 0; + if (messageType == XMLMessageType.RACE) { + sequenceNumber = this.raceXMLSequenceNumber; + this.raceXMLSequenceNumber++; + + } else if (messageType == XMLMessageType.BOAT) { + sequenceNumber = this.boatXMLSequenceNumber; + this.boatXMLSequenceNumber++; + + } else if (messageType == XMLMessageType.REGATTA) { + sequenceNumber = this.regattaXMLSequenceNumber; + this.regattaXMLSequenceNumber++; + + } + + //Create the message. + XMLMessage message = new XMLMessage( + XMLMessage.currentVersionNumber, + getNextAckNumber(), + System.currentTimeMillis(), + messageType, + sequenceNumber, + xmlString); + + + return message; + } + + /** + * Increments the ackNumber value, and returns it. + * @return Incremented ackNumber. + */ + private int getNextAckNumber(){ + this.ackNumber++; + + return this.ackNumber; + } + + +} diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 080e8405..71cc288c 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -29,7 +29,7 @@ public class Event { private Polars boatPolars; - private MockOutput mockOutput; + private ConnectionAcceptor mockOutput; private LatestMessages latestMessages; @@ -46,6 +46,9 @@ public class Event { this.raceXML = getRaceXMLAtCurrentTime(raceXML); this.boatXML = boatXML; this.regattaXML = regattaXML; + System.out.println(raceXML); + System.out.println(boatXML); + System.out.println(regattaXML); this.xmlFileType = type; @@ -55,7 +58,7 @@ public class Event { try { - this.mockOutput = new MockOutput(this.latestMessages); + this.mockOutput = new ConnectionAcceptor(latestMessages); new Thread(mockOutput).start(); } catch (IOException e) { diff --git a/racevisionGame/src/main/java/mock/app/MockOutput.java b/racevisionGame/src/main/java/mock/app/MockOutput.java index e217accf..12eaf807 100644 --- a/racevisionGame/src/main/java/mock/app/MockOutput.java +++ b/racevisionGame/src/main/java/mock/app/MockOutput.java @@ -29,18 +29,6 @@ public class MockOutput implements Runnable */ private double heartbeatPeriod = 5.0; - /** - * Port to expose server on. - */ - private int serverPort = 4942; - /** - * Socket used to listen for clients on. - */ - private ServerSocket serverSocket; - /** - * Socket used to communicate with a client. - */ - private Socket mockSocket; /** * Output stream which wraps around mockSocket outstream. */ @@ -60,22 +48,6 @@ public class MockOutput implements Runnable */ private int ackNumber = 1; - - /** - * Sequence number for race xml messages. - */ - private short raceXMLSequenceNumber = 1; - - /** - * Sequence number for boat xml messages. - */ - private short boatXMLSequenceNumber = 1; - - /** - * Sequence number for regatta xml messages. - */ - private short regattaXMLSequenceNumber = 1; - /** * Sequence number for heartbeat messages. */ @@ -86,13 +58,14 @@ public class MockOutput implements Runnable /** * Ctor. - * @param latestMessages The collection of messages to send to connected clients. + * * @throws IOException if server socket cannot be opened. */ - public MockOutput(LatestMessages latestMessages) throws IOException { + public MockOutput(LatestMessages latestMessages, DataOutputStream outToVisualiser) throws IOException { + + this.outToVisualiser = outToVisualiser; this.lastHeartbeatTime = System.currentTimeMillis(); - this.serverSocket = new ServerSocket(serverPort); this.latestMessages = latestMessages; @@ -155,44 +128,6 @@ public class MockOutput implements Runnable } - - /** - * Creates an XMLMessage of a specified subtype using the xml contents string. - * @param xmlString The contents of the xml file. - * @param messageType The subtype of xml message (race, regatta, boat). - * @return The created XMLMessage object. - */ - private XMLMessage createXMLMessage(String xmlString, XMLMessageType messageType) { - - //Get the correct sequence number to use, and increment it. - short sequenceNumber = 0; - if (messageType == XMLMessageType.RACE) { - sequenceNumber = this.raceXMLSequenceNumber; - this.raceXMLSequenceNumber++; - - } else if (messageType == XMLMessageType.BOAT) { - sequenceNumber = this.boatXMLSequenceNumber; - this.boatXMLSequenceNumber++; - - } else if (messageType == XMLMessageType.REGATTA) { - sequenceNumber = this.regattaXMLSequenceNumber; - this.regattaXMLSequenceNumber++; - - } - - //Create the message. - XMLMessage message = new XMLMessage( - XMLMessage.currentVersionNumber, - getNextAckNumber(), - System.currentTimeMillis(), - messageType, - sequenceNumber, - xmlString ); - - - return message; - } - /** * Encodes/serialises a XMLMessage message, and returns it. * @param xmlMessage The XMLMessage message to serialise. @@ -266,6 +201,17 @@ public class MockOutput implements Runnable } + /** + * Sends a heartbeat + * @throws IOException if the socket is no longer open at both ends the heartbeat returns an error. + */ + public void sendHeartBeat() throws IOException { + //Sends a heartbeat every so often. + if (timeSinceHeartbeat() >= heartbeatPeriod) { + outToVisualiser.write(parseHeartbeat(createHeartbeatMessage())); + lastHeartbeatTime = System.currentTimeMillis(); + } + } /** * Sending loop of the Server @@ -274,11 +220,6 @@ public class MockOutput implements Runnable try { while (!stop){ - //Wait for a client to connect. - System.out.println("Waiting for a connection...");//TEMP DEBUG REMOVE - mockSocket = serverSocket.accept(); - - outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); //Wait until all of the xml files have been set. if (!this.latestMessages.hasAllXMLMessages()) { @@ -307,12 +248,6 @@ public class MockOutput implements Runnable long minimumFramePeriod = 16; if (framePeriod >= minimumFramePeriod) { - //Sends a heartbeat every so often. - if (timeSinceHeartbeat() >= heartbeatPeriod) { - outToVisualiser.write(parseHeartbeat(createHeartbeatMessage())); - lastHeartbeatTime = System.currentTimeMillis(); - } - //Send XML messages. if (!sentXMLs) { //Serialise them. @@ -385,47 +320,4 @@ public class MockOutput implements Runnable stop = true; } - /** - * Sets the Race XML to send. - * @param raceXml XML to send to the Client. - */ - public void setRaceXml(String raceXml) { - //Create the message. - XMLMessage message = this.createXMLMessage(raceXml, XMLMessageType.RACE); - - //Place it in LatestMessages. - this.latestMessages.setRaceXMLMessage(message); - } - - /** - * Sets the Regatta XMl to send. - * @param regattaXml XML to send to Client. - */ - public void setRegattaXml(String regattaXml) { - //Create the message. - XMLMessage message = this.createXMLMessage(regattaXml, XMLMessageType.REGATTA); - - //Place it in LatestMessages. - this.latestMessages.setRegattaXMLMessage(message); - } - - /** - * Sets the Boats XML to send. - * @param boatsXml XMl to send to the Client. - */ - public void setBoatsXml(String boatsXml) { - //Create the message. - XMLMessage message = this.createXMLMessage(boatsXml, XMLMessageType.BOAT); - - //Place it in LatestMessages. - this.latestMessages.setBoatXMLMessage(message); - } - - - public static void main(String argv[]) throws Exception - { - MockOutput client = new MockOutput(new LatestMessages()); - client.run(); - } - } diff --git a/racevisionGame/src/main/java/network/Messages/LatestMessages.java b/racevisionGame/src/main/java/network/Messages/LatestMessages.java index c0da436b..f35fc52e 100644 --- a/racevisionGame/src/main/java/network/Messages/LatestMessages.java +++ b/racevisionGame/src/main/java/network/Messages/LatestMessages.java @@ -289,8 +289,7 @@ public class LatestMessages extends Observable { * @return True if race, boat, and regatta have an xml message, false otherwise. */ public boolean hasAllXMLMessages() { - - if ((this.regattaXMLMessage == null) || (this.boatXMLMessage == null) || (this.raceXMLMessage == null)) { + if (this.regattaXMLMessage == null || this.boatXMLMessage == null || this.raceXMLMessage == null) { return false; } else { diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index 7dacbd5e..dd82065c 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -75,6 +75,7 @@ public class ConnectionController extends Controller { try{ RaceConnection connection = connectionTable.getSelectionModel().getSelectedItem(); Socket socket = new Socket(connection.getHostname(), connection.getPort()); + socket.setKeepAlive(true); connectionWrapper.setVisible(false); parent.enterLobby(socket); } catch (IOException e) { /* Never reached */ } diff --git a/racevisionGame/src/main/java/visualiser/app/VisualiserInput.java b/racevisionGame/src/main/java/visualiser/app/VisualiserInput.java index d86e0224..0b8102b5 100644 --- a/racevisionGame/src/main/java/visualiser/app/VisualiserInput.java +++ b/racevisionGame/src/main/java/visualiser/app/VisualiserInput.java @@ -20,6 +20,7 @@ import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; import static network.Utils.ByteConverter.bytesToShort; @@ -372,6 +373,4 @@ public class VisualiserInput implements Runnable { } } - - } diff --git a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java index 848b747e..cb898e81 100644 --- a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java +++ b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java @@ -33,6 +33,10 @@ public class RaceConnection { try (Socket s = new Socket()){ s.connect(i, 750);//TODO this should be at least a second or two, once moved to its own thread status.set("Ready"); + s.shutdownInput(); + s.shutdownOutput(); + s.close(); + System.out.println(String.valueOf(s.isClosed())); return true; } catch (IOException e) {} From cfd858194ed6cfa5148023e8b439f3ac8b7598d2 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 24 Jul 2017 17:36:47 +1200 Subject: [PATCH 11/14] Removed Unecessary Print Messages - Removed xml's printing at the start as well as the amount of visualisers connected from spamming the log. - Issue of visualisers connecting when not actually connecting was actually an visual issue as the log spits out the number of visualisers right now before the loop has gotten rid of the useless sockets. #story[1010] --- racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java | 1 + racevisionGame/src/main/java/mock/app/Event.java | 4 ---- .../src/main/java/visualiser/model/RaceConnection.java | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 844e7509..3f8dda23 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -97,6 +97,7 @@ public class ConnectionAcceptor implements Runnable { public void run() { double timeSinceLastHeartBeat = System.currentTimeMillis(); while(true) { + //System.out.println(mocks.size());//used to see current amount of visualisers connected. ArrayBlockingQueue m = new ArrayBlockingQueue(16, true, mocks); for (MockOutput mo : m) { try { diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 71cc288c..7964a30a 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -46,10 +46,6 @@ public class Event { this.raceXML = getRaceXMLAtCurrentTime(raceXML); this.boatXML = boatXML; this.regattaXML = regattaXML; - System.out.println(raceXML); - System.out.println(boatXML); - System.out.println(regattaXML); - this.xmlFileType = type; this.boatPolars = boatPolars; diff --git a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java index cb898e81..a6bd8301 100644 --- a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java +++ b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java @@ -36,7 +36,7 @@ public class RaceConnection { s.shutdownInput(); s.shutdownOutput(); s.close(); - System.out.println(String.valueOf(s.isClosed())); + //System.out.println(String.valueOf(s.isClosed())); return true; } catch (IOException e) {} From eec0cb3493d29b17a87784cab8d78bf7981414aa Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 24 Jul 2017 17:40:46 +1200 Subject: [PATCH 12/14] Added fairness to mockOuput list so the index will correspond to the player in order that they entered the hosted game, #story[1010] --- racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 3f8dda23..53d664b5 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -29,7 +29,7 @@ public class ConnectionAcceptor implements Runnable { */ private ServerSocket serverSocket; //mock outputs - private ArrayBlockingQueue mockOutputList = new ArrayBlockingQueue<>(16); + private ArrayBlockingQueue mockOutputList = new ArrayBlockingQueue<>(16, true); //latest messages private LatestMessages latestMessages; //Acknowledgement number for packets @@ -198,5 +198,4 @@ public class ConnectionAcceptor implements Runnable { return this.ackNumber; } - } From 7e3e86556349f1646b27bd93aae16eaf5a048d4c Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Tue, 25 Jul 2017 15:52:53 +1200 Subject: [PATCH 13/14] Host starts with button in ConnectionController - Converted Event to Singleton for configuring and hosting no more than one game instance. - Retrieve address and port from ConnectionAcceptor - Automatically add local host to host list #story[1010] --- racevisionGame/pom.xml | 2 +- .../src/main/java/mock/app/App.java | 56 ------------------- .../java/mock/app/ConnectionAcceptor.java | 10 ++++ .../src/main/java/mock/app/Event.java | 53 +++++++++++------- .../Controllers/ConnectionController.java | 32 ++++++++++- .../java/visualiser/model/RaceConnection.java | 5 ++ .../resources/visualiser/scenes/connect.fxml | 46 +++++++++------ 7 files changed, 107 insertions(+), 97 deletions(-) delete mode 100644 racevisionGame/src/main/java/mock/app/App.java diff --git a/racevisionGame/pom.xml b/racevisionGame/pom.xml index efc88c09..f77e5ea3 100644 --- a/racevisionGame/pom.xml +++ b/racevisionGame/pom.xml @@ -104,7 +104,7 @@ - mock.app.App + visualiser.app.App ${maven.compiler.source} ${maven.compiler.target} diff --git a/racevisionGame/src/main/java/mock/app/App.java b/racevisionGame/src/main/java/mock/app/App.java deleted file mode 100644 index d8dbebae..00000000 --- a/racevisionGame/src/main/java/mock/app/App.java +++ /dev/null @@ -1,56 +0,0 @@ -package mock.app; - - -import javafx.application.Application; -import javafx.stage.Stage; -import mock.dataInput.PolarParser; -import mock.model.Polars; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import shared.dataInput.XMLReader; -import shared.enums.XMLFileType; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.TransformerException; -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -public class App extends Application { - - /** - * Entry point for running the programme - * - * @param args for starting the programme - */ - public static void main(String[] args) { - launch(args); - } - - @Override - public void start(Stage primaryStage) { - try { - Polars boatPolars = PolarParser.parse("mock/polars/acc_polars.csv"); - - String regattaXML = XMLReader.readXMLFileToString("mock/mockXML/regattaTest.xml", StandardCharsets.UTF_8); - String raceXML = XMLReader.readXMLFileToString("mock/mockXML/raceTest.xml", StandardCharsets.UTF_8); - String boatXML = XMLReader.readXMLFileToString("mock/mockXML/boatTest.xml", StandardCharsets.UTF_8); - - Event raceEvent = new Event(raceXML, regattaXML, boatXML, XMLFileType.Contents, boatPolars); - raceEvent.start(); - - } catch (Exception e) { - //Catch all exceptions, print, and exit. - e.printStackTrace(); - System.exit(1); - } - } - - - -} diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 53d664b5..4c2b38ce 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -8,8 +8,10 @@ import org.mockito.Mock; import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Array; +import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; @@ -54,6 +56,14 @@ public class ConnectionAcceptor implements Runnable { new Thread(checkClientConnection).start(); } + public String getAddress() throws UnknownHostException { + return InetAddress.getLocalHost().getHostAddress(); + } + + public int getServerPort() { + return serverPort; + } + /** * Run the Acceptor */ diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 7964a30a..3ba6841c 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -1,5 +1,6 @@ package mock.app; +import mock.dataInput.PolarParser; import mock.model.MockRace; import mock.model.Polars; import network.Messages.LatestMessages; @@ -11,7 +12,10 @@ import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; import shared.model.Constants; +import javax.xml.transform.TransformerException; import java.io.IOException; +import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -20,6 +24,7 @@ import java.time.format.DateTimeFormatter; * A Race Event, this holds all of the race's information as well as handling the connection to its clients. */ public class Event { + private static Event theEvent = new Event(); private String raceXML; private String regattaXML; @@ -32,36 +37,42 @@ public class Event { private ConnectionAcceptor mockOutput; private LatestMessages latestMessages; - /** * Constructs an event, using various XML files. - * @param raceXML The race.xml file. - * @param regattaXML The regatta.xml file. - * @param boatXML The boat.xml file. - * @param type How to read the file - e.g., load as resource. - * @param boatPolars polars that the boat uses */ - public Event(String raceXML, String regattaXML, String boatXML, XMLFileType type, Polars boatPolars) { - - this.raceXML = getRaceXMLAtCurrentTime(raceXML); - this.boatXML = boatXML; - this.regattaXML = regattaXML; - this.xmlFileType = type; - - this.boatPolars = boatPolars; - - this.latestMessages = new LatestMessages(); + 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.regattaXML = XMLReader.readXMLFileToString("mock/mockXML/regattaTest.xml", StandardCharsets.UTF_8); + this.xmlFileType = XMLFileType.Contents; + this.boatPolars = PolarParser.parse("mock/polars/acc_polars.csv"); - try { + this.latestMessages = new LatestMessages(); this.mockOutput = new ConnectionAcceptor(latestMessages); - new Thread(mockOutput).start(); - - } catch (IOException e) { + } + catch (IOException e) { + e.printStackTrace(); + } catch (XMLReaderException e) { + e.printStackTrace(); + } catch (TransformerException e) { e.printStackTrace(); } } + public static Event getEvent() { + return theEvent; + } + + public String getAddress() throws UnknownHostException { + return mockOutput.getAddress(); + } + + public int getPort() { + return mockOutput.getServerPort(); + } + /** * Sends the initial race data and then begins race simulation. * @throws InvalidRaceDataException Thrown if the race xml file cannot be parsed. @@ -70,6 +81,7 @@ public class Event { * @throws InvalidRegattaDataException Thrown if the regatta xml file cannot be parsed. */ public void start() throws InvalidRaceDataException, XMLReaderException, InvalidBoatDataException, InvalidRegattaDataException { + new Thread(mockOutput).start(); sendXMLs(); @@ -119,5 +131,4 @@ public class Event { return raceXML; } - } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index dd82065c..dd309516 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -8,11 +8,17 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; +import mock.app.Event; +import shared.exceptions.InvalidBoatDataException; +import shared.exceptions.InvalidRaceDataException; +import shared.exceptions.InvalidRegattaDataException; +import shared.exceptions.XMLReaderException; import visualiser.model.RaceConnection; import java.io.IOException; import java.net.Socket; import java.net.URL; +import java.net.UnknownHostException; import java.util.ResourceBundle; /** @@ -41,8 +47,6 @@ public class ConnectionController extends Controller { public void initialize(URL location, ResourceBundle resources) { // TODO - replace with config file connections = FXCollections.observableArrayList(); - connections.add(new RaceConnection("livedata.americascup.com", 4941)); - connections.add(new RaceConnection("localhost", 4942)); connectionTable.setItems(connections); hostnameColumn.setCellValueFactory(cellData -> cellData.getValue().hostnameProperty()); @@ -95,4 +99,28 @@ public class ConnectionController extends Controller { } } + + /** + * Sets up a new host + */ + public void addLocal() { + try { + Event game = Event.getEvent(); + urlField.textProperty().set(game.getAddress()); + portField.textProperty().set(Integer.toString(game.getPort())); + + game.start(); + addConnection(); + } catch (InvalidRaceDataException e) { + e.printStackTrace(); + } catch (XMLReaderException e) { + e.printStackTrace(); + } catch (InvalidBoatDataException e) { + e.printStackTrace(); + } catch (InvalidRegattaDataException e) { + e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } } diff --git a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java index a6bd8301..036e1f2a 100644 --- a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java +++ b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java @@ -15,6 +15,11 @@ public class RaceConnection { private final int port; private final StringProperty status; + /** + * Constructor for remote host connections. + * @param hostname URL for remote host + * @param port port for game feed + */ public RaceConnection(String hostname, int port) { this.hostname = new SimpleStringProperty(hostname); this.port = port; diff --git a/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml b/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml index 32384999..254ddb8a 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml @@ -1,15 +1,25 @@ - - - + + + + + + + + + + - + + - - + + + + @@ -18,42 +28,43 @@ - + - + - - -