From ac47e9d88a16333efc002cfc6201e7c8ad5af81a Mon Sep 17 00:00:00 2001 From: Calum Date: Wed, 16 Aug 2017 03:51:48 +1200 Subject: [PATCH] Game state now updates based on boat position. Arrows drawn as boat travels course. Currently do not point in correct direction, also the sparkline does not work. #bug #refactor #implement #story[1118] --- .../java/seng302/gameServer/GameState.java | 18 +-- .../seng302/gameServer/HeartbeatThread.java | 4 +- .../seng302/gameServer/MainServerThread.java | 2 +- .../gameServer/ServerPacketParser.java | 6 +- .../gameServer/ServerToClientThread.java | 26 +-- .../{server => }/messages/BoatAction.java | 2 +- .../messages/BoatActionMessage.java | 2 +- .../messages/BoatLocationMessage.java | 2 +- .../{server => }/messages/BoatStatus.java | 2 +- .../{server => }/messages/BoatSubMessage.java | 2 +- .../{server => }/messages/ChatterMessage.java | 2 +- .../{server => }/messages/ClientType.java | 2 +- .../{server => }/messages/DeviceType.java | 2 +- .../{server => }/messages/Header.java | 2 +- .../{server => }/messages/Heartbeat.java | 2 +- .../messages/MarkRoundingMessage.java | 4 +- .../{server => }/messages/MarkType.java | 2 +- .../{server => }/messages/Message.java | 2 +- .../{server => }/messages/MessageType.java | 2 +- .../messages/RaceStartNotificationType.java | 2 +- .../messages/RaceStartStatusMessage.java | 2 +- .../{server => }/messages/RaceStatus.java | 2 +- .../messages/RaceStatusMessage.java | 2 +- .../{server => }/messages/RaceType.java | 2 +- .../messages/RegistrationRequestMessage.java | 2 +- .../messages/RegistrationResponseMessage.java | 2 +- .../messages/RegistrationResponseStatus.java | 2 +- .../messages/RoundingBoatStatus.java | 2 +- .../{server => }/messages/RoundingSide.java | 2 +- .../{server => }/messages/XMLMessage.java | 2 +- .../messages/XMLMessageSubType.java | 2 +- .../messages/YachtEventCodeMessage.java | 2 +- src/main/java/seng302/model/ClientYacht.java | 48 ++++-- src/main/java/seng302/model/RaceState.java | 36 ++++- src/main/java/seng302/model/ServerYacht.java | 2 +- .../java/seng302/model/mark/CompoundMark.java | 2 +- src/main/java/seng302/model/mark/Mark.java | 2 +- .../java/seng302/model/mark/MarkOrder.java | 2 +- .../java/seng302/utilities/StreamParser.java | 4 +- .../java/seng302/utilities/XMLGenerator.java | 2 +- .../visualiser/ClientToServerThread.java | 12 +- .../java/seng302/visualiser/GameClient.java | 100 ++++++------ .../java/seng302/visualiser/GameView.java | 113 ++++++++----- .../FinishScreenViewController.java | 2 +- .../controllers/RaceViewController.java | 152 ++++++++---------- .../visualiser/fxObjects/BoatObject.java | 4 +- .../seng302/visualiser/fxObjects/Marker.java | 22 ++- .../gameServer/server/TestConversions.java | 2 +- .../seng302/gameServer/server/TestHeader.java | 4 +- .../gameServer/server/TestMessage.java | 6 +- src/test/java/steps/ToggleSailSteps.java | 2 +- 51 files changed, 358 insertions(+), 271 deletions(-) rename src/main/java/seng302/gameServer/{server => }/messages/BoatAction.java (94%) rename src/main/java/seng302/gameServer/{server => }/messages/BoatActionMessage.java (94%) rename src/main/java/seng302/gameServer/{server => }/messages/BoatLocationMessage.java (99%) rename src/main/java/seng302/gameServer/{server => }/messages/BoatStatus.java (87%) rename src/main/java/seng302/gameServer/{server => }/messages/BoatSubMessage.java (98%) rename src/main/java/seng302/gameServer/{server => }/messages/ChatterMessage.java (95%) rename src/main/java/seng302/gameServer/{server => }/messages/ClientType.java (93%) rename src/main/java/seng302/gameServer/{server => }/messages/DeviceType.java (82%) rename src/main/java/seng302/gameServer/{server => }/messages/Header.java (98%) rename src/main/java/seng302/gameServer/{server => }/messages/Heartbeat.java (92%) rename src/main/java/seng302/gameServer/{server => }/messages/MarkRoundingMessage.java (95%) rename src/main/java/seng302/gameServer/{server => }/messages/MarkType.java (85%) rename src/main/java/seng302/gameServer/{server => }/messages/Message.java (99%) rename src/main/java/seng302/gameServer/{server => }/messages/MessageType.java (94%) rename src/main/java/seng302/gameServer/{server => }/messages/RaceStartNotificationType.java (88%) rename src/main/java/seng302/gameServer/{server => }/messages/RaceStartStatusMessage.java (97%) rename src/main/java/seng302/gameServer/{server => }/messages/RaceStatus.java (91%) rename src/main/java/seng302/gameServer/{server => }/messages/RaceStatusMessage.java (98%) rename src/main/java/seng302/gameServer/{server => }/messages/RaceType.java (85%) rename src/main/java/seng302/gameServer/{server => }/messages/RegistrationRequestMessage.java (91%) rename src/main/java/seng302/gameServer/{server => }/messages/RegistrationResponseMessage.java (91%) rename src/main/java/seng302/gameServer/{server => }/messages/RegistrationResponseStatus.java (95%) rename src/main/java/seng302/gameServer/{server => }/messages/RoundingBoatStatus.java (86%) rename src/main/java/seng302/gameServer/{server => }/messages/RoundingSide.java (96%) rename src/main/java/seng302/gameServer/{server => }/messages/XMLMessage.java (97%) rename src/main/java/seng302/gameServer/{server => }/messages/XMLMessageSubType.java (86%) rename src/main/java/seng302/gameServer/{server => }/messages/YachtEventCodeMessage.java (96%) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index fc29f446..43b3101e 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -8,13 +8,13 @@ import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import seng302.gameServer.server.messages.BoatAction; -import seng302.gameServer.server.messages.BoatStatus; -import seng302.gameServer.server.messages.MarkRoundingMessage; -import seng302.gameServer.server.messages.MarkType; -import seng302.gameServer.server.messages.Message; -import seng302.gameServer.server.messages.RoundingBoatStatus; -import seng302.gameServer.server.messages.YachtEventCodeMessage; +import seng302.gameServer.messages.BoatAction; +import seng302.gameServer.messages.BoatStatus; +import seng302.gameServer.messages.MarkRoundingMessage; +import seng302.gameServer.messages.MarkType; +import seng302.gameServer.messages.Message; +import seng302.gameServer.messages.RoundingBoatStatus; +import seng302.gameServer.messages.YachtEventCodeMessage; import seng302.model.GeoPoint; import seng302.model.Player; import seng302.model.PolarTable; @@ -283,7 +283,7 @@ public class GameState implements Runnable { Double velocity = yacht.getCurrentVelocity(); Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); - Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots); + Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * 3; // TODO: 15/08/17 remove magic numbers from these equations. if (yacht.getSailIn()) { if (velocity < maxBoatSpeed - 500) { @@ -556,7 +556,7 @@ public class GameState implements Runnable { // TODO: 13/8/17 figure out the rounding side, rounded mark source ID and boat status. Message markRoundingMessage = new MarkRoundingMessage(0, 0, sourceID, RoundingBoatStatus.RACING, roundingMark.getRoundingSide(), markType, - roundingMark.getSourceID()); + currentMarkSeqID + 1); notifyMessageListeners(markRoundingMessage); } diff --git a/src/main/java/seng302/gameServer/HeartbeatThread.java b/src/main/java/seng302/gameServer/HeartbeatThread.java index b168a197..8b9cd288 100644 --- a/src/main/java/seng302/gameServer/HeartbeatThread.java +++ b/src/main/java/seng302/gameServer/HeartbeatThread.java @@ -5,8 +5,8 @@ import java.util.Stack; import java.util.Timer; import java.util.TimerTask; import seng302.model.Player; -import seng302.gameServer.server.messages.Heartbeat; -import seng302.gameServer.server.messages.Message; +import seng302.gameServer.messages.Heartbeat; +import seng302.gameServer.messages.Message; /** * Send Heartbeat messages to connected player at a specified interval diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 691ccda3..f6c64c46 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -6,7 +6,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; -import seng302.gameServer.server.messages.Message; +import seng302.gameServer.messages.Message; import seng302.model.GeoPoint; import seng302.model.Player; import seng302.model.PolarTable; diff --git a/src/main/java/seng302/gameServer/ServerPacketParser.java b/src/main/java/seng302/gameServer/ServerPacketParser.java index 84f8fd17..21d1497f 100644 --- a/src/main/java/seng302/gameServer/ServerPacketParser.java +++ b/src/main/java/seng302/gameServer/ServerPacketParser.java @@ -2,10 +2,10 @@ package seng302.gameServer; import java.util.Arrays; -import seng302.gameServer.server.messages.ClientType; -import seng302.gameServer.server.messages.Message; +import seng302.gameServer.messages.ClientType; +import seng302.gameServer.messages.Message; import seng302.model.stream.packets.StreamPacket; -import seng302.gameServer.server.messages.BoatAction; +import seng302.gameServer.messages.BoatAction; public class ServerPacketParser { diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index bbe7053c..7c9c2adb 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -19,25 +19,25 @@ import java.util.zip.CRC32; import java.util.zip.Checksum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import seng302.gameServer.server.messages.YachtEventCodeMessage; +import seng302.gameServer.messages.YachtEventCodeMessage; import seng302.model.Player; import seng302.model.stream.packets.PacketType; import seng302.model.stream.packets.StreamPacket; import seng302.model.stream.xml.generator.Race; import seng302.model.stream.xml.generator.Regatta; import seng302.utilities.XMLGenerator; -import seng302.gameServer.server.messages.BoatAction; -import seng302.gameServer.server.messages.BoatLocationMessage; -import seng302.gameServer.server.messages.BoatSubMessage; -import seng302.gameServer.server.messages.ClientType; -import seng302.gameServer.server.messages.Message; -import seng302.gameServer.server.messages.RaceStatus; -import seng302.gameServer.server.messages.RaceStatusMessage; -import seng302.gameServer.server.messages.RaceType; -import seng302.gameServer.server.messages.RegistrationResponseMessage; -import seng302.gameServer.server.messages.RegistrationResponseStatus; -import seng302.gameServer.server.messages.XMLMessage; -import seng302.gameServer.server.messages.XMLMessageSubType; +import seng302.gameServer.messages.BoatAction; +import seng302.gameServer.messages.BoatLocationMessage; +import seng302.gameServer.messages.BoatSubMessage; +import seng302.gameServer.messages.ClientType; +import seng302.gameServer.messages.Message; +import seng302.gameServer.messages.RaceStatus; +import seng302.gameServer.messages.RaceStatusMessage; +import seng302.gameServer.messages.RaceType; +import seng302.gameServer.messages.RegistrationResponseMessage; +import seng302.gameServer.messages.RegistrationResponseStatus; +import seng302.gameServer.messages.XMLMessage; +import seng302.gameServer.messages.XMLMessageSubType; import seng302.model.ServerYacht; /** diff --git a/src/main/java/seng302/gameServer/server/messages/BoatAction.java b/src/main/java/seng302/gameServer/messages/BoatAction.java similarity index 94% rename from src/main/java/seng302/gameServer/server/messages/BoatAction.java rename to src/main/java/seng302/gameServer/messages/BoatAction.java index cc53668c..9003958a 100644 --- a/src/main/java/seng302/gameServer/server/messages/BoatAction.java +++ b/src/main/java/seng302/gameServer/messages/BoatAction.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/seng302/gameServer/server/messages/BoatActionMessage.java b/src/main/java/seng302/gameServer/messages/BoatActionMessage.java similarity index 94% rename from src/main/java/seng302/gameServer/server/messages/BoatActionMessage.java rename to src/main/java/seng302/gameServer/messages/BoatActionMessage.java index 2fc084e5..419bf72e 100644 --- a/src/main/java/seng302/gameServer/server/messages/BoatActionMessage.java +++ b/src/main/java/seng302/gameServer/messages/BoatActionMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * Created by kre39 on 12/07/17. diff --git a/src/main/java/seng302/gameServer/server/messages/BoatLocationMessage.java b/src/main/java/seng302/gameServer/messages/BoatLocationMessage.java similarity index 99% rename from src/main/java/seng302/gameServer/server/messages/BoatLocationMessage.java rename to src/main/java/seng302/gameServer/messages/BoatLocationMessage.java index 72548c12..faf344ff 100644 --- a/src/main/java/seng302/gameServer/server/messages/BoatLocationMessage.java +++ b/src/main/java/seng302/gameServer/messages/BoatLocationMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public class BoatLocationMessage extends Message { diff --git a/src/main/java/seng302/gameServer/server/messages/BoatStatus.java b/src/main/java/seng302/gameServer/messages/BoatStatus.java similarity index 87% rename from src/main/java/seng302/gameServer/server/messages/BoatStatus.java rename to src/main/java/seng302/gameServer/messages/BoatStatus.java index 2f09dd4f..7837994b 100644 --- a/src/main/java/seng302/gameServer/server/messages/BoatStatus.java +++ b/src/main/java/seng302/gameServer/messages/BoatStatus.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * The current status of a boat diff --git a/src/main/java/seng302/gameServer/server/messages/BoatSubMessage.java b/src/main/java/seng302/gameServer/messages/BoatSubMessage.java similarity index 98% rename from src/main/java/seng302/gameServer/server/messages/BoatSubMessage.java rename to src/main/java/seng302/gameServer/messages/BoatSubMessage.java index d0d57888..f6b78422 100644 --- a/src/main/java/seng302/gameServer/server/messages/BoatSubMessage.java +++ b/src/main/java/seng302/gameServer/messages/BoatSubMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; import java.nio.ByteBuffer; diff --git a/src/main/java/seng302/gameServer/server/messages/ChatterMessage.java b/src/main/java/seng302/gameServer/messages/ChatterMessage.java similarity index 95% rename from src/main/java/seng302/gameServer/server/messages/ChatterMessage.java rename to src/main/java/seng302/gameServer/messages/ChatterMessage.java index 1295b725..f312109f 100644 --- a/src/main/java/seng302/gameServer/server/messages/ChatterMessage.java +++ b/src/main/java/seng302/gameServer/messages/ChatterMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * Created by kre39 on 20/07/17. diff --git a/src/main/java/seng302/gameServer/server/messages/ClientType.java b/src/main/java/seng302/gameServer/messages/ClientType.java similarity index 93% rename from src/main/java/seng302/gameServer/server/messages/ClientType.java rename to src/main/java/seng302/gameServer/messages/ClientType.java index b96ca5c7..13be441e 100644 --- a/src/main/java/seng302/gameServer/server/messages/ClientType.java +++ b/src/main/java/seng302/gameServer/messages/ClientType.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public enum ClientType { SPECTATOR(0x00), diff --git a/src/main/java/seng302/gameServer/server/messages/DeviceType.java b/src/main/java/seng302/gameServer/messages/DeviceType.java similarity index 82% rename from src/main/java/seng302/gameServer/server/messages/DeviceType.java rename to src/main/java/seng302/gameServer/messages/DeviceType.java index 4f6d7b80..54925b6d 100644 --- a/src/main/java/seng302/gameServer/server/messages/DeviceType.java +++ b/src/main/java/seng302/gameServer/messages/DeviceType.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public enum DeviceType { UNKNOWN(0), diff --git a/src/main/java/seng302/gameServer/server/messages/Header.java b/src/main/java/seng302/gameServer/messages/Header.java similarity index 98% rename from src/main/java/seng302/gameServer/server/messages/Header.java rename to src/main/java/seng302/gameServer/messages/Header.java index 074a8ab0..1e388b0d 100644 --- a/src/main/java/seng302/gameServer/server/messages/Header.java +++ b/src/main/java/seng302/gameServer/messages/Header.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; import java.nio.ByteBuffer; diff --git a/src/main/java/seng302/gameServer/server/messages/Heartbeat.java b/src/main/java/seng302/gameServer/messages/Heartbeat.java similarity index 92% rename from src/main/java/seng302/gameServer/server/messages/Heartbeat.java rename to src/main/java/seng302/gameServer/messages/Heartbeat.java index 688aaf40..0a81ceec 100644 --- a/src/main/java/seng302/gameServer/server/messages/Heartbeat.java +++ b/src/main/java/seng302/gameServer/messages/Heartbeat.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public class Heartbeat extends Message { private final int MESSAGE_SIZE = 4; diff --git a/src/main/java/seng302/gameServer/server/messages/MarkRoundingMessage.java b/src/main/java/seng302/gameServer/messages/MarkRoundingMessage.java similarity index 95% rename from src/main/java/seng302/gameServer/server/messages/MarkRoundingMessage.java rename to src/main/java/seng302/gameServer/messages/MarkRoundingMessage.java index f0d68e15..c32a6927 100644 --- a/src/main/java/seng302/gameServer/server/messages/MarkRoundingMessage.java +++ b/src/main/java/seng302/gameServer/messages/MarkRoundingMessage.java @@ -1,6 +1,4 @@ -package seng302.gameServer.server.messages; - -import seng302.gameServer.GameState; +package seng302.gameServer.messages; public class MarkRoundingMessage extends Message{ private final long MESSAGE_VERSION_NUMBER = 1; diff --git a/src/main/java/seng302/gameServer/server/messages/MarkType.java b/src/main/java/seng302/gameServer/messages/MarkType.java similarity index 85% rename from src/main/java/seng302/gameServer/server/messages/MarkType.java rename to src/main/java/seng302/gameServer/messages/MarkType.java index 6e6ae116..e67a9509 100644 --- a/src/main/java/seng302/gameServer/server/messages/MarkType.java +++ b/src/main/java/seng302/gameServer/messages/MarkType.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * Types of marks boats can round diff --git a/src/main/java/seng302/gameServer/server/messages/Message.java b/src/main/java/seng302/gameServer/messages/Message.java similarity index 99% rename from src/main/java/seng302/gameServer/server/messages/Message.java rename to src/main/java/seng302/gameServer/messages/Message.java index cabba2b3..691bb022 100644 --- a/src/main/java/seng302/gameServer/server/messages/Message.java +++ b/src/main/java/seng302/gameServer/messages/Message.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; import java.nio.ByteBuffer; import java.nio.ByteOrder; diff --git a/src/main/java/seng302/gameServer/server/messages/MessageType.java b/src/main/java/seng302/gameServer/messages/MessageType.java similarity index 94% rename from src/main/java/seng302/gameServer/server/messages/MessageType.java rename to src/main/java/seng302/gameServer/messages/MessageType.java index 4552d781..ea8d8171 100644 --- a/src/main/java/seng302/gameServer/server/messages/MessageType.java +++ b/src/main/java/seng302/gameServer/messages/MessageType.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * Enum containing the types of messages diff --git a/src/main/java/seng302/gameServer/server/messages/RaceStartNotificationType.java b/src/main/java/seng302/gameServer/messages/RaceStartNotificationType.java similarity index 88% rename from src/main/java/seng302/gameServer/server/messages/RaceStartNotificationType.java rename to src/main/java/seng302/gameServer/messages/RaceStartNotificationType.java index 7f9543ff..4824e349 100644 --- a/src/main/java/seng302/gameServer/server/messages/RaceStartNotificationType.java +++ b/src/main/java/seng302/gameServer/messages/RaceStartNotificationType.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * The types of race start status messages diff --git a/src/main/java/seng302/gameServer/server/messages/RaceStartStatusMessage.java b/src/main/java/seng302/gameServer/messages/RaceStartStatusMessage.java similarity index 97% rename from src/main/java/seng302/gameServer/server/messages/RaceStartStatusMessage.java rename to src/main/java/seng302/gameServer/messages/RaceStartStatusMessage.java index ddb960c0..9de0a7b2 100644 --- a/src/main/java/seng302/gameServer/server/messages/RaceStartStatusMessage.java +++ b/src/main/java/seng302/gameServer/messages/RaceStartStatusMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public class RaceStartStatusMessage extends Message { private final int MESSAGE_SIZE = 20; diff --git a/src/main/java/seng302/gameServer/server/messages/RaceStatus.java b/src/main/java/seng302/gameServer/messages/RaceStatus.java similarity index 91% rename from src/main/java/seng302/gameServer/server/messages/RaceStatus.java rename to src/main/java/seng302/gameServer/messages/RaceStatus.java index 6880ab06..82adfb5b 100644 --- a/src/main/java/seng302/gameServer/server/messages/RaceStatus.java +++ b/src/main/java/seng302/gameServer/messages/RaceStatus.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * The current status of the race diff --git a/src/main/java/seng302/gameServer/server/messages/RaceStatusMessage.java b/src/main/java/seng302/gameServer/messages/RaceStatusMessage.java similarity index 98% rename from src/main/java/seng302/gameServer/server/messages/RaceStatusMessage.java rename to src/main/java/seng302/gameServer/messages/RaceStatusMessage.java index 5cddf0bf..f1ede439 100644 --- a/src/main/java/seng302/gameServer/server/messages/RaceStatusMessage.java +++ b/src/main/java/seng302/gameServer/messages/RaceStatusMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; import java.util.List; import java.util.zip.CRC32; diff --git a/src/main/java/seng302/gameServer/server/messages/RaceType.java b/src/main/java/seng302/gameServer/messages/RaceType.java similarity index 85% rename from src/main/java/seng302/gameServer/server/messages/RaceType.java rename to src/main/java/seng302/gameServer/messages/RaceType.java index 5d601083..52e0d628 100644 --- a/src/main/java/seng302/gameServer/server/messages/RaceType.java +++ b/src/main/java/seng302/gameServer/messages/RaceType.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * Enum containing the types of races diff --git a/src/main/java/seng302/gameServer/server/messages/RegistrationRequestMessage.java b/src/main/java/seng302/gameServer/messages/RegistrationRequestMessage.java similarity index 91% rename from src/main/java/seng302/gameServer/server/messages/RegistrationRequestMessage.java rename to src/main/java/seng302/gameServer/messages/RegistrationRequestMessage.java index 59757a18..c7b2a1db 100644 --- a/src/main/java/seng302/gameServer/server/messages/RegistrationRequestMessage.java +++ b/src/main/java/seng302/gameServer/messages/RegistrationRequestMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public class RegistrationRequestMessage extends Message { diff --git a/src/main/java/seng302/gameServer/server/messages/RegistrationResponseMessage.java b/src/main/java/seng302/gameServer/messages/RegistrationResponseMessage.java similarity index 91% rename from src/main/java/seng302/gameServer/server/messages/RegistrationResponseMessage.java rename to src/main/java/seng302/gameServer/messages/RegistrationResponseMessage.java index e2174da4..28700210 100644 --- a/src/main/java/seng302/gameServer/server/messages/RegistrationResponseMessage.java +++ b/src/main/java/seng302/gameServer/messages/RegistrationResponseMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public class RegistrationResponseMessage extends Message{ diff --git a/src/main/java/seng302/gameServer/server/messages/RegistrationResponseStatus.java b/src/main/java/seng302/gameServer/messages/RegistrationResponseStatus.java similarity index 95% rename from src/main/java/seng302/gameServer/server/messages/RegistrationResponseStatus.java rename to src/main/java/seng302/gameServer/messages/RegistrationResponseStatus.java index 2ae47a92..90e579bf 100644 --- a/src/main/java/seng302/gameServer/server/messages/RegistrationResponseStatus.java +++ b/src/main/java/seng302/gameServer/messages/RegistrationResponseStatus.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public enum RegistrationResponseStatus { SUCCESS_SPECTATING(0x00), diff --git a/src/main/java/seng302/gameServer/server/messages/RoundingBoatStatus.java b/src/main/java/seng302/gameServer/messages/RoundingBoatStatus.java similarity index 86% rename from src/main/java/seng302/gameServer/server/messages/RoundingBoatStatus.java rename to src/main/java/seng302/gameServer/messages/RoundingBoatStatus.java index 3b0a6d09..324c03e3 100644 --- a/src/main/java/seng302/gameServer/server/messages/RoundingBoatStatus.java +++ b/src/main/java/seng302/gameServer/messages/RoundingBoatStatus.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * The status of a boat rounding a mark diff --git a/src/main/java/seng302/gameServer/server/messages/RoundingSide.java b/src/main/java/seng302/gameServer/messages/RoundingSide.java similarity index 96% rename from src/main/java/seng302/gameServer/server/messages/RoundingSide.java rename to src/main/java/seng302/gameServer/messages/RoundingSide.java index efb4c929..ffcc7f6c 100644 --- a/src/main/java/seng302/gameServer/server/messages/RoundingSide.java +++ b/src/main/java/seng302/gameServer/messages/RoundingSide.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * The side the boat rounded the mark diff --git a/src/main/java/seng302/gameServer/server/messages/XMLMessage.java b/src/main/java/seng302/gameServer/messages/XMLMessage.java similarity index 97% rename from src/main/java/seng302/gameServer/server/messages/XMLMessage.java rename to src/main/java/seng302/gameServer/messages/XMLMessage.java index 6bcd42ca..361bac0e 100644 --- a/src/main/java/seng302/gameServer/server/messages/XMLMessage.java +++ b/src/main/java/seng302/gameServer/messages/XMLMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; public class XMLMessage extends Message{ private final MessageType MESSAGE_TYPE = MessageType.XML_MESSAGE; diff --git a/src/main/java/seng302/gameServer/server/messages/XMLMessageSubType.java b/src/main/java/seng302/gameServer/messages/XMLMessageSubType.java similarity index 86% rename from src/main/java/seng302/gameServer/server/messages/XMLMessageSubType.java rename to src/main/java/seng302/gameServer/messages/XMLMessageSubType.java index 3b4bdc91..64757c5d 100644 --- a/src/main/java/seng302/gameServer/server/messages/XMLMessageSubType.java +++ b/src/main/java/seng302/gameServer/messages/XMLMessageSubType.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * Enum containing the types of XML messages diff --git a/src/main/java/seng302/gameServer/server/messages/YachtEventCodeMessage.java b/src/main/java/seng302/gameServer/messages/YachtEventCodeMessage.java similarity index 96% rename from src/main/java/seng302/gameServer/server/messages/YachtEventCodeMessage.java rename to src/main/java/seng302/gameServer/messages/YachtEventCodeMessage.java index 08db575a..eb9f557e 100644 --- a/src/main/java/seng302/gameServer/server/messages/YachtEventCodeMessage.java +++ b/src/main/java/seng302/gameServer/messages/YachtEventCodeMessage.java @@ -1,4 +1,4 @@ -package seng302.gameServer.server.messages; +package seng302.gameServer.messages; /** * Created by zyt10 on 10/08/17. diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index 564754b0..a2b62bde 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -8,6 +8,8 @@ import java.util.Observable; import java.util.Observer; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.beans.property.ReadOnlyDoubleWrapper; +import javafx.beans.property.ReadOnlyIntegerProperty; +import javafx.beans.property.ReadOnlyIntegerWrapper; import javafx.beans.property.ReadOnlyLongProperty; import javafx.beans.property.ReadOnlyLongWrapper; import javafx.scene.paint.Color; @@ -28,6 +30,11 @@ public class ClientYacht extends Observable { Boolean sailsIn, double velocity); } + @FunctionalInterface + public interface MarkRoundingListener { + void notifyRounding(ClientYacht yacht, CompoundMark markPassed, int legNumber); + } + private Logger logger = LoggerFactory.getLogger(ClientYacht.class); @@ -52,11 +59,12 @@ public class ClientYacht extends Observable { //CLIENT SIDE private List locationListeners = new ArrayList<>(); + private List markRoundingListeners = new ArrayList<>(); private ReadOnlyDoubleWrapper velocityProperty = new ReadOnlyDoubleWrapper(); private ReadOnlyLongWrapper timeTillNextProperty = new ReadOnlyLongWrapper(); private ReadOnlyLongWrapper timeSinceLastMarkProperty = new ReadOnlyLongWrapper(); + private ReadOnlyIntegerWrapper placingProperty = new ReadOnlyIntegerWrapper(); private CompoundMark lastMarkRounded; - private Integer positionInt = 0; private Color colour; public ClientYacht(String boatType, Integer sourceId, String hullID, String shortName, @@ -145,12 +153,16 @@ public class ClientYacht extends Observable { this.estimateTimeAtFinish = estimateTimeAtFinish; } - public Integer getPositionInteger() { - return positionInt; + public Integer getPlacing() { + return placingProperty.get(); } - public void setPositionInteger(Integer position) { - this.positionInt = position; + public void setPlacing(Integer position) { + placingProperty.set(position); + } + + public ReadOnlyIntegerProperty placingProperty() { + return placingProperty.getReadOnlyProperty(); } public void updateVelocityProperty(double velocity) { @@ -239,14 +251,6 @@ public class ClientYacht extends Observable { this.colour = colour; } -// public Double getCurrentVelocity() { -// return currentVelocity; -// } -// -// public void setCurrentVelocity(Double currentVelocity) { -// this.currentVelocity = currentVelocity; -// } - public void updateLocation(double lat, double lng, double heading, double velocity) { setLocation(lat, lng); @@ -262,7 +266,25 @@ public class ClientYacht extends Observable { locationListeners.add(listener); } + public void addMarkRoundingListener(MarkRoundingListener listener) { + markRoundingListeners.add(listener); + } + + public void removeMarkRoundingListener(MarkRoundingListener listener) { + markRoundingListeners.remove(listener); + } + public boolean getSailIn () { return sailIn; } + + public void roundMark(CompoundMark mark, long markRoundTime, long timeSinceLastMark) { + this.markRoundTime = markRoundTime; + timeSinceLastMarkProperty.set(timeSinceLastMark); + lastMarkRounded = mark; + legNumber += 1; + for (MarkRoundingListener listener : markRoundingListeners) { + listener.notifyRounding(this, lastMarkRounded, legNumber); + } + } } diff --git a/src/main/java/seng302/model/RaceState.java b/src/main/java/seng302/model/RaceState.java index e426dc09..b495b345 100644 --- a/src/main/java/seng302/model/RaceState.java +++ b/src/main/java/seng302/model/RaceState.java @@ -2,7 +2,11 @@ package seng302.model; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; import java.util.TimeZone; +import javafx.beans.property.ReadOnlyDoubleProperty; +import javafx.beans.property.ReadOnlyDoubleWrapper; import seng302.model.stream.parser.RaceStartData; import seng302.model.stream.parser.RaceStatusData; @@ -12,22 +16,27 @@ import seng302.model.stream.parser.RaceStatusData; */ public class RaceState { + @FunctionalInterface + public interface CollisionListener { + void notifyCollision(GeoPoint location); + } + // private final DateFormat DATE_TIME_FORMAT = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); private final DateFormat DATE_TIME_FORMAT = new SimpleDateFormat("HH:mm:ss"); - private double windSpeed; - private double windDirection; + private ReadOnlyDoubleWrapper windDirection = new ReadOnlyDoubleWrapper(); private long raceTime; private long expectedStartTime; private boolean isRaceStarted = false; -// long timeTillStart; + private List collisions = new ArrayList<>(); + private List collisionListeners = new ArrayList<>(); public RaceState() { } public void updateState (RaceStatusData data) { this.windSpeed = data.getWindSpeed(); - this.windDirection = data.getWindDirection(); + this.windDirection.set(data.getWindDirection()); this.raceTime = data.getCurrentTime(); this.expectedStartTime = data.getExpectedStartTime(); this.isRaceStarted = data.isRaceStarted(); @@ -54,8 +63,8 @@ public class RaceState { return windSpeed; } - public double getWindDirection() { - return windDirection; + public ReadOnlyDoubleProperty windDirectionProperty() { + return windDirection.getReadOnlyProperty(); } public long getRaceTime() { @@ -69,4 +78,19 @@ public class RaceState { public boolean isRaceStarted () { return isRaceStarted; } + + public void storeCollision(ClientYacht yacht) { + collisions.add(yacht); + for (CollisionListener collisionListener : collisionListeners) { + collisionListener.notifyCollision(yacht.getLocation()); + } + } + + public void addCollisionListener(CollisionListener collisionListener) { + collisionListeners.add(collisionListener); + } + + public void removeCollisionListener(CollisionListener collisionListener) { + collisionListeners.remove(collisionListener); + } } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 2a8a8935..f46e8753 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -6,7 +6,7 @@ import java.util.Observer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import seng302.gameServer.GameState; -import seng302.gameServer.server.messages.BoatStatus; +import seng302.gameServer.messages.BoatStatus; import seng302.model.mark.Mark; import seng302.utilities.GeoUtility; diff --git a/src/main/java/seng302/model/mark/CompoundMark.java b/src/main/java/seng302/model/mark/CompoundMark.java index 70cd114f..13dfa50e 100644 --- a/src/main/java/seng302/model/mark/CompoundMark.java +++ b/src/main/java/seng302/model/mark/CompoundMark.java @@ -2,7 +2,7 @@ package seng302.model.mark; import java.util.ArrayList; import java.util.List; -import seng302.gameServer.server.messages.RoundingSide; +import seng302.gameServer.messages.RoundingSide; import seng302.model.GeoPoint; import seng302.utilities.GeoUtility; diff --git a/src/main/java/seng302/model/mark/Mark.java b/src/main/java/seng302/model/mark/Mark.java index de66166c..b5b65e7e 100644 --- a/src/main/java/seng302/model/mark/Mark.java +++ b/src/main/java/seng302/model/mark/Mark.java @@ -2,7 +2,7 @@ package seng302.model.mark; import java.util.ArrayList; import java.util.List; -import seng302.gameServer.server.messages.RoundingSide; +import seng302.gameServer.messages.RoundingSide; import seng302.model.GeoPoint; /** diff --git a/src/main/java/seng302/model/mark/MarkOrder.java b/src/main/java/seng302/model/mark/MarkOrder.java index aa75b494..c093e967 100644 --- a/src/main/java/seng302/model/mark/MarkOrder.java +++ b/src/main/java/seng302/model/mark/MarkOrder.java @@ -10,7 +10,7 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import seng302.gameServer.server.messages.RoundingSide; +import seng302.gameServer.messages.RoundingSide; import seng302.model.stream.xml.generator.Race; import seng302.model.stream.xml.parser.RaceXMLData; import seng302.utilities.XMLGenerator; diff --git a/src/main/java/seng302/utilities/StreamParser.java b/src/main/java/seng302/utilities/StreamParser.java index 304b105d..09055dc4 100644 --- a/src/main/java/seng302/utilities/StreamParser.java +++ b/src/main/java/seng302/utilities/StreamParser.java @@ -119,12 +119,12 @@ public class StreamParser { // placing += 1; // } // } -// updatingBoat.setPosition(placing.toString()); +// updatingBoat.setPlacing(placing.toString()); // updatingBoat.setLegNumber(leg); // boatsPos.putIfAbsent(placing, updatingBoat); // boatsPos.replace(placing, updatingBoat); // } else if(updatingBoat.getLegNumber() == null){ -// updatingBoat.setPosition("1"); +// updatingBoat.setPlacing("1"); // updatingBoat.setLegNumber(leg); // } // } diff --git a/src/main/java/seng302/utilities/XMLGenerator.java b/src/main/java/seng302/utilities/XMLGenerator.java index 3dc99694..7fcc8efd 100644 --- a/src/main/java/seng302/utilities/XMLGenerator.java +++ b/src/main/java/seng302/utilities/XMLGenerator.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import seng302.model.stream.xml.generator.Race; import seng302.model.stream.xml.generator.Regatta; -import seng302.gameServer.server.messages.XMLMessageSubType; +import seng302.gameServer.messages.XMLMessageSubType; /** * An XML generator to generate the Race, Boat, and Regatta XML dynamically diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index 9f76d37c..dbf93693 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -21,12 +21,12 @@ import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ButtonType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import seng302.gameServer.server.messages.BoatAction; -import seng302.gameServer.server.messages.BoatActionMessage; -import seng302.gameServer.server.messages.ClientType; -import seng302.gameServer.server.messages.Message; -import seng302.gameServer.server.messages.RegistrationRequestMessage; -import seng302.gameServer.server.messages.RegistrationResponseStatus; +import seng302.gameServer.messages.BoatAction; +import seng302.gameServer.messages.BoatActionMessage; +import seng302.gameServer.messages.ClientType; +import seng302.gameServer.messages.Message; +import seng302.gameServer.messages.RegistrationRequestMessage; +import seng302.gameServer.messages.RegistrationResponseStatus; import seng302.model.stream.packets.PacketType; import seng302.model.stream.packets.StreamPacket; diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index bd702a47..f748f2c5 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -13,7 +13,7 @@ import javafx.scene.Node; import javafx.scene.input.KeyEvent; import javafx.scene.layout.Pane; import seng302.gameServer.MainServerThread; -import seng302.gameServer.server.messages.BoatAction; +import seng302.gameServer.messages.BoatAction; import seng302.model.ClientYacht; import seng302.model.RaceState; import seng302.model.stream.packets.StreamPacket; @@ -141,17 +141,7 @@ public class GameClient { } private void loadRaceView() { - FXMLLoader fxmlLoader = new FXMLLoader( - RaceViewController.class.getResource("/views/RaceView.fxml")); - try { - final Node node = fxmlLoader.load(); - Platform.runLater(() -> { - holderPane.getChildren().clear(); - holderPane.getChildren().add(node); - }); - } catch (IOException e) { - e.printStackTrace(); - } + FXMLLoader fxmlLoader = loadFXMLToHolder("/views/RaceView.fxml"); holderPane.getScene().setOnKeyPressed(this::keyPressed); holderPane.getScene().setOnKeyReleased(this::keyReleased); raceView = fxmlLoader.getController(); @@ -160,17 +150,23 @@ public class GameClient { } private void loadFinishScreenView() { + loadFXMLToHolder("/views/FinishScreenView.fxml"); + } + + private FXMLLoader loadFXMLToHolder(String fxmlLocation) { FXMLLoader fxmlLoader = new FXMLLoader( - getClass().getResource("/views/FinishScreenView.fxml")); + getClass().getResource(fxmlLocation) + ); try { - final Node finishScreenFX = fxmlLoader.load(); + final Node fxmlLoaderFX = fxmlLoader.load(); Platform.runLater(() -> { holderPane.getChildren().clear(); - holderPane.getChildren().add(finishScreenFX); + holderPane.getChildren().add(fxmlLoaderFX); }); } catch (IOException e) { e.printStackTrace(); } + return fxmlLoader; } private void parsePackets() { @@ -247,8 +243,8 @@ public class GameClient { private void updatePosition(PositionUpdateData positionData) { if (positionData.getType() == DeviceType.YACHT_TYPE) { if (allXMLReceived() && allBoatsMap.containsKey(positionData.getDeviceId())) { - ClientYacht clientYacht = allBoatsMap.get(positionData.getDeviceId()); - clientYacht.updateLocation(positionData.getLat(), + ClientYacht yacht = allBoatsMap.get(positionData.getDeviceId()); + yacht.updateLocation(positionData.getLat(), positionData.getLon(), positionData.getHeading(), positionData.getGroundSpeed()); } @@ -265,14 +261,26 @@ public class GameClient { */ private void updateMarkRounding(MarkRoundingData roundingData) { if (allXMLReceived()) { - ClientYacht clientYacht = allBoatsMap.get(roundingData.getBoatId()); - clientYacht.setMarkRoundingTime(roundingData.getTimeStamp()); - clientYacht.updateTimeSinceLastMarkProperty( - raceState.getRaceTime() - roundingData.getTimeStamp()); - clientYacht.setLastMarkRounded( - courseData.getCompoundMarks().get( - roundingData.getMarkId() - ) + ClientYacht yacht = allBoatsMap.get(roundingData.getBoatId()); + int placing = 1; + int originalPlacing = yacht.getPlacing(); + for (ClientYacht otherYacht : allBoatsMap.values()) { + if (otherYacht != yacht && yacht.getLegNumber() + 1 <= otherYacht.getLegNumber()) { + placing++; + } + } + if (placing != originalPlacing) { + yacht.setPlacing(placing); + for (ClientYacht otherYacht : allBoatsMap.values()) { + if (otherYacht.getPlacing() < placing) { + otherYacht.setPlacing(otherYacht.getPlacing() + 1); + } + } + } + yacht.roundMark( + courseData.getCompoundMarks().get(roundingData.getMarkId()), + roundingData.getTimeStamp(), + raceState.getRaceTime() - roundingData.getTimeStamp() ); } } @@ -280,35 +288,33 @@ public class GameClient { private void processRaceStatusUpdate(RaceStatusData data) { if (allXMLReceived()) { raceState.updateState(data); - if (raceView != null) { - raceView.getGameView().setWindDir(raceState.getWindDirection()); - } boolean raceFinished = true; for (ClientYacht yacht : allBoatsMap.values()) { if (yacht.getBoatStatus() != 3) { raceFinished = false; } } - if (raceFinished == true) { + if (raceFinished) { loadFinishScreenView(); } for (long[] boatData : data.getBoatData()) { - ClientYacht clientYacht = allBoatsMap.get((int) boatData[0]); - clientYacht.setEstimateTimeTillNextMark(raceState.getRaceTime() - boatData[1]); - clientYacht.setEstimateTimeAtFinish(boatData[2]); + ClientYacht yacht = allBoatsMap.get((int) boatData[0]); + yacht.setEstimateTimeTillNextMark(raceState.getRaceTime() - boatData[1]); + yacht.setEstimateTimeAtFinish(boatData[2]); int legNumber = (int) boatData[3]; - clientYacht.setLegNumber(legNumber); - clientYacht.setBoatStatus((int) boatData[4]); - if (legNumber != clientYacht.getLegNumber()) { - int placing = 1; - for (ClientYacht otherClientYacht : allBoatsMap.values()) { - if (otherClientYacht.getSourceId() != boatData[0] && - clientYacht.getLegNumber() <= otherClientYacht.getLegNumber()) - placing++; - } - clientYacht.setPositionInteger(placing); - } +// yacht.setLegNumber(legNumber); + yacht.setBoatStatus((int) boatData[4]); +// if (legNumber != yacht.getLegNumber()) { +// System.out.println("WHAT THE FUCK IT WORKS????"); +// int placing = 1; +// for (ClientYacht otherClientYacht : allBoatsMap.values()) { +// if (otherClientYacht.getSourceId() != boatData[0] && +// yacht.getLegNumber() <= otherClientYacht.getLegNumber()) +// placing++; +// } +// yacht.setPlacing(placing); +// } } } } @@ -347,7 +353,7 @@ public class GameClient { //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); - raceView.getGameView().getPlayerYacht().toggleSail(); + allBoatsMap.get(socketThread.getClientId()).toggleSail(); break; case PAGE_UP: case PAGE_DOWN: @@ -365,7 +371,11 @@ public class GameClient { private void showCollisionAlert(YachtEventData yachtEventData) { // 33 is the agreed code to show collision if (yachtEventData.getEventId() == 33) { - raceView.showCollision(yachtEventData.getSubjectId()); + raceState.storeCollision( + allBoatsMap.get( + yachtEventData.getSubjectId().intValue() + ) + ); } } } diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 68710d7f..75a3dac7 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -7,7 +7,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ThreadLocalRandom; - import javafx.animation.AnimationTimer; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; @@ -25,8 +24,8 @@ import javafx.scene.paint.Paint; import javafx.scene.shape.Circle; import javafx.scene.shape.Polygon; import javafx.scene.text.Text; -import seng302.model.ClientYacht; import javafx.util.Duration; +import seng302.model.ClientYacht; import seng302.model.Colors; import seng302.model.GeoPoint; import seng302.model.Limit; @@ -34,7 +33,12 @@ import seng302.model.mark.CompoundMark; import seng302.model.mark.Corner; import seng302.model.mark.Mark; import seng302.utilities.GeoUtility; -import seng302.visualiser.fxObjects.*; +import seng302.visualiser.fxObjects.AnnotationBox; +import seng302.visualiser.fxObjects.BoatObject; +import seng302.visualiser.fxObjects.CourseBoundary; +import seng302.visualiser.fxObjects.Gate; +import seng302.visualiser.fxObjects.MarkArrowFactory; +import seng302.visualiser.fxObjects.Marker; import seng302.visualiser.map.Boundary; import seng302.visualiser.map.CanvasMap; @@ -74,6 +78,7 @@ public class GameView extends Pane { private Group boatObjectGroup = new Group(); private Group trails = new Group(); private Group markers = new Group(); + private List course = new ArrayList<>(); private ImageView mapImage = new ImageView(); @@ -212,6 +217,20 @@ public class GameView extends Pane { */ public void updateCourse(List newCourse, List sequence) { markerObjects = new HashMap<>(); + + for (Corner corner : sequence) { //Makes course out of all compound marks. + for (CompoundMark compoundMark : newCourse) { + if (corner.getCompoundMarkID() == compoundMark.getId()) { + course.add(compoundMark); + } + } + } + int j = 0; + for (CompoundMark cm : course) { + System.out.println(cm.getId() + " " + j++); + System.out.println(cm.toString()); + } + final List gates = new ArrayList<>(); Paint colour = Color.BLACK; //Creates new markers @@ -344,23 +363,23 @@ public class GameView extends Pane { /** * Draws all the boats. - * @param clientYachts The yachts to set in the race + * @param yachts The yachts to set in the race */ - public void setBoats(List clientYachts) { + public void setBoats(List yachts) { BoatObject newBoat; final List wakes = new ArrayList<>(); - for (ClientYacht clientYacht : clientYachts) { + for (ClientYacht yacht : yachts) { Paint colour = Colors.getColor(); newBoat = new BoatObject(); newBoat.setFill(colour); - boatObjects.put(clientYacht, newBoat); - createAndBindAnnotationBox(clientYacht, colour); + boatObjects.put(yacht, newBoat); + createAndBindAnnotationBox(yacht, colour); // wakesGroup.getChildren().add(newBoat.getWake()); wakes.add(newBoat.getWake()); boatObjectGroup.getChildren().add(newBoat); trails.getChildren().add(newBoat.getTrail()); // TODO: 1/08/17 Make this less vile to look at. - clientYacht.addLocationListener((boat, lat, lon, heading, sailIn, velocity) -> { + yacht.addLocationListener((boat, lat, lon, heading, sailIn, velocity) -> { BoatObject bo = boatObjects.get(boat); Point2D p2d = findScaledXY(lat, lon); bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir); @@ -384,11 +403,11 @@ public class GameView extends Pane { }); } - private void createAndBindAnnotationBox(ClientYacht clientYacht, Paint colour) { + private void createAndBindAnnotationBox(ClientYacht yacht, Paint colour) { AnnotationBox newAnnotation = new AnnotationBox(); newAnnotation.setFill(colour); newAnnotation.addAnnotation( - "name", "Player: " + clientYacht.getShortName() + "name", "Player: " + yacht.getShortName() ); // newAnnotation.addAnnotation( // "velocity", @@ -411,7 +430,7 @@ public class GameView extends Pane { // return format.format(time); // } // ); - annotations.put(clientYacht, newAnnotation); + annotations.put(yacht, newAnnotation); } private void drawFps(Double fps) { @@ -613,7 +632,6 @@ public class GameView extends Pane { timer.stop(); } - public void setWindDir(double windDir) { this.windDir = windDir; } @@ -626,11 +644,18 @@ public class GameView extends Pane { return playerYacht; } - public void setBoatAsPlayer (ClientYacht playerYacht) { this.playerYacht = playerYacht; this.playerYacht.toggleSail(); boatObjects.get(playerYacht).setAsPlayer(); + CompoundMark currentMark = course.get(playerYacht.getLegNumber()); + for (Mark mark : currentMark.getMarks()) { + markerObjects.get(mark).showExitArrow(); + } + CompoundMark destination = course.get(playerYacht.getLegNumber() + 1); + for (Mark mark : destination.getMarks()) { + markerObjects.get(mark).showEnterArrow(); + } annotations.get(playerYacht).addAnnotation( "velocity", playerYacht.getVelocityProperty(), @@ -642,6 +667,24 @@ public class GameView extends Pane { annotationsGroup.getChildren().remove(annotations.get(playerYacht)); gameObjects.add(annotations.get(playerYacht)); }); + playerYacht.addMarkRoundingListener(this::updateMarkArrows); + } + + private void updateMarkArrows (ClientYacht yacht, CompoundMark compoundMark, int legNumber) { + //Only show arrows for this and next leg. + for (Mark mark : compoundMark.getMarks()) { + markerObjects.get(mark).showExitArrow(); + } + CompoundMark nextMark = course.get(legNumber); + for (Mark mark : nextMark.getMarks()) { + markerObjects.get(mark).showEnterArrow(); + } + if (legNumber - 2 >= 0) { + CompoundMark lastMark = course.get(Math.max(0, legNumber - 2)); + for (Mark mark : lastMark.getMarks()) { + markerObjects.get(mark).hideAllArows(); + } + } } /** @@ -651,32 +694,30 @@ public class GameView extends Pane { * @param collisionPoint yacht collision point */ public void drawCollision(GeoPoint collisionPoint) { - Platform.runLater(() -> { - Point2D point = findScaledXY(collisionPoint); - double circleRadius = 0.0; - Circle circle = new Circle(point.getX(), point.getY(), circleRadius, Color.RED); - gameObjects.add(circle); + Point2D point = findScaledXY(collisionPoint); + double circleRadius = 0.0; + Circle circle = new Circle(point.getX(), point.getY(), circleRadius, Color.RED); - circle.setFill(Color.TRANSPARENT); - circle.setStroke(Color.RED); - circle.setStrokeWidth(3); + circle.setFill(Color.TRANSPARENT); + circle.setStroke(Color.RED); + circle.setStrokeWidth(3); - Timeline timeline = new Timeline(); - timeline.setCycleCount(1); + Timeline timeline = new Timeline(); + timeline.setCycleCount(1); - KeyFrame keyframe1 = new KeyFrame(Duration.ZERO, - new KeyValue(circle.radiusProperty(), 0), - new KeyValue(circle.strokeProperty(), Color.TRANSPARENT)); - KeyFrame keyFrame2 = new KeyFrame(new Duration(1000), - new KeyValue(circle.radiusProperty(), 50), - new KeyValue(circle.strokeProperty(), Color.RED)); - KeyFrame keyFrame3 = new KeyFrame(new Duration(1500), - new KeyValue(circle.strokeProperty(), Color.TRANSPARENT)); + KeyFrame keyframe1 = new KeyFrame(Duration.ZERO, + new KeyValue(circle.radiusProperty(), 0), + new KeyValue(circle.strokeProperty(), Color.TRANSPARENT)); + KeyFrame keyFrame2 = new KeyFrame(new Duration(1000), + new KeyValue(circle.radiusProperty(), 50), + new KeyValue(circle.strokeProperty(), Color.RED)); + KeyFrame keyFrame3 = new KeyFrame(new Duration(1500), + new KeyValue(circle.strokeProperty(), Color.TRANSPARENT)); - timeline.getKeyFrames().addAll(keyframe1, keyFrame2, keyFrame3); - timeline.play(); + timeline.getKeyFrames().addAll(keyframe1, keyFrame2, keyFrame3); - timeline.setOnFinished(event -> gameObjects.remove(circle)); - }); + Platform.runLater(() -> gameObjects.add(circle)); + timeline.setOnFinished(event -> Platform.runLater(() -> gameObjects.remove(circle))); + timeline.play(); } } diff --git a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java index a4dc831b..671436bf 100644 --- a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java +++ b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java @@ -63,7 +63,7 @@ public class FinishScreenViewController implements Initializable { public void setFinishers(List participants) { List sorted = new ArrayList<>(participants); - sorted.sort(Comparator.comparingInt(ClientYacht::getPositionInteger)); + sorted.sort(Comparator.comparingInt(ClientYacht::getPlacing)); finishOrderTable.getItems().setAll(sorted); } diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index 0eae1d4c..e7180fd6 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -34,8 +34,8 @@ import javafx.scene.text.Text; import javafx.stage.Stage; import javafx.stage.StageStyle; import javafx.util.StringConverter; -import seng302.model.ClientYacht; import seng302.model.RaceState; +import seng302.model.ClientYacht; import seng302.model.mark.CompoundMark; import seng302.model.mark.Mark; import seng302.model.stream.xml.parser.RaceXMLData; @@ -79,6 +79,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel private GameView gameView; private RaceState raceState; + private Timeline timerTimeline; private Timer timer = new Timer(); private List> sparkLineData = new ArrayList<>(); private ImportantAnnotationsState importantAnnotations; @@ -100,8 +101,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } public void loadRace ( - Map participants, RaceXMLData raceData, RaceState raceState, - ClientYacht player + Map participants, RaceXMLData raceData, RaceState raceState, ClientYacht player ) { this.participants = participants; this.courseData = raceData; @@ -123,6 +123,17 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel ); gameView.setBoatAsPlayer(player); gameView.startRace(); + raceState.addCollisionListener(gameView::drawCollision); + raceState.windDirectionProperty().addListener((obs, oldDirection, newDirection) -> { + gameView.setWindDir(newDirection.doubleValue()); + updateWindDirection(newDirection.doubleValue()); + }); + for (ClientYacht yacht : participants.values()) { + yacht.placingProperty().addListener((obs, oldPlacing, newPlacing) -> { + updateOrder(); + updateSparkLine(); + }); + } } /** @@ -208,10 +219,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel /** - * Used to add any new yachts into the race that may have started late or not have had data - * received yet + * Used to add any new yachts into the race that may have started late or not have had data received yet */ - private void updateSparkLine() { + private void updateSparkLine(){ // TODO: 2/08/17 there is about 0 chance of this working. Once we are keeping track of boat positions it can be fixed. // Collect the racing yachts that aren't already in the chart sparkLineData.clear(); @@ -219,40 +229,39 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel // Create a new data series for new yachts sparkLineCandidates .stream() - .filter(yacht -> yacht.getPositionInteger() != null) + .filter(yacht -> yacht.getPlacing() != null) .forEach(yacht -> { Series yachtData = new Series<>(); yachtData.setName(yacht.getSourceId().toString()); yachtData.getData().add( new XYChart.Data<>( Integer.toString(yacht.getLegNumber()), - 1.0 + participants.size() - yacht.getPositionInteger() + 1.0 + participants.size() - yacht.getPlacing() ) ); - sparkLineData.add(yachtData); + sparkLineData.add(yachtData); }); // Lambda function to sort the series in order of leg (later legs shown more to the right) sparkLineData.sort((o1, o2) -> { - Integer leg1 = Integer.parseInt(o1.getData().get(o1.getData().size() - 1).getXValue()); - Integer leg2 = Integer.parseInt(o2.getData().get(o2.getData().size() - 1).getXValue()); - if (leg2 < leg1) { + Integer leg1 = Integer.parseInt(o1.getData().get(o1.getData().size()-1).getXValue()); + Integer leg2 = Integer.parseInt(o2.getData().get(o2.getData().size()-1).getXValue()); + if (leg2 < leg1){ return 1; } else { return -1; } }); // Adds the new data series to the sparkline (and set the colour of the series) - Platform.runLater(() -> + Platform.runLater(() -> { sparkLineData .stream() .filter(spark -> !raceSparkLine.getData().contains(spark)) .forEach(spark -> { raceSparkLine.getData().add(spark); - spark.getNode().lookup(".chart-series-line") - .setStyle("-fx-stroke:" + getBoatColorAsRGB(spark.getName())); - }) - ); + spark.getNode().lookup(".chart-series-line").setStyle("-fx-stroke:" + getBoatColorAsRGB(spark.getName())); + }); + }); } private void initialiseSparkLine() { @@ -262,15 +271,15 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel /** * Updates the yachts sparkline of the desired yacht and using the new leg number - * @param clientYacht The yacht to be updated on the sparkline + * @param yacht The yacht to be updated on the sparkline * @param legNumber the leg number that the position will be assigned to */ - void updateYachtPositionSparkline(ClientYacht clientYacht, Integer legNumber) { + void updateClientYachtPositionSparkline(ClientYacht yacht, Integer legNumber){ for (XYChart.Series positionData : sparkLineData) { positionData.getData().add( new Data<>( Integer.toString(legNumber), - 1.0 + participants.size() - clientYacht.getPositionInteger() + 1.0 + participants.size() - yacht.getPlacing() ) ); } @@ -278,7 +287,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel // positionData.getData().add( // new XYChart.Data<>( // Integer.toString(legNumber), -// 1.0 + participants.size() - yacht.getPosition() +// 1.0 + participants.size() - yacht.getPlacing() // ) // ); } @@ -286,52 +295,47 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel /** * gets the rgb string of the yachts colour to use for the chart via css - * * @param yachtId id of yacht passed in to get the yachts colour * @return the colour as an rgb string */ - private String getBoatColorAsRGB(String yachtId) { + private String getBoatColorAsRGB(String yachtId){ Color color = participants.get(Integer.valueOf(yachtId)).getColour(); - if (color == null) { - return String.format("#%02X%02X%02X", 255, 255, 255); + if (color == null){ + return String.format("#%02X%02X%02X",255,255,255); } - return String.format("#%02X%02X%02X", - (int) (color.getRed() * 255), - (int) (color.getGreen() * 255), - (int) (color.getBlue() * 255) + return String.format( "#%02X%02X%02X", + (int)( color.getRed() * 255 ), + (int)( color.getGreen() * 255 ), + (int)( color.getBlue() * 255 ) ); } /** * Initialises a timer which updates elements of the RaceView such as wind direction, yacht - * orderings etc.. which are dependent on the info from the stream parser constantly. Updates of - * each of these attributes are called ONCE EACH SECOND + * orderings etc.. which are dependent on the info from the stream parser constantly. + * Updates of each of these attributes are called ONCE EACH SECOND */ private void initializeUpdateTimer() { timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { updateRaceTime(); - updateWindDirection(); - updateOrder(); -// updateSparkLine(); } }, 0, 1000); } /** - * Iterates over all corners until ones SeqID matches with the yachts current leg number. Then - * it gets the compoundMarkID of that corner and uses it to fetch the appropriate mark Returns - * null if no next mark found. - * + * Iterates over all corners until ones SeqID matches with the yachts current leg number. + * Then it gets the compoundMarkID of that corner and uses it to fetch the appropriate mark + * Returns null if no next mark found. * @param bg The BoatGroup to find the next mark of * @return The next Mark or null if none found */ private Mark getNextMark(BoatObject bg) { // TODO: 1/08/17 Move to GameView // -// Integer legNumber = bg.getYacht().getLegNumber(); +// Integer legNumber = bg.getClientYacht().getLegNumber(); // List markSequence = courseData.getMarkSequence(); // // if (legNumber == 0) { @@ -352,10 +356,11 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel /** * Updates the wind direction arrow and text as from info from the StreamParser + * @param direction the from north angle of the wind. */ - private void updateWindDirection() { - windDirectionText.setText(String.format("%.1f°", raceState.getWindDirection())); - windArrowText.setRotate(raceState.getWindDirection()); + private void updateWindDirection(double direction) { + windDirectionText.setText(String.format("%.1f°", direction)); + windArrowText.setRotate(direction); } @@ -376,25 +381,20 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel * section */ private void updateOrder() { -// positionVbox.getChildren().removeAll(); -// positionVbox.getStylesheets().add(getClass().getResource("/css/master.css").toString()); - - // list of racing yacht id List sorted = new ArrayList<>(participants.values()); - sorted.sort(Comparator.comparingInt(ClientYacht::getPositionInteger)); + sorted.sort(Comparator.comparingInt(ClientYacht::getPlacing)); List vboxEntries = new ArrayList<>(); - for (ClientYacht clientYacht : sorted) { -// System.out.println("yacht == null " + String.valueOf(yacht == null)); - if (clientYacht.getBoatStatus() == 3) { // 3 is finish status - Text textToAdd = new Text(clientYacht.getPositionInteger() + ". " + - clientYacht.getShortName() + " (Finished)"); + for (ClientYacht yacht : sorted) { + if (yacht.getBoatStatus() == 3) { // 3 is finish status + Text textToAdd = new Text(yacht.getPlacing() + ". " + + yacht.getShortName() + " (Finished)"); textToAdd.setFill(Paint.valueOf("#d3d3d3")); vboxEntries.add(textToAdd); } else { - Text textToAdd = new Text(clientYacht.getPositionInteger() + ". " + - clientYacht.getShortName() + " "); + Text textToAdd = new Text(yacht.getPlacing() + ". " + + yacht.getShortName() + " "); textToAdd.setFill(Paint.valueOf("#d3d3d3")); textToAdd.setStyle(""); vboxEntries.add(textToAdd); @@ -403,13 +403,6 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel Platform.runLater(() -> positionVbox.getChildren().setAll(vboxEntries) ); -// participants.forEach((id, yacht) ->{ -// Text textToAdd = new Text(yacht.getPosition() + ". " + -// yacht.getShortName() + " "); -// textToAdd.setFill(Paint.valueOf("#d3d3d3")); -// textToAdd.setStyle(""); -// positionVbox.getChildren().add(textToAdd); -// }); } @@ -478,17 +471,15 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } - private Point2D getPointRotation(Point2D ref, Double distance, Double angle) { - Double newX = ref.getX() + (ref.getX() + distance - ref.getX()) * Math.cos(angle) - - (ref.getY() + distance - ref.getY()) * Math.sin(angle); - Double newY = ref.getY() + (ref.getX() + distance - ref.getX()) * Math.sin(angle) - + (ref.getY() + distance - ref.getY()) * Math.cos(angle); + private Point2D getPointRotation(Point2D ref, Double distance, Double angle){ + Double newX = ref.getX() + (ref.getX() + distance -ref.getX())*Math.cos(angle) - (ref.getY() + distance -ref.getY())*Math.sin(angle); + Double newY = ref.getY() + (ref.getX() + distance -ref.getX())*Math.sin(angle) + (ref.getY() + distance -ref.getY())*Math.cos(angle); return new Point2D(newX, newY); } - public Line makeLeftLayline(Point2D startPoint, Double layLineAngle, Double baseAngle) { + public Line makeLeftLayline(Point2D startPoint, Double layLineAngle, Double baseAngle) { Point2D ep = getPointRotation(startPoint, 50.0, baseAngle + layLineAngle); Line line = new Line(startPoint.getX(), startPoint.getY(), ep.getX(), ep.getY()); @@ -507,8 +498,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel /** - * Initialised the combo box with any yachts currently in the race and adds the required - * listener for the combobox to take action upon selection + * Initialised the combo box with any yachts currently in the race and adds the required listener + * for the combobox to take action upon selection */ private void initialiseBoatSelectionComboBox() { yachtSelectionComboBox.setItems( @@ -545,7 +536,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel TimeUnit.MILLISECONDS.toHours(milliseconds), TimeUnit.MILLISECONDS.toMinutes(milliseconds) % 60, //Modulus 60 minutes per hour TimeUnit.MILLISECONDS.toSeconds(milliseconds) % 60 //Modulus 60 seconds per minute - ); + ); } private void setAnnotations(Integer annotationLevel) { @@ -580,9 +571,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel /** * Sets all the annotations of the selected yacht to be visible and all others to be hidden * - * @param clientYacht The yacht for which we want to view all annotations + * @param yacht The yacht for which we want to view all annotations */ - private void setSelectedBoat(ClientYacht clientYacht) { + private void setSelectedBoat(ClientYacht yacht) { // for (BoatObject bg : gameViewController.getBoatGroups()) { // //We need to iterate over all race groups to get the matching yacht group belonging to this yacht if we // //are to toggle its annotations, there is no other backwards knowledge of a yacht to its yachtgroup. @@ -596,23 +587,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel // } } - public void updateRaceData(RaceXMLData raceData) { + public void updateRaceData (RaceXMLData raceData) { this.courseData = raceData; gameView.updateBorder(raceData.getCourseLimit()); } - - /** - * Called by game client after receiving yacht event packet. Parameter subject id is the - * offending yacht. This function in turn will pass the yacht location to game view to display a - * collision alert. - * - * @param subjectId source id of offending yacht - */ - public void showCollision(Long subjectId) { - gameView.drawCollision(participants.get((int) (long) subjectId).getLocation()); - } - - 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 b04fcaae..1cb56884 100644 --- a/src/main/java/seng302/visualiser/fxObjects/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/BoatObject.java @@ -11,6 +11,7 @@ import javafx.scene.paint.Paint; import javafx.scene.shape.Line; import javafx.scene.shape.Polygon; import javafx.scene.shape.Polyline; +import javafx.scene.shape.StrokeLineCap; import javafx.scene.transform.Rotate; /** @@ -352,7 +353,8 @@ public class BoatObject extends Group { BOAT_WIDTH / 1.75, BOAT_HEIGHT / 1.75 ); boatPoly.setStroke(Color.BLACK); - boatPoly.setStrokeWidth(3); + boatPoly.setStrokeWidth(2); + boatPoly.setStrokeLineCap(StrokeLineCap.ROUND); isPlayer = true; animateSail(); } diff --git a/src/main/java/seng302/visualiser/fxObjects/Marker.java b/src/main/java/seng302/visualiser/fxObjects/Marker.java index 6fade144..ead4681f 100644 --- a/src/main/java/seng302/visualiser/fxObjects/Marker.java +++ b/src/main/java/seng302/visualiser/fxObjects/Marker.java @@ -32,15 +32,29 @@ public class Marker extends Group { public void constructArrows(MarkArrowFactory.RoundingSide roundingSide, double entryAngle, double exitAngle) { enterArrow = MarkArrowFactory.constructEntryArrow(roundingSide, entryAngle, exitAngle, colour); exitArrow = MarkArrowFactory.constructExitArrow(roundingSide, exitAngle, colour); - Platform.runLater(() -> this.getChildren().add(enterArrow)); -// Platform.runLater(() -> this.getChildren().add(exitArrow)); } public void showEnterArrow () { - Platform.runLater(() -> this.getChildren().setAll(enterArrow)); + if (!this.getChildren().contains(enterArrow)) { + Platform.runLater(() -> { + this.getChildren().remove(exitArrow); + this.getChildren().add(enterArrow); + }); + } } public void showExitArrow () { - Platform.runLater(() -> this.getChildren().setAll(exitArrow)); + if (!this.getChildren().contains(exitArrow)) { + Platform.runLater(() -> { + this.getChildren().remove(enterArrow); + this.getChildren().add(exitArrow); + }); + } + } + + public void hideAllArows () { + Platform.runLater(() -> { + this.getChildren().removeAll(enterArrow, exitArrow); + }); } } \ No newline at end of file diff --git a/src/test/java/seng302/gameServer/server/TestConversions.java b/src/test/java/seng302/gameServer/server/TestConversions.java index b341def1..f8f16e20 100644 --- a/src/test/java/seng302/gameServer/server/TestConversions.java +++ b/src/test/java/seng302/gameServer/server/TestConversions.java @@ -3,7 +3,7 @@ package seng302.gameServer.server; import static junit.framework.TestCase.assertEquals; import org.junit.Test; -import seng302.gameServer.server.messages.BoatLocationMessage; +import seng302.gameServer.messages.BoatLocationMessage; /** * Test conversions used by the boat location messages diff --git a/src/test/java/seng302/gameServer/server/TestHeader.java b/src/test/java/seng302/gameServer/server/TestHeader.java index 3441e3bc..7d7221b3 100644 --- a/src/test/java/seng302/gameServer/server/TestHeader.java +++ b/src/test/java/seng302/gameServer/server/TestHeader.java @@ -3,8 +3,8 @@ package seng302.gameServer.server; import static junit.framework.TestCase.assertTrue; import org.junit.Test; -import seng302.gameServer.server.messages.Header; -import seng302.gameServer.server.messages.MessageType; +import seng302.gameServer.messages.Header; +import seng302.gameServer.messages.MessageType; /** * Tests message header diff --git a/src/test/java/seng302/gameServer/server/TestMessage.java b/src/test/java/seng302/gameServer/server/TestMessage.java index 337202ec..86fe96f2 100644 --- a/src/test/java/seng302/gameServer/server/TestMessage.java +++ b/src/test/java/seng302/gameServer/server/TestMessage.java @@ -4,9 +4,9 @@ import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; import org.junit.Test; -import seng302.gameServer.server.messages.Message; -import seng302.gameServer.server.messages.XMLMessage; -import seng302.gameServer.server.messages.XMLMessageSubType; +import seng302.gameServer.messages.Message; +import seng302.gameServer.messages.XMLMessage; +import seng302.gameServer.messages.XMLMessageSubType; public class TestMessage { private static int XML_MESSAGE_LEN = 14; diff --git a/src/test/java/steps/ToggleSailSteps.java b/src/test/java/steps/ToggleSailSteps.java index f74b05be..e4c6abed 100644 --- a/src/test/java/steps/ToggleSailSteps.java +++ b/src/test/java/steps/ToggleSailSteps.java @@ -8,7 +8,7 @@ import org.junit.Assert; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; import seng302.gameServer.MainServerThread; -import seng302.gameServer.server.messages.BoatAction; +import seng302.gameServer.messages.BoatAction; import seng302.model.ServerYacht; import seng302.visualiser.ClientToServerThread;