From e149255240d0befac613021fbc2e8ff98a916135 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Fri, 8 Sep 2017 20:10:45 +1200 Subject: [PATCH] Tried to get multiple boats working but.... it's not #story[1196] --- .../src/main/java/mock/app/Event.java | 2 +- .../src/main/java/mock/xml/RaceXMLCreator.java | 2 +- .../src/main/java/shared/model/Constants.java | 4 ++-- .../visualiser/Controllers/HostController.java | 2 +- .../visualiser/Controllers/RaceController.java | 12 ++++++++++-- .../main/java/visualiser/layout/Subject3D.java | 6 +++--- .../main/resources/assets/V1.3 BurgerBoat.stl | Bin 0 -> 53284 bytes 7 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 racevisionGame/src/main/resources/assets/V1.3 BurgerBoat.stl diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 703686bc..2c3da7ad 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -180,7 +180,7 @@ public class Event { public static String setRaceXMLAtCurrentTimeToNow(String raceXML) { //The start time is current time + 4 minutes. prestart is 3 minutes, and we add another minute. - long millisecondsToAdd = Constants.RacePreStartTime + Constants.RacePreparatoryTime; + long millisecondsToAdd = Constants.RacePreStartTime + 1 * 60 * 10000; long secondsToAdd = millisecondsToAdd / 1000; //Scale the time using our time scalar. secondsToAdd = secondsToAdd / Constants.RaceTimeScale; diff --git a/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java b/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java index b168862f..9b835f82 100644 --- a/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java +++ b/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java @@ -187,7 +187,7 @@ public class RaceXMLCreator { public static void setRaceXMLAtCurrentTimeToNow(XMLRace raceXML) { //The start time is current time + 4 minutes. prestart is 3 minutes, and we add another minute. - long millisecondsToAdd = Constants.RacePreStartTime + Constants.RacePreparatoryTime; + long millisecondsToAdd = Constants.RacePreStartTime + 1 * 60 * 1000; long secondsToAdd = millisecondsToAdd / 1000; //Scale the time using our time scalar. secondsToAdd = secondsToAdd / Constants.RaceTimeScale; diff --git a/racevisionGame/src/main/java/shared/model/Constants.java b/racevisionGame/src/main/java/shared/model/Constants.java index 18a2aaed..5dce72e6 100644 --- a/racevisionGame/src/main/java/shared/model/Constants.java +++ b/racevisionGame/src/main/java/shared/model/Constants.java @@ -39,14 +39,14 @@ public class Constants { * The race pre-start time, in milliseconds. 3 minutes (30 seconds for development). */ // public static final long RacePreStartTime = 30 * 1000; - public static final long RacePreStartTime = 1000; + public static final long RacePreStartTime = 30 * 1000; /** * The race preparatory time, in milliseconds. 1 minute. */ // public static final long RacePreparatoryTime = 60 * 1000; - public static final long RacePreparatoryTime = 3 * 1000; + public static final long RacePreparatoryTime = 60 * 1000; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index 2855a770..b2a91889 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -93,7 +93,7 @@ public class HostController extends Controller { */ public void hostGamePressed() { try { - this.game = new Event(false); + this.game = new Event(true); connectSocket("localhost", 4942); } catch (EventConstructionException e) { Logger.getGlobal().log(Level.SEVERE, "Could not create Event.", e); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index b2858477..fbcf0c2f 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -191,6 +191,10 @@ public class RaceController extends Controller { StlMeshImporter importerMark = new StlMeshImporter(); importerMark.read(markerAsset); + URL alternateBoatAsset = HostController.class.getClassLoader().getResource("assets/V1.3 BurgerBoat.stl"); + StlMeshImporter importerBurgerBoat = new StlMeshImporter(); + importerBurgerBoat.read(alternateBoatAsset); + view3D = new View3D(); view3D.setDistance(1050); view3D.setYaw(0); @@ -222,10 +226,14 @@ public class RaceController extends Controller { } for(VisualiserBoat boat: race.getVisualiserRaceState().getBoats()) { - MeshView mesh = new MeshView(importer.getImport()); + MeshView mesh = null; + if(boat.getSourceID() == race.getVisualiserRaceState().getPlayerBoatID()) { + mesh = new MeshView(importer.getImport()); + } else { + mesh = new MeshView(importerBurgerBoat.getImport()); + } Subject3D subject = new Subject3D(mesh); subjects.add(subject); - AnimationTimer trackBoat = new AnimationTimer() { @Override public void handle(long now) { diff --git a/racevisionGame/src/main/java/visualiser/layout/Subject3D.java b/racevisionGame/src/main/java/visualiser/layout/Subject3D.java index adfd93ab..63f3b3c8 100644 --- a/racevisionGame/src/main/java/visualiser/layout/Subject3D.java +++ b/racevisionGame/src/main/java/visualiser/layout/Subject3D.java @@ -33,9 +33,9 @@ public class Subject3D { this.heading = new Rotate(0, Rotate.Y_AXIS); this.mesh.getTransforms().addAll(position, heading, new Rotate(90, Rotate.X_AXIS), new Rotate(180, Rotate.Y_AXIS)); - this.position.xProperty().addListener(((observable, oldValue, newValue) -> System.out.println("Boat x: " + newValue))); - this.position.yProperty().addListener(((observable, oldValue, newValue) -> System.out.println("Boat y: " + newValue))); - this.position.zProperty().addListener(((observable, oldValue, newValue) -> System.out.println("Boat z: " + newValue))); +// this.position.xProperty().addListener(((observable, oldValue, newValue) -> System.out.println("Boat x: " + newValue))); +// this.position.yProperty().addListener(((observable, oldValue, newValue) -> System.out.println("Boat y: " + newValue))); +// this.position.zProperty().addListener(((observable, oldValue, newValue) -> System.out.println("Boat z: " + newValue))); } public Shape3D getMesh() { diff --git a/racevisionGame/src/main/resources/assets/V1.3 BurgerBoat.stl b/racevisionGame/src/main/resources/assets/V1.3 BurgerBoat.stl new file mode 100644 index 0000000000000000000000000000000000000000..b8f0f54a702cae3dbf3e8a851cfcc35d0cf62850 GIT binary patch literal 53284 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 literal 0 HcmV?d00001