From eb83e9dcc570718f96c8e2261cd67b1286d4d0fc Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Thu, 3 Aug 2017 14:50:56 +1200 Subject: [PATCH 01/13] Working idle sail animation. Need to work on getting sails to toggle properly. Have the 2 animations almost working but unable to switch between the two. #story[1111] --- .../seng302/controllers/LobbyController.java | 2 + .../java/seng302/fxObjects/BoatGroup.java | 42 ++++++++++++++++++- src/main/java/seng302/models/Yacht.java | 5 ++- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index b9d407fe..09425708 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -97,7 +97,9 @@ public class LobbyController implements Initializable, Observer{ .addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl))); } catch (javafx.fxml.LoadException e) { System.out.println("[Controller] FXML load exception"); + e.printStackTrace(); } catch (IOException e) { + System.out.println("[Controller] IO exception"); } catch (NullPointerException e) { // System.out.println("[Controller] Null Pointer Exception"); diff --git a/src/main/java/seng302/fxObjects/BoatGroup.java b/src/main/java/seng302/fxObjects/BoatGroup.java index 2446f9d4..efbdb499 100644 --- a/src/main/java/seng302/fxObjects/BoatGroup.java +++ b/src/main/java/seng302/fxObjects/BoatGroup.java @@ -11,6 +11,8 @@ import javafx.scene.shape.Line; import javafx.scene.shape.Polygon; import javafx.scene.transform.Rotate; import seng302.client.ClientPacketParser; +import seng302.gameServer.GameStages; +import seng302.gameServer.GameState; import seng302.models.Yacht; import seng302.utilities.GeoUtility; import seng302.controllers.CanvasController; @@ -43,6 +45,7 @@ public class BoatGroup extends Group { private Group lineGroup = new Group(); private Polygon boatPoly; private Wake wake; + private Polygon sail; private Line leftLayLine; private Line rightLayline; private Double distanceTravelled = 0.0; @@ -52,6 +55,7 @@ public class BoatGroup extends Group { private Color color; private Boolean isSelected = true; //All boats are initialised as selected\ private boolean isPlayer = false; + private Double sailState = 0.0; /** * Creates a BoatGroup with the default triangular boat polygon. @@ -105,14 +109,32 @@ public class BoatGroup extends Group { boatPoly.setCache(true); boatPoly.setCacheHint(CacheHint.SPEED); boatAnnotations = new BoatAnnotations(boat, this.color); - + sail = new Polygon(0.0,BOAT_HEIGHT / 4, + 0.0, BOAT_HEIGHT); + animateSail(); + sail.setStrokeWidth(2.0); + sail.setStroke(Color.SILVER); leftLayLine = new Line(); rightLayline = new Line(); wake = new Wake(0, -BOAT_HEIGHT); - super.getChildren().addAll(boatPoly, boatAnnotations); + super.getChildren().addAll(boatPoly, boatAnnotations, sail); } + + private void animateSail(){ + Double[] points = new Double[100]; + for (int i = 0; i < 50; i++) { + points[i * 2] = 5 * Math.sin(((Math.PI * i) / 25 + sailState)); + points[i * 2 + 1] = (BOAT_HEIGHT * i) / 50 + BOAT_HEIGHT / 4; + } + sailState = sailState + Math.PI / 25; + sail.getPoints().clear(); + sail.getPoints().addAll(points); + + } + + /** * Creates the javafx objects that will be the in the group by default. * @@ -154,6 +176,16 @@ public class BoatGroup extends Group { boatPoly.setLayoutY(y); boatAnnotations.setLayoutX(x); boatAnnotations.setLayoutY(y); + sail.setLayoutX(x); + sail.setLayoutY(y); + if (!boat.getSailIn()) { + animateSail(); + } else { + sail.getPoints().clear(); + sail.getPoints().addAll(0.0,BOAT_HEIGHT / 4, + 0.0, BOAT_HEIGHT); + + } wake.setLayoutX(x); wake.setLayoutY(y); wake.rotate(rotation); @@ -161,6 +193,12 @@ public class BoatGroup extends Group { private void rotateTo(double rotation) { boatPoly.getTransforms().setAll(new Rotate(rotation)); + //TODO kre39 - Make the sails out angle depend on the facing of the boat + if (!boat.getSailIn()) { + sail.getTransforms().setAll(new Rotate(GameState.getWindDirection() + 95.0)); + } else { + sail.getTransforms().setAll(new Rotate(GameState.getWindDirection())); + } } /** diff --git a/src/main/java/seng302/models/Yacht.java b/src/main/java/seng302/models/Yacht.java index 67ab3373..7738837f 100644 --- a/src/main/java/seng302/models/Yacht.java +++ b/src/main/java/seng302/models/Yacht.java @@ -124,6 +124,7 @@ public class Yacht { Double trueWindAngle = Math.abs(GameState.getWindDirection() - heading); Double boatSpeedInKnots = PolarTable.getBoatSpeed(windSpeedKnots, trueWindAngle); Double maxBoatSpeed = boatSpeedInKnots / ClientPacketParser.MS_TO_KNOTS * 1000; + System.out.println("sailIn = " + sailIn); if (sailIn && velocity <= maxBoatSpeed && maxBoatSpeed != 0d) { if (velocity < maxBoatSpeed) { @@ -170,7 +171,8 @@ public class Yacht { } public void toggleSailIn() { - sailIn = !sailIn; + this.sailIn = !sailIn; + System.out.println("sailIn = " + sailIn); } public void turnUpwind() { @@ -389,6 +391,7 @@ public class Yacht { } public Boolean getSailIn() { + System.out.println("sailIn = " + sailIn); return sailIn; } From 99d5545ed36b418d6260351e1ea48032a3aad80a Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Thu, 3 Aug 2017 16:33:51 +1200 Subject: [PATCH 02/13] Made the sails work properly by toggling. Need to remove the unneeded code I added. #story[1111] --- src/main/java/seng302/model/Yacht.java | 16 ++++-- .../java/seng302/visualiser/GameClient.java | 1 + .../java/seng302/visualiser/GameView.java | 10 +++- .../controllers/RaceViewController.java | 4 ++ .../visualiser/fxObjects/BoatObject.java | 52 ++++++++++++++++--- 5 files changed, 69 insertions(+), 14 deletions(-) diff --git a/src/main/java/seng302/model/Yacht.java b/src/main/java/seng302/model/Yacht.java index aba80d1a..df6c1810 100644 --- a/src/main/java/seng302/model/Yacht.java +++ b/src/main/java/seng302/model/Yacht.java @@ -23,9 +23,10 @@ import seng302.model.mark.CompoundMark; */ public class Yacht { + @FunctionalInterface public interface YachtLocationListener { - void notifyLocation(Yacht yacht, double lat, double lon, double heading, double velocity); + void notifyLocation(Yacht yacht, double lat, double lon, double heading, double velocity, boolean sailIn); } //BOTH AFAIK @@ -48,7 +49,7 @@ public class Yacht { //SERVER SIDE private final Double TURN_STEP = 5.0; private Double lastHeading; - private Boolean sailIn; + private Boolean sailIn = false; private GeoPoint location; private Integer boatStatus; private Double velocity; @@ -61,6 +62,7 @@ public class Yacht { private CompoundMark lastMarkRounded; private Integer positionInt = 0; private Color colour; + private Boolean clientSailsIn = false; public Yacht(String boatType, Integer sourceId, String hullID, String shortName, String boatName, String country) { @@ -70,7 +72,6 @@ public class Yacht { this.shortName = shortName; this.boatName = boatName; this.country = country; - this.sailIn = false; this.location = new GeoPoint(57.670341, 11.826856); this.heading = 120.0; //In degrees this.velocity = 0d; //in mms-1 @@ -281,6 +282,10 @@ public class Yacht { this.velocityProperty.set(velocity); } + public void updateSailsInProperty(Boolean clientSails) { + this.clientSailsIn = clientSails; + } + public void setMarkRoundingTime(Long markRoundingTime) { this.markRoundTime = markRoundingTime; } @@ -383,6 +388,9 @@ public class Yacht { this.colour = colour; } + public void toggleClientSail() { + clientSailsIn = !clientSailsIn; + } public Double getVelocity() { return velocity; @@ -399,7 +407,7 @@ public class Yacht { this.velocity = velocity; updateVelocityProperty(velocity); for (YachtLocationListener yll : locationListeners) { - yll.notifyLocation(this, lat, lon, heading, velocity); + yll.notifyLocation(this, lat, lon, heading, velocity, this.clientSailsIn); } } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 915eef37..35b05615 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -319,6 +319,7 @@ public class GameClient { BoatActionMessage boatActionMessage = new BoatActionMessage( BoatActionType.SAILS_IN); socketThread.sendBoatActionMessage(boatActionMessage); + raceView.getGameView().getPlayerYacht().toggleClientSail(); break; } } diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 73d49b89..37507035 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -80,6 +80,7 @@ public class GameView extends Pane { private Double frameRate = 60.0; private int frameTimeIndex = 0; private boolean arrayFilled = false; + private Yacht playerYacht; private enum ScaleDirection { HORIZONTAL, @@ -324,10 +325,10 @@ public class GameView extends Pane { boatObjectGroup.getChildren().add(newBoat); trails.getChildren().add(newBoat.getTrail()); // TODO: 1/08/17 Make this less vile to look at. - yacht.addLocationListener((boat, lat, lon, heading, velocity) ->{ + yacht.addLocationListener((boat, lat, lon, heading, velocity, sailIn) ->{ BoatObject bo = boatObjects.get(boat); Point2D p2d = findScaledXY(lat, lon); - bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity); + bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn); // annotations.get(boat).setLayoutX(p2d.getX()); // annotations.get(boat).setLayoutY(p2d.getY()); // annotations.get(boat).setLocation(100d, 100d); @@ -569,7 +570,12 @@ public class GameView extends Pane { timer.start(); } + public Yacht getPlayerYacht() { + return playerYacht; + } + public void setBoatAsPlayer (Yacht playerYacht) { + this.playerYacht = playerYacht; boatObjects.get(playerYacht).setAsPlayer(); annotations.get(playerYacht).addAnnotation( "velocity", diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index a6df4f61..63ce668a 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -595,4 +595,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel this.courseData = raceData; gameView.updateBorder(raceData.getCourseLimit()); } + + public GameView getGameView() { + return gameView; + } } \ No newline at end of file diff --git a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java index 3441ba2d..5c8e6f15 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -12,6 +12,7 @@ import javafx.scene.shape.Line; import javafx.scene.shape.Polygon; import javafx.scene.shape.Polyline; import javafx.scene.transform.Rotate; +import seng302.gameServer.GameState; /** * BoatGroup is a javafx group that by default contains a graphical objects for representing a 2 @@ -30,9 +31,11 @@ public class BoatObject extends Group { private double xVelocity; private double yVelocity; private double lastHeading; + private double sailState; //Graphical objects private Polyline trail = new Polyline(); private Polygon boatPoly; + private Polygon sail; private Wake wake; private Line leftLayLine; private Line rightLayline; @@ -87,14 +90,21 @@ public class BoatObject extends Group { // annotationBox = new AnnotationBox(); // annotationBox.setFill(colour); - + sail = new Polygon(0.0, BOAT_HEIGHT / 4, + 0.0, BOAT_HEIGHT); + sailState = 0; + sail.setStrokeWidth(2.0); + sail.setStroke(Color.SILVER); + sail.setFill(Color.TRANSPARENT); + sail.setCache(true); + animateSail(); leftLayLine = new Line(); rightLayline = new Line(); trail.getStrokeDashArray().setAll(5d, 10d); trail.setCache(true); wake = new Wake(0, -BOAT_HEIGHT); wake.setVisible(true); - super.getChildren().addAll(boatPoly);//, annotationBox); + super.getChildren().addAll(boatPoly, sail);//, annotationBox); } public void setFill (Paint value) { @@ -105,19 +115,29 @@ public class BoatObject extends Group { /** * Moves the boat and its children annotations to coordinates specified - * - * @param x The X coordinate to move the boat to + * @param x The X coordinate to move the boat to * @param y The Y coordinate to move the boat to * @param rotation The rotation by which the boat moves * @param velocity The velocity the boat is moving + * @param sailIn */ - public void moveTo(double x, double y, double rotation, double velocity) { + public void moveTo(double x, double y, double rotation, double velocity, Boolean sailIn) { Double dx = Math.abs(boatPoly.getLayoutX() - x); Double dy = Math.abs(boatPoly.getLayoutY() - y); Platform.runLater(() -> { - rotateTo(rotation); + rotateTo(rotation, sailIn); boatPoly.setLayoutX(x); boatPoly.setLayoutY(y); + sail.setLayoutX(x); + sail.setLayoutY(y); + if (!sailIn) { + animateSail(); + } else { + sail.getPoints().clear(); + sail.getPoints().addAll(0.0,BOAT_HEIGHT / 4, + 0.0, BOAT_HEIGHT); + + } wake.setLayoutX(x); wake.setLayoutY(y); }); @@ -142,8 +162,24 @@ public class BoatObject extends Group { } } - private void rotateTo(double rotation) { + private void rotateTo(double rotation, boolean sailsIn) { boatPoly.getTransforms().setAll(new Rotate(rotation)); + if (sailsIn) { + sail.getTransforms().setAll(new Rotate(GameState.getWindDirection() + 95.0)); + } else { + sail.getTransforms().setAll(new Rotate(GameState.getWindDirection())); + } + } + private void animateSail(){ + Double[] points = new Double[100]; + for (int i = 0; i < 50; i++) { + points[i * 2] = 5 * Math.sin(((Math.PI * i) / 25 + sailState)); + points[i * 2 + 1] = (BOAT_HEIGHT * i) / 25 + BOAT_HEIGHT / 4; + } + sailState = sailState + Math.PI / 10; + sail.getPoints().clear(); + sail.getPoints().addAll(points); + } public void updateLocation() { @@ -279,7 +315,7 @@ public class BoatObject extends Group { public void setTrajectory(double heading, double velocity) { wake.setRotation(lastHeading - heading, velocity); - rotateTo(heading); + rotateTo(heading, false); xVelocity = Math.cos(Math.toRadians(heading)) * velocity; yVelocity = Math.sin(Math.toRadians(heading)) * velocity; lastHeading = heading; From f8af9cc259bddc417ea3e31d1a6bf210b5e9d1c4 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Thu, 3 Aug 2017 19:07:30 +1200 Subject: [PATCH 03/13] Works for clients and server. Due to the information being sent and received, it only currently works on client side boats. #story[1111] --- src/main/java/seng302/model/Yacht.java | 5 +-- .../visualiser/fxObjects/BoatObject.java | 40 ++++++++++--------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/main/java/seng302/model/Yacht.java b/src/main/java/seng302/model/Yacht.java index df6c1810..7ed1a5d3 100644 --- a/src/main/java/seng302/model/Yacht.java +++ b/src/main/java/seng302/model/Yacht.java @@ -282,9 +282,6 @@ public class Yacht { this.velocityProperty.set(velocity); } - public void updateSailsInProperty(Boolean clientSails) { - this.clientSailsIn = clientSails; - } public void setMarkRoundingTime(Long markRoundingTime) { this.markRoundTime = markRoundingTime; @@ -407,7 +404,7 @@ public class Yacht { this.velocity = velocity; updateVelocityProperty(velocity); for (YachtLocationListener yll : locationListeners) { - yll.notifyLocation(this, lat, lon, heading, velocity, this.clientSailsIn); + yll.notifyLocation(this, lat, lon, heading, velocity, clientSailsIn); } } diff --git a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java index 5c8e6f15..097658a9 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -90,21 +90,14 @@ public class BoatObject extends Group { // annotationBox = new AnnotationBox(); // annotationBox.setFill(colour); - sail = new Polygon(0.0, BOAT_HEIGHT / 4, - 0.0, BOAT_HEIGHT); - sailState = 0; - sail.setStrokeWidth(2.0); - sail.setStroke(Color.SILVER); - sail.setFill(Color.TRANSPARENT); - sail.setCache(true); - animateSail(); + leftLayLine = new Line(); rightLayline = new Line(); trail.getStrokeDashArray().setAll(5d, 10d); trail.setCache(true); wake = new Wake(0, -BOAT_HEIGHT); wake.setVisible(true); - super.getChildren().addAll(boatPoly, sail);//, annotationBox); + super.getChildren().addAll(boatPoly); } public void setFill (Paint value) { @@ -128,15 +121,16 @@ public class BoatObject extends Group { rotateTo(rotation, sailIn); boatPoly.setLayoutX(x); boatPoly.setLayoutY(y); - sail.setLayoutX(x); - sail.setLayoutY(y); - if (!sailIn) { + if (isPlayer && !sailIn) { animateSail(); - } else { + sail.setLayoutX(x); + sail.setLayoutY(y); + } else if (isPlayer){ sail.getPoints().clear(); sail.getPoints().addAll(0.0,BOAT_HEIGHT / 4, 0.0, BOAT_HEIGHT); - + sail.setLayoutX(x); + sail.setLayoutY(y); } wake.setLayoutX(x); wake.setLayoutY(y); @@ -164,10 +158,10 @@ public class BoatObject extends Group { private void rotateTo(double rotation, boolean sailsIn) { boatPoly.getTransforms().setAll(new Rotate(rotation)); - if (sailsIn) { - sail.getTransforms().setAll(new Rotate(GameState.getWindDirection() + 95.0)); - } else { - sail.getTransforms().setAll(new Rotate(GameState.getWindDirection())); + if (isPlayer && sailsIn) { + sail.getTransforms().setAll(new Rotate(95.0)); + } else if (isPlayer){ + sail.getTransforms().setAll(new Rotate(90.0)); } } private void animateSail(){ @@ -311,6 +305,16 @@ public class BoatObject extends Group { boatPoly.setStroke(Color.BLACK); boatPoly.setStrokeWidth(3); isPlayer = true; + sail = new Polygon(0.0, BOAT_HEIGHT / 4, + 0.0, BOAT_HEIGHT); + sailState = 0; + sail.setStrokeWidth(2.0); + sail.setStroke(Color.BLACK); + sail.setFill(Color.TRANSPARENT); + sail.setCache(true); + super.getChildren().clear(); + super.getChildren().addAll(boatPoly, sail); + animateSail(); } public void setTrajectory(double heading, double velocity) { From ae28ccf2283c1b71b914499aee60a1a5bd88a46e Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Fri, 4 Aug 2017 16:24:34 +1200 Subject: [PATCH 04/13] Made sails luff in the right direction. #story[1111] --- .../java/seng302/visualiser/fxObjects/BoatObject.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java index 097658a9..bb6d6b64 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -125,7 +125,7 @@ public class BoatObject extends Group { animateSail(); sail.setLayoutX(x); sail.setLayoutY(y); - } else if (isPlayer){ + } else if (isPlayer) { sail.getPoints().clear(); sail.getPoints().addAll(0.0,BOAT_HEIGHT / 4, 0.0, BOAT_HEIGHT); @@ -170,7 +170,11 @@ public class BoatObject extends Group { points[i * 2] = 5 * Math.sin(((Math.PI * i) / 25 + sailState)); points[i * 2 + 1] = (BOAT_HEIGHT * i) / 25 + BOAT_HEIGHT / 4; } - sailState = sailState + Math.PI / 10; + if (sailState == - 2 * Math.PI) { + sailState = 0; + } else { + sailState = sailState - Math.PI / 10; + } sail.getPoints().clear(); sail.getPoints().addAll(points); From ecf2c52cfa1f7a7e2125496426ba052e3afb6e59 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sun, 6 Aug 2017 15:43:22 +1200 Subject: [PATCH 05/13] Added tests, and sails to all clients. #story[1111] --- src/main/java/seng302/model/Yacht.java | 6 ++- .../java/seng302/visualiser/GameView.java | 3 +- .../visualiser/fxObjects/BoatObject.java | 45 +++++++++---------- .../map/BoatSailAnimationToggleTest.java | 35 +++++++++++++++ 4 files changed, 64 insertions(+), 25 deletions(-) create mode 100644 src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java diff --git a/src/main/java/seng302/model/Yacht.java b/src/main/java/seng302/model/Yacht.java index 7ed1a5d3..16df9123 100644 --- a/src/main/java/seng302/model/Yacht.java +++ b/src/main/java/seng302/model/Yacht.java @@ -62,7 +62,7 @@ public class Yacht { private CompoundMark lastMarkRounded; private Integer positionInt = 0; private Color colour; - private Boolean clientSailsIn = false; + private Boolean clientSailsIn = true; public Yacht(String boatType, Integer sourceId, String hullID, String shortName, String boatName, String country) { @@ -397,6 +397,10 @@ public class Yacht { this.velocity = velocity; } + public Boolean getClientSailsIn(){ + return clientSailsIn; + } + public void updateLocation (double lat, double lon, double heading, double velocity) { this.lat = lat; this.lon = lon; diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 37507035..45abc37a 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -328,7 +328,7 @@ public class GameView extends Pane { yacht.addLocationListener((boat, lat, lon, heading, velocity, sailIn) ->{ BoatObject bo = boatObjects.get(boat); Point2D p2d = findScaledXY(lat, lon); - bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn); + bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, 95.0); // annotations.get(boat).setLayoutX(p2d.getX()); // annotations.get(boat).setLayoutY(p2d.getY()); // annotations.get(boat).setLocation(100d, 100d); @@ -576,6 +576,7 @@ public class GameView extends Pane { public void setBoatAsPlayer (Yacht playerYacht) { this.playerYacht = playerYacht; + this.playerYacht.toggleClientSail(); boatObjects.get(playerYacht).setAsPlayer(); annotations.get(playerYacht).addAnnotation( "velocity", diff --git a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java index bb6d6b64..2527fca1 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -12,7 +12,6 @@ import javafx.scene.shape.Line; import javafx.scene.shape.Polygon; import javafx.scene.shape.Polyline; import javafx.scene.transform.Rotate; -import seng302.gameServer.GameState; /** * BoatGroup is a javafx group that by default contains a graphical objects for representing a 2 @@ -97,7 +96,16 @@ public class BoatObject extends Group { trail.setCache(true); wake = new Wake(0, -BOAT_HEIGHT); wake.setVisible(true); - super.getChildren().addAll(boatPoly); + + sail = new Polygon(0.0,BOAT_HEIGHT / 4, + 0.0, BOAT_HEIGHT); + sailState = 0; + sail.setStrokeWidth(2.0); + sail.setStroke(Color.BLACK); + sail.setFill(Color.TRANSPARENT); + sail.setCache(true); + super.getChildren().clear(); + super.getChildren().addAll(boatPoly, sail); } public void setFill (Paint value) { @@ -114,23 +122,23 @@ public class BoatObject extends Group { * @param velocity The velocity the boat is moving * @param sailIn */ - public void moveTo(double x, double y, double rotation, double velocity, Boolean sailIn) { + public void moveTo(double x, double y, double rotation, double velocity, Boolean sailIn, double windDir) { Double dx = Math.abs(boatPoly.getLayoutX() - x); Double dy = Math.abs(boatPoly.getLayoutY() - y); Platform.runLater(() -> { - rotateTo(rotation, sailIn); + rotateTo(rotation, sailIn, windDir); boatPoly.setLayoutX(x); boatPoly.setLayoutY(y); - if (isPlayer && !sailIn) { - animateSail(); - sail.setLayoutX(x); - sail.setLayoutY(y); - } else if (isPlayer) { + if (sailIn) { sail.getPoints().clear(); sail.getPoints().addAll(0.0,BOAT_HEIGHT / 4, 0.0, BOAT_HEIGHT); sail.setLayoutX(x); sail.setLayoutY(y); + } else { + animateSail(); + sail.setLayoutX(x); + sail.setLayoutY(y); } wake.setLayoutX(x); wake.setLayoutY(y); @@ -156,11 +164,11 @@ public class BoatObject extends Group { } } - private void rotateTo(double rotation, boolean sailsIn) { + private void rotateTo(double rotation, boolean sailsIn, double windDir) { boatPoly.getTransforms().setAll(new Rotate(rotation)); - if (isPlayer && sailsIn) { + if (sailsIn) { sail.getTransforms().setAll(new Rotate(95.0)); - } else if (isPlayer){ + } else { sail.getTransforms().setAll(new Rotate(90.0)); } } @@ -309,21 +317,12 @@ public class BoatObject extends Group { boatPoly.setStroke(Color.BLACK); boatPoly.setStrokeWidth(3); isPlayer = true; - sail = new Polygon(0.0, BOAT_HEIGHT / 4, - 0.0, BOAT_HEIGHT); - sailState = 0; - sail.setStrokeWidth(2.0); - sail.setStroke(Color.BLACK); - sail.setFill(Color.TRANSPARENT); - sail.setCache(true); - super.getChildren().clear(); - super.getChildren().addAll(boatPoly, sail); animateSail(); } - public void setTrajectory(double heading, double velocity) { + public void setTrajectory(double heading, double velocity, double windDir) { wake.setRotation(lastHeading - heading, velocity); - rotateTo(heading, false); + rotateTo(heading, false, windDir); xVelocity = Math.cos(Math.toRadians(heading)) * velocity; yVelocity = Math.sin(Math.toRadians(heading)) * velocity; lastHeading = heading; diff --git a/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java b/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java new file mode 100644 index 00000000..0f353701 --- /dev/null +++ b/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java @@ -0,0 +1,35 @@ +package seng302.visualiser.map; + +import static junit.framework.TestCase.assertFalse; +import static junit.framework.TestCase.assertTrue; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import seng302.model.Yacht; +import seng302.visualiser.fxObjects.BoatObject; + +/** + * Created by kre39 on 6/08/17. + */ +public class BoatSailAnimationToggleTest { + + private Yacht yacht; + + + @Before + public void setup() throws Exception{ + yacht = new Yacht("Yacht", 1, "YACHT", "YAC", "Test Yacht", "NZ"); + } + + + @Test + public void sailToggleTest() throws Exception { + assertFalse(yacht.getClientSailsIn()); + assertFalse(yacht.getSailIn()); + yacht.toggleClientSail(); + assertTrue(yacht.getClientSailsIn()); + assertFalse(yacht.getSailIn()); + } + +} From c7857872cea01b7b89998a1ddc833196eb8c1489 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Mon, 7 Aug 2017 15:24:01 +1200 Subject: [PATCH 06/13] Luffing sails animation working correctly, working on sailsin animation now. #story[1111] #pair[kre39,ptg19] --- .../java/seng302/visualiser/GameClient.java | 3 +++ .../java/seng302/visualiser/GameView.java | 9 ++++++- .../visualiser/fxObjects/BoatObject.java | 25 +++++++++++++------ src/main/resources/config/config.xml | 2 +- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 35b05615..24cd3aaa 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -250,6 +250,9 @@ public class GameClient { private void processRaceStatusUpdate(RaceStatusData data) { if (allXMLReceived()) { raceState.updateState(data); + if (raceView != null) { + raceView.getGameView().setWindDir(raceState.getWindDirection()); + } for (long[] boatData : data.getBoatData()) { Yacht yacht = allBoatsMap.get((int) boatData[0]); yacht.setEstimateTimeTillNextMark(raceState.getRaceTime() - boatData[1]); diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 45abc37a..4e0e67c1 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -81,6 +81,7 @@ public class GameView extends Pane { private int frameTimeIndex = 0; private boolean arrayFilled = false; private Yacht playerYacht; + private double windDir = 0.0; private enum ScaleDirection { HORIZONTAL, @@ -328,7 +329,7 @@ public class GameView extends Pane { yacht.addLocationListener((boat, lat, lon, heading, velocity, sailIn) ->{ BoatObject bo = boatObjects.get(boat); Point2D p2d = findScaledXY(lat, lon); - bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, 95.0); + bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir); // annotations.get(boat).setLayoutX(p2d.getX()); // annotations.get(boat).setLayoutY(p2d.getY()); // annotations.get(boat).setLocation(100d, 100d); @@ -566,6 +567,12 @@ public class GameView extends Pane { timer.stop(); } + + public void setWindDir(double windDir) { + this.windDir = windDir; + } + + public void startRace () { timer.start(); } diff --git a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java index 2527fca1..10830cbb 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -131,8 +131,8 @@ public class BoatObject extends Group { boatPoly.setLayoutY(y); if (sailIn) { sail.getPoints().clear(); - sail.getPoints().addAll(0.0,BOAT_HEIGHT / 4, - 0.0, BOAT_HEIGHT); +// sail.getPoints().addAll(0.0, 0.0, 4.0, 1.5, 8.0, 3.0, 12.0, 3.5, 16.0, 3.0, 20.0, 1.5, 24.0, 0.0); + sail.getPoints().addAll(0.0, 0.0, 24.0, 0.0); sail.setLayoutX(x); sail.setLayoutY(y); } else { @@ -167,21 +167,30 @@ public class BoatObject extends Group { private void rotateTo(double rotation, boolean sailsIn, double windDir) { boatPoly.getTransforms().setAll(new Rotate(rotation)); if (sailsIn) { - sail.getTransforms().setAll(new Rotate(95.0)); + sail.getTransforms().setAll(new Rotate(windDir + 90)); + + + } else { - sail.getTransforms().setAll(new Rotate(90.0)); + sail.getTransforms().setAll(new Rotate(windDir)); } } + + private void animateSail(){ - Double[] points = new Double[100]; + Double[] points = new Double[200]; + double amplitude = 2.0; + double period = 10; for (int i = 0; i < 50; i++) { - points[i * 2] = 5 * Math.sin(((Math.PI * i) / 25 + sailState)); - points[i * 2 + 1] = (BOAT_HEIGHT * i) / 25 + BOAT_HEIGHT / 4; + points[i * 2] = amplitude * Math.sin(((Math.PI * i) / period + sailState)); + points[i * 2 + 1] = (BOAT_HEIGHT * i) / BOAT_HEIGHT / 2; + points[199 - (i * 2)] = (BOAT_HEIGHT * i) / BOAT_HEIGHT / 2; + points[199 - (i * 2 + 1)] = amplitude * Math.sin(((Math.PI * i) / period + sailState)); } if (sailState == - 2 * Math.PI) { sailState = 0; } else { - sailState = sailState - Math.PI / 10; + sailState = sailState - Math.PI / 5; } sail.getPoints().clear(); sail.getPoints().addAll(points); diff --git a/src/main/resources/config/config.xml b/src/main/resources/config/config.xml index b5c90704..4f002974 100644 --- a/src/main/resources/config/config.xml +++ b/src/main/resources/config/config.xml @@ -4,6 +4,6 @@ AC35 6 10.0 - 135 + 135 From f97b18d594424b39fc498a56e8050a32d1747e10 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Mon, 7 Aug 2017 16:48:30 +1200 Subject: [PATCH 07/13] Sailsin graphics moving and working as expected. #story[1111] #pair[kre39,ptg19] --- .../visualiser/fxObjects/BoatObject.java | 44 +++++++++++++++---- .../map/BoatSailAnimationToggleTest.java | 2 - 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java index 10830cbb..76180bf8 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -130,9 +130,9 @@ public class BoatObject extends Group { boatPoly.setLayoutX(x); boatPoly.setLayoutY(y); if (sailIn) { - sail.getPoints().clear(); +// sail.getPoints().clear(); // sail.getPoints().addAll(0.0, 0.0, 4.0, 1.5, 8.0, 3.0, 12.0, 3.5, 16.0, 3.0, 20.0, 1.5, 24.0, 0.0); - sail.getPoints().addAll(0.0, 0.0, 24.0, 0.0); +// sail.getPoints().addAll(0.0, 0.0, 24.0, 0.0); sail.setLayoutX(x); sail.setLayoutY(y); } else { @@ -164,13 +164,41 @@ public class BoatObject extends Group { } } - private void rotateTo(double rotation, boolean sailsIn, double windDir) { - boatPoly.getTransforms().setAll(new Rotate(rotation)); + private Double normalizeHeading(double heading, double windDirection) { + Double normalizedHeading = heading - windDirection; + normalizedHeading = (double) Math.floorMod(normalizedHeading.longValue(), 360L); + return normalizedHeading; + } + + + private void rotateTo(double heading, boolean sailsIn, double windDir) { + boatPoly.getTransforms().setAll(new Rotate(heading)); if (sailsIn) { - sail.getTransforms().setAll(new Rotate(windDir + 90)); - - - + Double sailWindOffset = 30.0; + Double upwindAngleLimit = 15.0; + Double downwindAngleLimit = 10.0; //Upwind from normalised horizontal + Double normalizedHeading = normalizeHeading(heading, windDir); + if (normalizedHeading < 180) { + sail.getTransforms().setAll(new Rotate(windDir + 90 + sailWindOffset)); + sail.getPoints().clear(); + sail.getPoints().addAll(0.0, 0.0, 4.0, -1.5, 8.0, -3.0, 12.0, -3.5, 16.0, -3.0, 20.0, -1.5, 24.0, 0.0); + if (normalizedHeading > 90 + sailWindOffset){ + sail.getTransforms().setAll(new Rotate(heading + downwindAngleLimit)); + } + if (normalizedHeading < sailWindOffset + upwindAngleLimit){ + sail.getTransforms().setAll(new Rotate(heading + 90 - upwindAngleLimit)); + } + } else { + sail.getTransforms().setAll(new Rotate(windDir + 90 - sailWindOffset)); + sail.getPoints().clear(); + sail.getPoints().addAll(0.0, 0.0, 4.0, 1.5, 8.0, 3.0, 12.0, 3.5, 16.0, 3.0, 20.0, 1.5, 24.0, 0.0); + if (normalizedHeading < 270 - sailWindOffset){ + sail.getTransforms().setAll(new Rotate(heading + 180 - downwindAngleLimit)); + } + if (normalizedHeading > 360 - (sailWindOffset + upwindAngleLimit)){ + sail.getTransforms().setAll(new Rotate(heading + 90 + upwindAngleLimit)); + } + } } else { sail.getTransforms().setAll(new Rotate(windDir)); } diff --git a/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java b/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java index 0f353701..48d3fda8 100644 --- a/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java +++ b/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java @@ -25,10 +25,8 @@ public class BoatSailAnimationToggleTest { @Test public void sailToggleTest() throws Exception { - assertFalse(yacht.getClientSailsIn()); assertFalse(yacht.getSailIn()); yacht.toggleClientSail(); - assertTrue(yacht.getClientSailsIn()); assertFalse(yacht.getSailIn()); } From 97696cc95b15cc21cc40b4b51536637ca11f0e94 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Mon, 7 Aug 2017 17:54:34 +1200 Subject: [PATCH 08/13] Started work on cucumber tests. Trying to sort through threads, getting inconsistent results. #story[1111] #pair[kre39,ptg19] --- .../seng302/gameServer/MainServerThread.java | 1 + .../visualiser/ClientToServerThread.java | 2 + .../java/seng302/visualiser/GameClient.java | 5 +- .../controllers/StartScreenController.java | 2 +- src/test/java/RunCucumberTests.java | 12 +++++ src/test/java/features/toggleSail.feature | 5 ++ .../map/BoatSailAnimationToggleTest.java | 2 - src/test/java/steps/ToggleSailSteps.java | 51 +++++++++++++++++++ 8 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 src/test/java/RunCucumberTests.java create mode 100644 src/test/java/features/toggleSail.feature create mode 100644 src/test/java/steps/ToggleSailSteps.java diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 6e827d95..838df5fb 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -26,6 +26,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn private ArrayList serverToClientThreads = new ArrayList<>(); public MainServerThread() { + new GameState("localhost"); try { serverSocket = new ServerSocket(PORT); } catch (IOException e) { diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index 414696c8..838c92b6 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -25,6 +25,8 @@ import seng302.gameServer.server.messages.Message; */ public class ClientToServerThread implements Runnable { + + /** * Functional interface for receiving packets from client socket. */ diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 24cd3aaa..68a3a25a 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -250,9 +250,8 @@ public class GameClient { private void processRaceStatusUpdate(RaceStatusData data) { if (allXMLReceived()) { raceState.updateState(data); - if (raceView != null) { - raceView.getGameView().setWindDir(raceState.getWindDirection()); - } + if (raceView != null) + raceView.getGameView().setWindDir(raceState.getWindDirection()); for (long[] boatData : data.getBoatData()) { Yacht yacht = allBoatsMap.get((int) boatData[0]); yacht.setEstimateTimeTillNextMark(raceState.getRaceTime() - boatData[1]); diff --git a/src/main/java/seng302/visualiser/controllers/StartScreenController.java b/src/main/java/seng302/visualiser/controllers/StartScreenController.java index 87199442..1a9db1a1 100644 --- a/src/main/java/seng302/visualiser/controllers/StartScreenController.java +++ b/src/main/java/seng302/visualiser/controllers/StartScreenController.java @@ -66,7 +66,7 @@ public class StartScreenController implements Initializable { */ @FXML public void hostButtonPressed() { - new GameState(getLocalHostIp()); +// new GameState(getLocalHostIp()); gameClient = new GameClient(holder); gameClient.runAsHost(getLocalHostIp(), 4942); // try { diff --git a/src/test/java/RunCucumberTests.java b/src/test/java/RunCucumberTests.java new file mode 100644 index 00000000..24b2ae54 --- /dev/null +++ b/src/test/java/RunCucumberTests.java @@ -0,0 +1,12 @@ +import cucumber.api.CucumberOptions; +import cucumber.api.junit.Cucumber; +import org.junit.runner.RunWith; + +/** + * Created by kre39 on 7/08/17. + */ + +@RunWith(Cucumber.class) +@CucumberOptions(features = "src/test/java/features") +public class RunCucumberTests { +} diff --git a/src/test/java/features/toggleSail.feature b/src/test/java/features/toggleSail.feature new file mode 100644 index 00000000..a3fb4598 --- /dev/null +++ b/src/test/java/features/toggleSail.feature @@ -0,0 +1,5 @@ +Feature: SailsToggle + Scenario: User toggles in sail + Given The game is running + When the user has pressed "shift" + Then the sails are "in" \ No newline at end of file diff --git a/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java b/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java index 48d3fda8..cccea5c6 100644 --- a/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java +++ b/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java @@ -16,13 +16,11 @@ public class BoatSailAnimationToggleTest { private Yacht yacht; - @Before public void setup() throws Exception{ yacht = new Yacht("Yacht", 1, "YACHT", "YAC", "Test Yacht", "NZ"); } - @Test public void sailToggleTest() throws Exception { assertFalse(yacht.getSailIn()); diff --git a/src/test/java/steps/ToggleSailSteps.java b/src/test/java/steps/ToggleSailSteps.java new file mode 100644 index 00000000..af086bb6 --- /dev/null +++ b/src/test/java/steps/ToggleSailSteps.java @@ -0,0 +1,51 @@ +package steps; + +import cucumber.api.java.en.Given; +import cucumber.api.java.en.Then; +import cucumber.api.java.en.When; +import seng302.gameServer.GameStages; +import seng302.gameServer.GameState; +import seng302.gameServer.MainServerThread; +import seng302.gameServer.server.messages.BoatActionMessage; +import seng302.gameServer.server.messages.BoatActionType; +import seng302.model.Yacht; +import seng302.visualiser.ClientToServerThread; + +/** + * Created by kre39 on 7/08/17. + */ +public class ToggleSailSteps { + + + MainServerThread mst; + ClientToServerThread client; + boolean sailsIn = false; + long startTime; + private Yacht yacht; + + + + @Given("^The game is running$") + public void the_game_is_running() throws Throwable { + mst = new MainServerThread(); + client = new ClientToServerThread("localhost", 4942); + GameState.setCurrentStage(GameStages.RACING); + } + + @When("^the user has pressed \"([^\"]*)\"$") + public void the_user_has_pressed(String arg1) throws Throwable { + startTime = System.currentTimeMillis(); + if (arg1 == "shift") { + if (sailsIn) { + client.sendBoatActionMessage(new BoatActionMessage(BoatActionType.SAILS_OUT)); + } else { + client.sendBoatActionMessage(new BoatActionMessage(BoatActionType.SAILS_IN)); + } + } + } + + @Then("^the sails are \"([^\"]*)\"$") + public void the_sails_are(String arg1) throws Throwable { + System.out.println(GameState.getYachts().values()); + } +} From 941febaf629e432385fee4bb772e2d2b524f38a3 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Tue, 8 Aug 2017 16:31:27 +1200 Subject: [PATCH 09/13] Tried to fix cucumber tests, getting closer. #story[1111] --- src/test/java/steps/ToggleSailSteps.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/java/steps/ToggleSailSteps.java b/src/test/java/steps/ToggleSailSteps.java index af086bb6..43627288 100644 --- a/src/test/java/steps/ToggleSailSteps.java +++ b/src/test/java/steps/ToggleSailSteps.java @@ -3,6 +3,7 @@ package steps; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; +import org.junit.Assert; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; import seng302.gameServer.MainServerThread; @@ -11,6 +12,9 @@ import seng302.gameServer.server.messages.BoatActionType; import seng302.model.Yacht; import seng302.visualiser.ClientToServerThread; +import java.util.ArrayList; +import java.util.Collections; + /** * Created by kre39 on 7/08/17. */ @@ -46,6 +50,7 @@ public class ToggleSailSteps { @Then("^the sails are \"([^\"]*)\"$") public void the_sails_are(String arg1) throws Throwable { - System.out.println(GameState.getYachts().values()); + //Yacht yacht = (new ArrayList<>(GameState.getYachts().values())).get(0); + //Assert.assertTrue(yacht.getSailIn()); } } From 421ef3c65acc166f823b5ff51795071a7d917bca Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Tue, 8 Aug 2017 19:41:51 +1200 Subject: [PATCH 10/13] Started progress on zooming, can now use z and x keys to zoom into map. Nothing scales correctly asides from the map itself (the boats stay in the same position). #story[1121] --- .../java/seng302/visualiser/GameClient.java | 2 + .../java/seng302/visualiser/GameView.java | 66 +++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 68a3a25a..cf4590ca 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -305,9 +305,11 @@ public class GameClient { break; //TODO Allow a zoom in and zoom out methods case Z: // zoom in + raceView.getGameView().zoomIn(); System.out.println("Zoom in"); break; case X: // zoom out + raceView.getGameView().zoomOut(); System.out.println("Zoom out"); break; } diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 4e0e67c1..95e1aed0 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -9,10 +9,14 @@ import java.util.Map; import javafx.animation.AnimationTimer; import javafx.application.Platform; import javafx.collections.ObservableList; +import javafx.event.EventHandler; import javafx.geometry.Point2D; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.image.ImageView; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.ScrollEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; @@ -53,6 +57,8 @@ public class GameView extends Pane { private double referencePointX, referencePointY; private double metersPerPixelX, metersPerPixelY; + final double SCALE_DELTA = 1.1; + private Text fpsDisplay = new Text(); private Polygon raceBorder = new CourseBoundary(); @@ -83,6 +89,24 @@ public class GameView extends Pane { private Yacht playerYacht; private double windDir = 0.0; + double scaleFactor = 1; + + public void zoomOut() { + scaleFactor = 0.95; + for (Node child : getChildren()) { + child.setScaleX(child.getScaleX() * scaleFactor); + child.setScaleY(child.getScaleY() * scaleFactor); + } + } + + public void zoomIn() { + scaleFactor = 1.05; + for (Node child : getChildren()) { + child.setScaleX(child.getScaleX() * scaleFactor); + child.setScaleY(child.getScaleY() * scaleFactor); + } + } + private enum ScaleDirection { HORIZONTAL, VERTICAL @@ -98,6 +122,45 @@ public class GameView extends Pane { gameObjects.add(fpsDisplay); gameObjects.add(raceBorder); gameObjects.add(markers); +// +// this.setOnKeyPressed(new EventHandler() { +// @Override public void handle(KeyEvent event) { +// event.consume(); +// switch (event.getCode()) { +// case Z: +// scaleFactor = scaleFactor * 1.2; +// break; +// case X: +// scaleFactor = scaleFactor * 0.8; +// break; +// } +// if (event.getCode() == KeyCode.Z || event.getCode() == KeyCode.X) { +// for (Node child : getChildren()) { +// child.setScaleX(child.getScaleX() * scaleFactor); +// child.setScaleY(child.getScaleY() * scaleFactor); +// } +// } +// } +// }); +// +// this.setOnScroll(new EventHandler() { +// @Override public void handle(ScrollEvent event) { +// event.consume(); +// if (event.getDeltaY() == 0) { +// return; +// } +// +// double scaleFactor = +// (event.getDeltaY() > 0) +// ? SCALE_DELTA +// : 1/SCALE_DELTA; +// for (Node child : getChildren()) { +// child.setScaleX(child.getScaleX() * scaleFactor); +// child.setScaleY(child.getScaleY() * scaleFactor); +// } +// } +// }); + initializeTimer(); } @@ -347,7 +410,9 @@ public class GameView extends Pane { gameObjects.addAll(wakes); gameObjects.addAll(annotationsGroup); gameObjects.addAll(boatObjectGroup); + }); + } private void createAndBindAnnotationBox (Yacht yacht, Paint colour) { @@ -596,5 +661,6 @@ public class GameView extends Pane { annotationsGroup.getChildren().remove(annotations.get(playerYacht)); gameObjects.add(annotations.get(playerYacht)); }); + } } From 25c2de63a2bb498476f4f0065597413f7614a631 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sun, 13 Aug 2017 14:55:33 +1200 Subject: [PATCH 11/13] Working cucumber tests for sails toggle. When sails in will send a sails out message when sails out will send a sails in message and then checks for the new status of the sail #story[1111] --- src/main/java/seng302/model/Yacht.java | 2 +- src/test/java/steps/ToggleSailSteps.java | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/seng302/model/Yacht.java b/src/main/java/seng302/model/Yacht.java index d0203393..6e49b132 100644 --- a/src/main/java/seng302/model/Yacht.java +++ b/src/main/java/seng302/model/Yacht.java @@ -585,7 +585,7 @@ public class Yacht { this.velocity = velocity; updateVelocityProperty(velocity); for (YachtLocationListener yll : locationListeners) { - yll.notifyLocation(this, lat, lng, heading, velocity); + yll.notifyLocation(this, lat, lng, heading, velocity, clientSailsIn); } } diff --git a/src/test/java/steps/ToggleSailSteps.java b/src/test/java/steps/ToggleSailSteps.java index 43627288..2347c9ce 100644 --- a/src/test/java/steps/ToggleSailSteps.java +++ b/src/test/java/steps/ToggleSailSteps.java @@ -34,8 +34,12 @@ public class ToggleSailSteps { mst = new MainServerThread(); client = new ClientToServerThread("localhost", 4942); GameState.setCurrentStage(GameStages.RACING); + Thread.sleep(200); // Sleep needed to help the threads all be up to speed with each other + Yacht yacht = (new ArrayList<>(GameState.getYachts().values())).get(0); + Assert.assertFalse(yacht.getSailIn()); } + @When("^the user has pressed \"([^\"]*)\"$") public void the_user_has_pressed(String arg1) throws Throwable { startTime = System.currentTimeMillis(); @@ -50,7 +54,12 @@ public class ToggleSailSteps { @Then("^the sails are \"([^\"]*)\"$") public void the_sails_are(String arg1) throws Throwable { - //Yacht yacht = (new ArrayList<>(GameState.getYachts().values())).get(0); - //Assert.assertTrue(yacht.getSailIn()); + Thread.sleep(200); // Sleep needed to help the threads all be up to speed with each other + Yacht yacht = (new ArrayList<>(GameState.getYachts().values())).get(0); + if (arg1 == "in") { + Assert.assertTrue(yacht.getSailIn()); + } else { + Assert.assertFalse(yacht.getSailIn()); + } } } From 9c1fe72f6b6029c199d17673134c28f4611aece4 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Mon, 14 Aug 2017 13:35:18 +1200 Subject: [PATCH 12/13] Merge and tests fix --- src/test/java/steps/ToggleSailSteps.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/test/java/steps/ToggleSailSteps.java b/src/test/java/steps/ToggleSailSteps.java index 2347c9ce..222f4b3d 100644 --- a/src/test/java/steps/ToggleSailSteps.java +++ b/src/test/java/steps/ToggleSailSteps.java @@ -7,13 +7,11 @@ import org.junit.Assert; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; import seng302.gameServer.MainServerThread; -import seng302.gameServer.server.messages.BoatActionMessage; -import seng302.gameServer.server.messages.BoatActionType; +import seng302.gameServer.server.messages.BoatAction; import seng302.model.Yacht; import seng302.visualiser.ClientToServerThread; import java.util.ArrayList; -import java.util.Collections; /** * Created by kre39 on 7/08/17. @@ -44,11 +42,7 @@ public class ToggleSailSteps { public void the_user_has_pressed(String arg1) throws Throwable { startTime = System.currentTimeMillis(); if (arg1 == "shift") { - if (sailsIn) { - client.sendBoatActionMessage(new BoatActionMessage(BoatActionType.SAILS_OUT)); - } else { - client.sendBoatActionMessage(new BoatActionMessage(BoatActionType.SAILS_IN)); - } + client.sendBoatAction(BoatAction.SAILS_IN); } } From 8b543488e33608944ee3d42b4538563a98ba835b Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Mon, 14 Aug 2017 14:15:34 +1200 Subject: [PATCH 13/13] Fixed faulty develop merge and completed manual testing before merging back into develop. tags: #story[1111] --- src/main/java/seng302/visualiser/GameClient.java | 4 +++- src/test/java/steps/ToggleSailSteps.java | 11 ++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 613fb521..028ea1e3 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -312,7 +312,9 @@ public class GameClient { switch (e.getCode()) { //TODO 12/07/17 Determine the sail state and send the appropriate packet (eg. if sails are in, send a sail out packet) case SHIFT: // sails in/sails out - socketThread.sendBoatAction(BoatAction.SAILS_IN); break; + socketThread.sendBoatAction(BoatAction.SAILS_IN); + raceView.getGameView().getPlayerYacht().toggleClientSail(); + break; case PAGE_UP: case PAGE_DOWN: socketThread.sendBoatAction(BoatAction.MAINTAIN_HEADING); break; diff --git a/src/test/java/steps/ToggleSailSteps.java b/src/test/java/steps/ToggleSailSteps.java index 2347c9ce..4e3a849f 100644 --- a/src/test/java/steps/ToggleSailSteps.java +++ b/src/test/java/steps/ToggleSailSteps.java @@ -3,18 +3,15 @@ package steps; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; +import java.util.ArrayList; import org.junit.Assert; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; import seng302.gameServer.MainServerThread; -import seng302.gameServer.server.messages.BoatActionMessage; -import seng302.gameServer.server.messages.BoatActionType; +import seng302.gameServer.server.messages.BoatAction; import seng302.model.Yacht; import seng302.visualiser.ClientToServerThread; -import java.util.ArrayList; -import java.util.Collections; - /** * Created by kre39 on 7/08/17. */ @@ -45,9 +42,9 @@ public class ToggleSailSteps { startTime = System.currentTimeMillis(); if (arg1 == "shift") { if (sailsIn) { - client.sendBoatActionMessage(new BoatActionMessage(BoatActionType.SAILS_OUT)); + client.sendBoatAction(BoatAction.SAILS_OUT); } else { - client.sendBoatActionMessage(new BoatActionMessage(BoatActionType.SAILS_IN)); + client.sendBoatAction(BoatAction.SAILS_IN); } } }