From 7c5670f8c20d4c0127de1bafb1dfb091487c8bd2 Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Mon, 7 Aug 2017 12:20:52 +1200 Subject: [PATCH 01/18] Sails are displayed on first boat in a race. Optimised imports. - Implemented drawSails method - Sail position is displayed and updated using a boat's heading - Sails conform to 'Points of sail' - Javadoc'd new method and tidied up existing - Sped up track point frequency (visualiserBoat class) - Optimised imports (any other classes changed) - A lot of canvas drawing and sail rotating issues were discovered and eventually overcome along the way. Using a sail image to draw and rotate on the existing canvas rather than a JavaFX shape on a new canvas was the final decision. #story[1098] --- .../java/mock/app/ConnectionAcceptor.java | 4 - .../src/main/java/mock/app/MockOutput.java | 4 - .../src/main/java/mock/model/MockRace.java | 3 +- .../java/network/BinaryMessageDecoder.java | 4 +- .../java/network/BinaryMessageEncoder.java | 4 +- .../MessageDecoders/BoatActionDecoder.java | 2 - .../MessageDecoders/BoatLocationDecoder.java | 4 +- .../MessageDecoders/RaceStatusDecoder.java | 4 +- .../MessageDecoders/XMLMessageDecoder.java | 3 - .../RaceVisionByteEncoder.java | 5 +- .../java/network/Messages/LatestMessages.java | 1 - .../java/network/Messages/XMLMessage.java | 1 - .../java/shared/dataInput/RaceDataSource.java | 1 - .../java/shared/dataInput/RaceXMLReader.java | 5 +- .../shared/dataInput/RegattaXMLReader.java | 4 - .../main/java/shared/dataInput/XMLReader.java | 1 - .../Controllers/ArrowController.java | 2 - .../Controllers/ConnectionController.java | 1 - .../Controllers/HostController.java | 6 +- .../Controllers/LobbyController.java | 1 - .../Controllers/RaceController.java | 1 - .../Controllers/TitleController.java | 5 - .../java/visualiser/app/VisualiserInput.java | 16 +- .../gameController/ControllerClient.java | 1 - .../gameController/ControllerServer.java | 2 - .../gameController/InputChecker.java | 2 - .../gameController/Keys/ControlKey.java | 2 - .../gameController/Keys/VMGKey.java | 2 - .../gameController/Keys/ZoomInKey.java | 2 - .../src/main/java/visualiser/model/Ping.java | 3 - .../java/visualiser/model/RaceConnection.java | 4 - .../visualiser/model/ResizableRaceCanvas.java | 177 +++++++----------- .../java/visualiser/model/VisualiserBoat.java | 4 +- .../java/visualiser/model/VisualiserRace.java | 1 - .../src/main/resources/images/sailsLeft.png | Bin 0 -> 122 bytes .../src/main/resources/images/sailsRight.png | Bin 0 -> 126 bytes .../resources/visualiser/scenes/arrow.fxml | 9 +- .../resources/visualiser/scenes/connect.fxml | 3 - .../resources/visualiser/scenes/hostgame.fxml | 7 +- .../resources/visualiser/scenes/lobby.fxml | 3 - .../resources/visualiser/scenes/main.fxml | 3 - .../resources/visualiser/scenes/title.fxml | 3 - .../visualiser/scenes/titleScreen.fxml | 14 +- .../test/java/mock/model/MockBoatTest.java | 2 - .../test/java/mock/model/MockRaceTest.java | 2 - .../src/test/java/mock/model/PolarsTest.java | 4 +- .../src/test/java/mock/model/VMGTest.java | 2 +- .../network/BinaryMessageDecoderTest.java | 3 - .../network/Utils/AC35UnitConverterTest.java | 5 +- .../java/network/Utils/ByteConverterTest.java | 1 - .../java/network/XMLMessageEncoderTest.java | 3 - .../shared/dataInput/BoatXMLReaderTest.java | 8 +- .../src/test/java/shared/model/AngleTest.java | 2 - .../test/java/shared/model/AzimuthTest.java | 2 - .../test/java/shared/model/BearingTest.java | 2 - .../java/shared/model/CompoundMarkTest.java | 1 - .../src/test/java/shared/model/MarkTest.java | 2 - .../test/java/shared/model/RaceClockTest.java | 2 - .../GameControllerManualTest.java | 1 - .../visualiser/model/RaceConnectionTest.java | 1 - 60 files changed, 98 insertions(+), 269 deletions(-) create mode 100644 racevisionGame/src/main/resources/images/sailsLeft.png create mode 100644 racevisionGame/src/main/resources/images/sailsRight.png diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java index 97a974a9..6a93651d 100644 --- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java +++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java @@ -3,18 +3,14 @@ package mock.app; import network.Messages.Enums.XMLMessageType; import network.Messages.LatestMessages; import network.Messages.XMLMessage; -import org.mockito.Mock; import visualiser.gameController.ControllerServer; import java.io.DataOutputStream; import java.io.IOException; -import java.lang.reflect.Array; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.ArrayBlockingQueue; /** diff --git a/racevisionGame/src/main/java/mock/app/MockOutput.java b/racevisionGame/src/main/java/mock/app/MockOutput.java index aff0947e..c2c525a4 100644 --- a/racevisionGame/src/main/java/mock/app/MockOutput.java +++ b/racevisionGame/src/main/java/mock/app/MockOutput.java @@ -1,17 +1,13 @@ package mock.app; - import network.BinaryMessageEncoder; import network.MessageEncoders.RaceVisionByteEncoder; import network.Messages.*; import network.Messages.Enums.MessageType; -import network.Messages.Enums.XMLMessageType; import java.io.DataOutputStream; import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; import java.net.SocketException; /** diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 33884e3d..5f177505 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -4,18 +4,17 @@ import javafx.animation.AnimationTimer; import network.Messages.BoatLocation; import network.Messages.BoatStatus; import network.Messages.Enums.BoatStatusEnum; +import network.Messages.Enums.RaceStatusEnum; import network.Messages.LatestMessages; import network.Messages.RaceStatus; import network.Utils.AC35UnitConverter; import shared.dataInput.BoatDataSource; import shared.dataInput.RaceDataSource; -import network.Messages.Enums.RaceStatusEnum; import shared.dataInput.RegattaDataSource; import shared.model.*; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; -import java.time.temporal.TemporalUnit; import java.util.*; import static java.lang.Math.cos; diff --git a/racevisionGame/src/main/java/network/BinaryMessageDecoder.java b/racevisionGame/src/main/java/network/BinaryMessageDecoder.java index ecc6b2f3..f8b2bbb6 100644 --- a/racevisionGame/src/main/java/network/BinaryMessageDecoder.java +++ b/racevisionGame/src/main/java/network/BinaryMessageDecoder.java @@ -5,12 +5,14 @@ import network.Exceptions.InvalidMessageException; import network.MessageDecoders.*; import network.Messages.*; import network.Messages.Enums.MessageType; -import static network.Utils.ByteConverter.*; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.zip.CRC32; +import static network.Utils.ByteConverter.bytesToInt; +import static network.Utils.ByteConverter.bytesToLong; + /** * This class can be used to decode/convert a byte array into a messageBody object, descended from AC35Data. */ diff --git a/racevisionGame/src/main/java/network/BinaryMessageEncoder.java b/racevisionGame/src/main/java/network/BinaryMessageEncoder.java index ced31af1..0d55d519 100644 --- a/racevisionGame/src/main/java/network/BinaryMessageEncoder.java +++ b/racevisionGame/src/main/java/network/BinaryMessageEncoder.java @@ -1,13 +1,13 @@ package network; - import network.Messages.Enums.MessageType; -import static network.Utils.ByteConverter.*; import java.nio.ByteBuffer; import java.util.zip.CRC32; +import static network.Utils.ByteConverter.*; + /** * This class can be used to encode/convert a byte array message body, plus header data into a byte array containing the entire message, ready to send. diff --git a/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java b/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java index bf2076b5..44874fc4 100644 --- a/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java +++ b/racevisionGame/src/main/java/network/MessageDecoders/BoatActionDecoder.java @@ -2,8 +2,6 @@ package network.MessageDecoders; import network.Messages.Enums.BoatActionEnum; -import java.util.Arrays; - public class BoatActionDecoder { byte byteBoatAction; BoatActionEnum boatAction; diff --git a/racevisionGame/src/main/java/network/MessageDecoders/BoatLocationDecoder.java b/racevisionGame/src/main/java/network/MessageDecoders/BoatLocationDecoder.java index db90a343..a1876c22 100644 --- a/racevisionGame/src/main/java/network/MessageDecoders/BoatLocationDecoder.java +++ b/racevisionGame/src/main/java/network/MessageDecoders/BoatLocationDecoder.java @@ -5,9 +5,7 @@ import network.Messages.BoatLocation; import java.util.Arrays; -import static network.Utils.ByteConverter.bytesToInt; -import static network.Utils.ByteConverter.bytesToLong; -import static network.Utils.ByteConverter.bytesToShort; +import static network.Utils.ByteConverter.*; /** diff --git a/racevisionGame/src/main/java/network/MessageDecoders/RaceStatusDecoder.java b/racevisionGame/src/main/java/network/MessageDecoders/RaceStatusDecoder.java index e4d147df..15914a88 100644 --- a/racevisionGame/src/main/java/network/MessageDecoders/RaceStatusDecoder.java +++ b/racevisionGame/src/main/java/network/MessageDecoders/RaceStatusDecoder.java @@ -6,9 +6,7 @@ import network.Messages.BoatStatus; import java.util.ArrayList; import java.util.Arrays; -import static network.Utils.ByteConverter.bytesToInt; -import static network.Utils.ByteConverter.bytesToLong; -import static network.Utils.ByteConverter.bytesToShort; +import static network.Utils.ByteConverter.*; /** diff --git a/racevisionGame/src/main/java/network/MessageDecoders/XMLMessageDecoder.java b/racevisionGame/src/main/java/network/MessageDecoders/XMLMessageDecoder.java index 18ead92e..681be925 100644 --- a/racevisionGame/src/main/java/network/MessageDecoders/XMLMessageDecoder.java +++ b/racevisionGame/src/main/java/network/MessageDecoders/XMLMessageDecoder.java @@ -2,9 +2,6 @@ package network.MessageDecoders; import network.Messages.Enums.XMLMessageType; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.util.Arrays; import static network.Utils.ByteConverter.bytesToLong; diff --git a/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java b/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java index 4c57cf0c..731365c3 100644 --- a/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java +++ b/racevisionGame/src/main/java/network/MessageEncoders/RaceVisionByteEncoder.java @@ -3,13 +3,14 @@ package network.MessageEncoders; import network.Messages.*; -import static network.Utils.ByteConverter.*; - import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import static network.Utils.ByteConverter.intToBytes; +import static network.Utils.ByteConverter.longToBytes; + /** diff --git a/racevisionGame/src/main/java/network/Messages/LatestMessages.java b/racevisionGame/src/main/java/network/Messages/LatestMessages.java index f35fc52e..4ab840ab 100644 --- a/racevisionGame/src/main/java/network/Messages/LatestMessages.java +++ b/racevisionGame/src/main/java/network/Messages/LatestMessages.java @@ -1,7 +1,6 @@ package network.Messages; import network.Messages.Enums.XMLMessageType; -import shared.dataInput.RaceDataSource; import java.util.HashMap; import java.util.Map; diff --git a/racevisionGame/src/main/java/network/Messages/XMLMessage.java b/racevisionGame/src/main/java/network/Messages/XMLMessage.java index e3a4aa1b..9e009084 100644 --- a/racevisionGame/src/main/java/network/Messages/XMLMessage.java +++ b/racevisionGame/src/main/java/network/Messages/XMLMessage.java @@ -4,7 +4,6 @@ package network.Messages; import network.Messages.Enums.MessageType; import network.Messages.Enums.XMLMessageType; -import java.io.InputStream; import java.nio.charset.StandardCharsets; /** diff --git a/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java b/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java index 668714e9..b89dc45d 100644 --- a/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java +++ b/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java @@ -1,7 +1,6 @@ package shared.dataInput; import network.Messages.Enums.RaceTypeEnum; -import shared.model.Boat; import shared.model.CompoundMark; import shared.model.GPSCoordinate; import shared.model.Leg; diff --git a/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java b/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java index 7e61b3de..bf4fb1fe 100644 --- a/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java +++ b/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java @@ -8,7 +8,10 @@ import org.w3c.dom.NodeList; import shared.enums.XMLFileType; import shared.exceptions.InvalidRaceDataException; import shared.exceptions.XMLReaderException; -import shared.model.*; +import shared.model.CompoundMark; +import shared.model.GPSCoordinate; +import shared.model.Leg; +import shared.model.Mark; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; diff --git a/racevisionGame/src/main/java/shared/dataInput/RegattaXMLReader.java b/racevisionGame/src/main/java/shared/dataInput/RegattaXMLReader.java index 08d4a034..0a756b03 100644 --- a/racevisionGame/src/main/java/shared/dataInput/RegattaXMLReader.java +++ b/racevisionGame/src/main/java/shared/dataInput/RegattaXMLReader.java @@ -2,15 +2,11 @@ package shared.dataInput; import org.w3c.dom.Element; import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; -import shared.dataInput.XMLReader; import shared.enums.XMLFileType; import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; import shared.model.GPSCoordinate; -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; import java.io.InputStream; /** diff --git a/racevisionGame/src/main/java/shared/dataInput/XMLReader.java b/racevisionGame/src/main/java/shared/dataInput/XMLReader.java index 04c6c1f7..5d1f47b6 100644 --- a/racevisionGame/src/main/java/shared/dataInput/XMLReader.java +++ b/racevisionGame/src/main/java/shared/dataInput/XMLReader.java @@ -3,7 +3,6 @@ package shared.dataInput; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; -import org.xml.sax.InputSource; import org.xml.sax.SAXException; import shared.enums.XMLFileType; import shared.exceptions.XMLReaderException; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ArrowController.java b/racevisionGame/src/main/java/visualiser/Controllers/ArrowController.java index 3e81cd16..ab9bd421 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ArrowController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ArrowController.java @@ -4,7 +4,6 @@ package visualiser.Controllers; import javafx.application.Platform; import javafx.beans.property.Property; import javafx.fxml.FXML; -import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.image.ImageView; import javafx.scene.layout.Pane; @@ -12,7 +11,6 @@ import javafx.scene.layout.StackPane; import javafx.scene.shape.Circle; import shared.model.Bearing; import shared.model.Wind; -import visualiser.model.VisualiserRace; /** * Controller for the arrow.fxml view. diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index ae8c682c..e822ebde 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -12,7 +12,6 @@ import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; import visualiser.model.RaceConnection; -import javax.xml.soap.Text; import java.io.IOException; import java.net.Socket; import java.net.URL; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index e87ea689..6b5b6adf 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -1,21 +1,17 @@ package visualiser.Controllers; -import javafx.application.Application; import javafx.fxml.FXML; -import javafx.scene.control.*; +import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; -import javafx.stage.Stage; import mock.app.Event; import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidRaceDataException; import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; -import visualiser.model.RaceConnection; import java.io.IOException; import java.net.Socket; import java.net.URL; -import java.net.UnknownHostException; import java.util.ResourceBundle; /** diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index dc4d8e59..87a90464 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -7,7 +7,6 @@ import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; -import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.AnchorPane; import visualiser.model.RaceConnection; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index f34c57a8..a7985c6e 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -8,7 +8,6 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.chart.LineChart; import javafx.scene.control.*; -import javafx.scene.control.Label; import javafx.scene.input.KeyEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java index 412858ee..887d3f07 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java @@ -1,14 +1,9 @@ package visualiser.Controllers; import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.RadioButton; -import javafx.scene.image.Image; import javafx.scene.layout.AnchorPane; -import javafx.stage.Stage; import visualiser.app.App; import java.io.IOException; diff --git a/racevisionGame/src/main/java/visualiser/app/VisualiserInput.java b/racevisionGame/src/main/java/visualiser/app/VisualiserInput.java index 0b8102b5..3c9370f5 100644 --- a/racevisionGame/src/main/java/visualiser/app/VisualiserInput.java +++ b/racevisionGame/src/main/java/visualiser/app/VisualiserInput.java @@ -1,26 +1,14 @@ package visualiser.app; -import javafx.application.Platform; + import network.BinaryMessageDecoder; import network.Exceptions.InvalidMessageException; import network.Messages.*; -import org.xml.sax.SAXException; -import shared.dataInput.BoatXMLReader; -import shared.dataInput.RaceXMLReader; -import shared.dataInput.RegattaXMLReader; -import shared.exceptions.InvalidBoatDataException; -import shared.exceptions.InvalidRaceDataException; -import shared.exceptions.InvalidRegattaDataException; -import shared.exceptions.XMLReaderException; - -import javax.xml.parsers.ParserConfigurationException; + import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; import java.nio.ByteBuffer; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ArrayBlockingQueue; import static network.Utils.ByteConverter.bytesToShort; diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java index eb46d361..f60f4b9d 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerClient.java @@ -10,7 +10,6 @@ import visualiser.gameController.Keys.ControlKey; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; -import java.net.SocketException; import java.nio.ByteBuffer; /** diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index fb6a257b..14252841 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -3,8 +3,6 @@ package visualiser.gameController; import network.BinaryMessageDecoder; import network.MessageDecoders.BoatActionDecoder; import network.Messages.Enums.BoatActionEnum; -import visualiser.gameController.Keys.ControlKey; -import visualiser.gameController.Keys.KeyFactory; import java.io.DataInputStream; import java.io.IOException; diff --git a/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java index 34a7d544..83fea61e 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java +++ b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java @@ -7,8 +7,6 @@ import visualiser.gameController.Keys.KeyFactory; import java.util.HashMap; -import static javafx.application.Application.launch; - /** * Class for checking what keys are currently being used */ diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java index ad8a559a..d5e53cc5 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ControlKey.java @@ -1,7 +1,5 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; - /** * Key for the controller, part of the abstract factory KeyFactory */ diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java index e6d82ba7..384be3aa 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/VMGKey.java @@ -1,7 +1,5 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; - /** * Key to trigger auto VMG */ diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java index 35b6ce94..51f98a58 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/ZoomInKey.java @@ -1,7 +1,5 @@ package visualiser.gameController.Keys; -import javafx.scene.input.KeyCode; - /** * key to zoom into the game */ diff --git a/racevisionGame/src/main/java/visualiser/model/Ping.java b/racevisionGame/src/main/java/visualiser/model/Ping.java index b81a3e0c..9cd51a1f 100644 --- a/racevisionGame/src/main/java/visualiser/model/Ping.java +++ b/racevisionGame/src/main/java/visualiser/model/Ping.java @@ -1,8 +1,5 @@ package visualiser.model; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; - import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; diff --git a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java index f9f2d4ea..0aed5618 100644 --- a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java +++ b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java @@ -3,10 +3,6 @@ package visualiser.model; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; - /** * Connection for Races */ diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index adbd4840..5078c2d9 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -1,7 +1,5 @@ package visualiser.model; - -import javafx.scene.Node; import javafx.scene.image.Image; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; @@ -12,7 +10,6 @@ import shared.model.GPSCoordinate; import shared.model.Mark; import shared.model.RaceClock; -import java.time.Duration; import java.util.List; /** @@ -29,23 +26,13 @@ import java.util.List; */ public class ResizableRaceCanvas extends ResizableCanvas { - /** - * The RaceMap used for converting GPSCoordinates to GraphCoordinates. - */ - private RaceMap map; - - /** - * The race we read data from and draw. - */ - private VisualiserRace visualiserRace; - - /** - * The background of the race. - * We render the background whenever the race boundary changes, or the screen size changes. - */ + private RaceMap map; // for converting GPSCoordinates to GraphCoordinates + private VisualiserRace visualiserRace; // draw data read from this race private Image background; + private Image sailsRight = new Image("/images/sailsRight.png"); + private Image sailsLeft = new Image("/images/sailsLeft.png"); - + // annotations private boolean annoName = true; private boolean annoAbbrev = true; private boolean annoSpeed = true; @@ -53,15 +40,12 @@ public class ResizableRaceCanvas extends ResizableCanvas { private boolean annoEstTime = true; private boolean annoTimeSinceLastMark = true; - - /** * Constructs a {@link ResizableRaceCanvas} using a given {@link VisualiserRace}. * @param visualiserRace The race that data is read from in order to be drawn. */ public ResizableRaceCanvas(VisualiserRace visualiserRace) { super(); - this.visualiserRace = visualiserRace; RaceDataSource raceData = visualiserRace.getRaceDataSource(); @@ -72,14 +56,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { double long2 = raceData.getMapBottomRight().getLongitude(); this.map = new RaceMap( - lat1, long1, lat2, long2, - (int) getWidth(), (int) getHeight() ); - - + lat1, long1, lat2, long2, (int)getWidth(), (int)getHeight()); } - - /** * Toggle name display in annotation */ @@ -119,11 +98,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { annoSpeed = !annoSpeed; } - - - /** - * Rotates things on the canvas Note: this must be called in between gc.save() and gc.restore() else they will rotate everything + * Rotates things displayed on the canvas. Note: this must be called in + * between gc.save() and gc.restore() else they will rotate everything * * @param degrees Bearing degrees to rotate. * @param px Pivot point x of rotation. @@ -134,8 +111,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy()); } - - /** * Draws a circle with a given diameter, centred on a given graph coordinate. * @param center The center coordinate of the circle. @@ -147,8 +122,8 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.fillOval( center.getX() - (diameter / 2), center.getY() - (diameter / 2), - diameter, diameter ); - + diameter, diameter + ); } /** @@ -163,7 +138,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.setStroke(paint); gc.setFill(paint); - double endPointDiameter = 6; //Draw first end-point. @@ -177,8 +151,8 @@ public class ResizableRaceCanvas extends ResizableCanvas { graphCoordinateA.getX(), graphCoordinateA.getY(), graphCoordinateB.getX(), - graphCoordinateB.getY() ); - + graphCoordinateB.getY() + ); } /** @@ -198,7 +172,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { drawCircle(graphCoordinate, pointDiameter); } - /** * Display given name and speed of boat at a graph coordinate * @@ -214,7 +187,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { //The text to draw. Built during the function. String text = ""; - //Draw name if annotation is enabled. if (annoName) { text += String.format("%s ", name); @@ -240,7 +212,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { text += timeSinceLastMark; } - //Offset by 20 pixels horizontally. long xCoord = coordinate.getX() + 20; long yCoord = coordinate.getY(); @@ -259,41 +230,36 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.fillText(text, xCoord, yCoord); } - /** * Draws the label for a given boat. Includes name, abbreviation, speed, time since mark, and time to next mark. * @param boat The boat to draw text for. */ private void drawBoatText(VisualiserBoat boat) { - drawText( boat.getName(), boat.getCountry(), boat.getCurrentSpeed(), this.map.convertGPS(boat.getCurrentPosition()), boat.getTimeToNextMarkFormatted(this.visualiserRace.getRaceClock().getCurrentTime()), - boat.getTimeSinceLastMarkFormatted(this.visualiserRace.getRaceClock().getCurrentTime()) ); - + boat.getTimeSinceLastMarkFormatted(this.visualiserRace.getRaceClock().getCurrentTime()) + ); } - - - /** * Draws all of the boats on the canvas. */ private void drawBoats() { - for (VisualiserBoat boat : visualiserRace.getBoats()) { - - //Draw the boat. - drawBoat(boat); + //Draw track. + drawTrack(boat); //Only draw wake if they are currently racing. if (boat.getStatus() == BoatStatusEnum.RACING) { drawWake(boat); } + //Draw the boat. + drawBoat(boat); //If the race hasn't started, we set the time since last mark to the current time, to ensure we don't start counting until the race actually starts. if ((boat.getStatus() != BoatStatusEnum.RACING) && (boat.getStatus() == BoatStatusEnum.FINISHED)) { @@ -302,16 +268,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { //Draw boat label. drawBoatText(boat); - - //Draw track. - drawTrack(boat); - } - } - - /** * Draws a given boat on the canvas. * @param boat The boat to draw. @@ -346,28 +305,66 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.fillPolygon(x, y, 3); gc.restore(); + // TODO: update with current players boat + if (boat.getSourceID() == 125) { + drawSails(boat); + } } - } + /** + * Draws sails for a given boat on the canvas. Sail position is + * determined by the boats heading and the current wind direction + * according to the "points of sail". + * @param boat boat to display sails for + */ + private void drawSails(VisualiserBoat boat) { + GraphCoordinate boatPos = + this.map.convertGPS(boat.getCurrentPosition()); + double xPos = boatPos.getX(); // x pos of sail (on boat) + double yPos = boatPos.getY() - 6; // y pos of sail (on boat) + double boatBearing = boat.getBearing().degrees(); + double windDirection = visualiserRace.getWindDirection().degrees(); + windDirection = 0; // set to 0 for now - will be removed + double sailRotateAngle; // required rotation for correct sail display + Image sailImage; + + gc.save(); + // right half of points of sail + if (boatBearing<180) { + sailImage = sailsRight; + sailRotateAngle = boatBearing * 0.5; // math + xPos -= 1; // right align to boat edge on canvas +// System.out.println("right side -- boat: " + boatBearing + +// "|| rotate: " + sailRotateAngle); + } + // left half of points of sail + else { + sailImage = sailsLeft; + sailRotateAngle = -(360 - boatBearing) * 0.5; // math + xPos -= 5; // left align to boat edge on canvas +// System.out.println("left side -- boat: " + boatBearing + +// "|| rotate: " + sailRotateAngle); + } + + // rotate sails based on boats current heading + rotate(sailRotateAngle, boatPos.getX(), boatPos.getY()); + gc.drawImage(sailImage, xPos, yPos); + gc.restore(); + } /** * Draws the wake for a given boat. * @param boat Boat to draw wake for. */ private void drawWake(VisualiserBoat boat) { - - //Calculate either end of wake line. + // Calculate either end of wake line. GraphCoordinate wakeFrom = this.map.convertGPS(boat.getCurrentPosition()); GraphCoordinate wakeTo = this.map.convertGPS(boat.getWake()); - //Draw. drawLine(wakeFrom, wakeTo, boat.getColor()); - } - - /** * Draws all of the {@link Mark}s on the canvas. */ @@ -377,46 +374,30 @@ public class ResizableRaceCanvas extends ResizableCanvas { } } - /** * Draws a given mark on the canvas. * @param mark The mark to draw. */ private void drawMark(Mark mark) { - - //Calculate screen position. - GraphCoordinate mark1 = this.map.convertGPS(mark.getPosition()); - - //Draw. - drawPoint(mark1, Color.LIMEGREEN); - + GraphCoordinate markToDraw = this.map.convertGPS(mark.getPosition()); + drawPoint(markToDraw, Color.LIMEGREEN); } - - /** * Draws the Race Map. * Called when the canvas is resized. */ public void draw() { - - //Clear canvas. - clear(); + clear(); // clear previous canvas //Update our RaceMap using new canvas size. this.map.setWidth((int) getWidth()); this.map.setHeight((int) getHeight()); - //Redraw the boundary. redrawBoundaryImage(); - - //Draw the race. drawRace(); - - } - /** * Clears the canvas. */ @@ -424,19 +405,16 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.clearRect(0, 0, getWidth(), getHeight()); } - /** * Draws the race boundary, and saves the image to {@link #background}. * You should call {@link #clear()} before calling this. */ private void redrawBoundaryImage() { - //Prepare to draw. gc.setLineWidth(1); gc.setFill(Color.AQUA); gc.drawImage(new Image(getClass().getClassLoader().getResourceAsStream("images/WaterBackground.png")), 0, 0); - //Calculate the screen coordinates of the boundary. List boundary = this.visualiserRace.getBoundary(); double[] xpoints = new double[boundary.size()]; @@ -456,7 +434,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { //Render boundary to image. this.background = snapshot(null, null); - } /** @@ -464,23 +441,14 @@ public class ResizableRaceCanvas extends ResizableCanvas { * Called once per frame, and on canvas resize. */ public void drawRace() { - gc.setLineWidth(2); + clear(); // clear the previous canvas - clear(); - - //Race boundary. drawBoundary(); - - //Boats. drawBoats(); - - //Marks. drawMarks(); - } - /** * Draws the race boundary image onto the canvas. * See {@link #background}. @@ -489,13 +457,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.drawImage(this.background, 0, 0); } - - - - /** - * Draws all track points for a given boat. Colour is set by boat, opacity by track point. - * This checks if {@link #annoPath} is enabled. + * Draws all track points for a given boat. Colour is set by boat, opacity + * by track point. This checks if {@link #annoPath} is enabled. * @param boat The boat to draw tracks for. * @see TrackPoint */ @@ -517,9 +481,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.fillOval(scaledCoordinate.getX(), scaledCoordinate.getY(), point.getDiameter(), point.getDiameter()); } } - } - - } diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java b/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java index 57ba0790..a8fb8d2f 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java @@ -1,7 +1,5 @@ package visualiser.model; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; import javafx.scene.paint.Color; import network.Messages.Enums.BoatStatusEnum; import shared.model.Azimuth; @@ -38,7 +36,7 @@ public class VisualiserBoat extends Boat { /** * The minimum period of time, in milliseconds, between the creation of each track point. */ - private static final long trackPointTimeInterval = 5000; + private static final long trackPointTimeInterval = 500; /** * The number of track points that should be created before fully diminishing the alpha of a given track point. diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserRace.java b/racevisionGame/src/main/java/visualiser/model/VisualiserRace.java index 976a4b6e..dea82284 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserRace.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserRace.java @@ -16,7 +16,6 @@ import shared.dataInput.RegattaDataSource; import shared.model.*; import java.time.Duration; -import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/racevisionGame/src/main/resources/images/sailsLeft.png b/racevisionGame/src/main/resources/images/sailsLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..4f72adf1ea8f711613b5d76952ea95f337798853 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^j-D=#Ar-fh6C9ZSPh<#l+;Qan z{r&1fA-o|a;yOPbALlP$v&vDc!MlS9o086a}GA<$!Ms2XxDM{{BnSW;WwAa V>G$*NU4e!%c)I$ztaD0e0swM8DAxc0 literal 0 HcmV?d00001 diff --git a/racevisionGame/src/main/resources/images/sailsRight.png b/racevisionGame/src/main/resources/images/sailsRight.png new file mode 100644 index 0000000000000000000000000000000000000000..6591f4bef93383318472ca58b7abae267167ccbb GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^uAVNAAr-fhfAq7|{r~s&90T+J ziww+02Q)d2nlxhT|NooY5&G!<{`&HVLJE9gj~#Ah>NZ|3nse@`)C?C%W`4doirv~F ZjI5VM%~P8*ihu?(c)I$ztaD0e0sx_XD#ZW* literal 0 HcmV?d00001 diff --git a/racevisionGame/src/main/resources/visualiser/scenes/arrow.fxml b/racevisionGame/src/main/resources/visualiser/scenes/arrow.fxml index 4057753d..196c4c10 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/arrow.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/arrow.fxml @@ -1,18 +1,13 @@ + - - - - - + - - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml b/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml index f620bfeb..17819c1b 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml @@ -1,12 +1,9 @@ - - - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml index 5657fa30..5a5d1c7b 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml @@ -1,12 +1,9 @@ - - - - + + - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml index 13159bec..d5a1cb3d 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml @@ -1,12 +1,9 @@ - - - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml index 99e802e5..074a9b31 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml @@ -1,9 +1,6 @@ - - - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml index 48870b1f..f448a226 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml @@ -1,12 +1,9 @@ - - - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml b/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml index 2d0477a1..b7aaabcf 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml @@ -1,20 +1,10 @@ - - + + - - - - - - - - - - diff --git a/racevisionGame/src/test/java/mock/model/MockBoatTest.java b/racevisionGame/src/test/java/mock/model/MockBoatTest.java index b1ee551c..390fab35 100644 --- a/racevisionGame/src/test/java/mock/model/MockBoatTest.java +++ b/racevisionGame/src/test/java/mock/model/MockBoatTest.java @@ -1,7 +1,5 @@ package mock.model; -import static org.junit.Assert.*; - public class MockBoatTest { //TODO } diff --git a/racevisionGame/src/test/java/mock/model/MockRaceTest.java b/racevisionGame/src/test/java/mock/model/MockRaceTest.java index cf530665..2e1f0a31 100644 --- a/racevisionGame/src/test/java/mock/model/MockRaceTest.java +++ b/racevisionGame/src/test/java/mock/model/MockRaceTest.java @@ -1,7 +1,5 @@ package mock.model; -import static org.junit.Assert.*; - public class MockRaceTest { //TODO } diff --git a/racevisionGame/src/test/java/mock/model/PolarsTest.java b/racevisionGame/src/test/java/mock/model/PolarsTest.java index 491e5935..ca49172a 100644 --- a/racevisionGame/src/test/java/mock/model/PolarsTest.java +++ b/racevisionGame/src/test/java/mock/model/PolarsTest.java @@ -6,9 +6,7 @@ import org.junit.Before; import org.junit.Test; import shared.model.Bearing; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; /** diff --git a/racevisionGame/src/test/java/mock/model/VMGTest.java b/racevisionGame/src/test/java/mock/model/VMGTest.java index 173df3ee..23cb6e27 100644 --- a/racevisionGame/src/test/java/mock/model/VMGTest.java +++ b/racevisionGame/src/test/java/mock/model/VMGTest.java @@ -4,7 +4,7 @@ import org.junit.Before; import org.junit.Test; import shared.model.Bearing; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; public class VMGTest { diff --git a/racevisionGame/src/test/java/network/BinaryMessageDecoderTest.java b/racevisionGame/src/test/java/network/BinaryMessageDecoderTest.java index 7414d709..cf42c8e2 100644 --- a/racevisionGame/src/test/java/network/BinaryMessageDecoderTest.java +++ b/racevisionGame/src/test/java/network/BinaryMessageDecoderTest.java @@ -13,9 +13,6 @@ import shared.dataInput.XMLReader; import shared.exceptions.XMLReaderException; import javax.xml.transform.TransformerException; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import static org.junit.Assert.fail; diff --git a/racevisionGame/src/test/java/network/Utils/AC35UnitConverterTest.java b/racevisionGame/src/test/java/network/Utils/AC35UnitConverterTest.java index 24fc2be2..801f11cd 100644 --- a/racevisionGame/src/test/java/network/Utils/AC35UnitConverterTest.java +++ b/racevisionGame/src/test/java/network/Utils/AC35UnitConverterTest.java @@ -2,10 +2,7 @@ package network.Utils; import org.junit.Test; -import static network.Utils.AC35UnitConverter.convertGPS; -import static network.Utils.AC35UnitConverter.convertGPSToInt; -import static network.Utils.AC35UnitConverter.convertHeading; -import static network.Utils.AC35UnitConverter.convertTrueWindAngle; +import static network.Utils.AC35UnitConverter.*; import static org.junit.Assert.assertTrue; /** diff --git a/racevisionGame/src/test/java/network/Utils/ByteConverterTest.java b/racevisionGame/src/test/java/network/Utils/ByteConverterTest.java index 32ffc6ee..6621b1eb 100644 --- a/racevisionGame/src/test/java/network/Utils/ByteConverterTest.java +++ b/racevisionGame/src/test/java/network/Utils/ByteConverterTest.java @@ -1,6 +1,5 @@ package network.Utils; -import network.Utils.ByteConverter; import org.junit.Test; import java.nio.ByteOrder; diff --git a/racevisionGame/src/test/java/network/XMLMessageEncoderTest.java b/racevisionGame/src/test/java/network/XMLMessageEncoderTest.java index 44a99997..8109ae39 100644 --- a/racevisionGame/src/test/java/network/XMLMessageEncoderTest.java +++ b/racevisionGame/src/test/java/network/XMLMessageEncoderTest.java @@ -9,9 +9,6 @@ import shared.dataInput.XMLReader; import shared.exceptions.XMLReaderException; import javax.xml.transform.TransformerException; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import static org.junit.Assert.fail; diff --git a/racevisionGame/src/test/java/shared/dataInput/BoatXMLReaderTest.java b/racevisionGame/src/test/java/shared/dataInput/BoatXMLReaderTest.java index 19370be0..129c5950 100644 --- a/racevisionGame/src/test/java/shared/dataInput/BoatXMLReaderTest.java +++ b/racevisionGame/src/test/java/shared/dataInput/BoatXMLReaderTest.java @@ -3,23 +3,17 @@ package shared.dataInput; import org.junit.Before; import org.junit.Test; -import org.xml.sax.SAXException; import shared.enums.XMLFileType; import shared.exceptions.InvalidBoatDataException; import shared.exceptions.XMLReaderException; import shared.model.Boat; import shared.model.Mark; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.TransformerException; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; /** * Created by cbt24 on 10/05/17. diff --git a/racevisionGame/src/test/java/shared/model/AngleTest.java b/racevisionGame/src/test/java/shared/model/AngleTest.java index 6e03e788..4618f21f 100644 --- a/racevisionGame/src/test/java/shared/model/AngleTest.java +++ b/racevisionGame/src/test/java/shared/model/AngleTest.java @@ -1,7 +1,5 @@ package shared.model; -import static org.junit.Assert.*; - public class AngleTest { //TODO } diff --git a/racevisionGame/src/test/java/shared/model/AzimuthTest.java b/racevisionGame/src/test/java/shared/model/AzimuthTest.java index 9a3c3431..dc3be932 100644 --- a/racevisionGame/src/test/java/shared/model/AzimuthTest.java +++ b/racevisionGame/src/test/java/shared/model/AzimuthTest.java @@ -1,7 +1,5 @@ package shared.model; -import static org.junit.Assert.*; - public class AzimuthTest { //TODO } diff --git a/racevisionGame/src/test/java/shared/model/BearingTest.java b/racevisionGame/src/test/java/shared/model/BearingTest.java index 3855e829..876a0deb 100644 --- a/racevisionGame/src/test/java/shared/model/BearingTest.java +++ b/racevisionGame/src/test/java/shared/model/BearingTest.java @@ -1,7 +1,5 @@ package shared.model; -import static org.junit.Assert.*; - public class BearingTest { //TODO } diff --git a/racevisionGame/src/test/java/shared/model/CompoundMarkTest.java b/racevisionGame/src/test/java/shared/model/CompoundMarkTest.java index 5a305bac..44d68905 100644 --- a/racevisionGame/src/test/java/shared/model/CompoundMarkTest.java +++ b/racevisionGame/src/test/java/shared/model/CompoundMarkTest.java @@ -1,7 +1,6 @@ package shared.model; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/racevisionGame/src/test/java/shared/model/MarkTest.java b/racevisionGame/src/test/java/shared/model/MarkTest.java index a78eb512..9c3535ee 100644 --- a/racevisionGame/src/test/java/shared/model/MarkTest.java +++ b/racevisionGame/src/test/java/shared/model/MarkTest.java @@ -1,7 +1,5 @@ package shared.model; -import static org.junit.Assert.*; - public class MarkTest { //TODO } diff --git a/racevisionGame/src/test/java/shared/model/RaceClockTest.java b/racevisionGame/src/test/java/shared/model/RaceClockTest.java index 2dd62ff5..6ad3e8d7 100644 --- a/racevisionGame/src/test/java/shared/model/RaceClockTest.java +++ b/racevisionGame/src/test/java/shared/model/RaceClockTest.java @@ -1,7 +1,5 @@ package shared.model; -import static org.junit.Assert.*; - public class RaceClockTest { //TODO } diff --git a/racevisionGame/src/test/java/visualiser/gameController/GameControllerManualTest.java b/racevisionGame/src/test/java/visualiser/gameController/GameControllerManualTest.java index 6c7c4f81..f01b7abb 100644 --- a/racevisionGame/src/test/java/visualiser/gameController/GameControllerManualTest.java +++ b/racevisionGame/src/test/java/visualiser/gameController/GameControllerManualTest.java @@ -7,7 +7,6 @@ import javafx.scene.Scene; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; -import visualiser.gameController.InputChecker; /** * Start to manually test the game controller diff --git a/racevisionGame/src/test/java/visualiser/model/RaceConnectionTest.java b/racevisionGame/src/test/java/visualiser/model/RaceConnectionTest.java index 02fb463e..85a5a8f7 100644 --- a/racevisionGame/src/test/java/visualiser/model/RaceConnectionTest.java +++ b/racevisionGame/src/test/java/visualiser/model/RaceConnectionTest.java @@ -4,7 +4,6 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** From f6cdf66bfee8c833a29247e3f6cac71e9b18fb21 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Mon, 7 Aug 2017 15:01:16 +1200 Subject: [PATCH 02/18] Sails can be toggled on the visualiser and the rotate sails button rotates the sail visually. #story[1098] --- .../src/main/java/shared/model/Boat.java | 11 +++++++ .../gameController/Keys/SailsToggleKey.java | 13 +++++++- .../visualiser/model/ResizableRaceCanvas.java | 18 +++++++--- .../main/java/visualiser/model/ThisBoat.java | 33 +++++++++++++++++++ 4 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 racevisionGame/src/main/java/visualiser/model/ThisBoat.java diff --git a/racevisionGame/src/main/java/shared/model/Boat.java b/racevisionGame/src/main/java/shared/model/Boat.java index d6e28783..78b4aba6 100644 --- a/racevisionGame/src/main/java/shared/model/Boat.java +++ b/racevisionGame/src/main/java/shared/model/Boat.java @@ -90,6 +90,10 @@ public class Boat { @Nullable private ZonedDateTime timeAtLastMark; + /** + * The state of the boats sails. True if sails are out. + */ + private boolean sailsOut = false; /** * Constructs a boat object with a given sourceID, name, country/team abbreviation, and polars table. @@ -395,4 +399,11 @@ public class Boat { this.timeAtLastMark = timeAtLastMark; } + public void setSailsOut(boolean sailsOut) { + this.sailsOut = sailsOut; + } + + public boolean isSailsOut() { + return sailsOut; + } } diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java index bc9b81a6..d30a7bb8 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java @@ -1,5 +1,7 @@ package visualiser.gameController.Keys; +import visualiser.model.ThisBoat; + /** * Key to toggle the sails */ @@ -19,7 +21,16 @@ public class SailsToggleKey extends ControlKey { */ @Override public void onAction() { - protocolCode = protocolCode == 2? 3 : 2; +// 2 = Sails in +// 3 = Sails out + if (ThisBoat.getInstance().isSailsOut()) { + protocolCode = 3; + ThisBoat.getInstance().setSailsOut(false); + } else { + protocolCode = 2; + ThisBoat.getInstance().setSailsOut(true); + } + } @Override diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index 5078c2d9..e0538b39 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -305,8 +305,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.fillPolygon(x, y, 3); gc.restore(); - // TODO: update with current players boat - if (boat.getSourceID() == 125) { + if (boat.getSourceID() == ThisBoat.getInstance().getSourceID()) { drawSails(boat); } } @@ -331,9 +330,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.save(); // right half of points of sail - if (boatBearing<180) { + if (boatBearing < 180) { sailImage = sailsRight; - sailRotateAngle = boatBearing * 0.5; // math + sailRotateAngle = boatBearing; // math xPos -= 1; // right align to boat edge on canvas // System.out.println("right side -- boat: " + boatBearing + // "|| rotate: " + sailRotateAngle); @@ -341,12 +340,21 @@ public class ResizableRaceCanvas extends ResizableCanvas { // left half of points of sail else { sailImage = sailsLeft; - sailRotateAngle = -(360 - boatBearing) * 0.5; // math + sailRotateAngle = -(360 - boatBearing); // math xPos -= 5; // left align to boat edge on canvas // System.out.println("left side -- boat: " + boatBearing + // "|| rotate: " + sailRotateAngle); } + // Change the angle of the sail if the sail is out + if (ThisBoat.getInstance().isSailsOut()) { + if (boatBearing < 180) { + sailRotateAngle -= 90; + } else { + sailRotateAngle += 90; + } + } + // rotate sails based on boats current heading rotate(sailRotateAngle, boatPos.getX(), boatPos.getY()); gc.drawImage(sailImage, xPos, yPos); diff --git a/racevisionGame/src/main/java/visualiser/model/ThisBoat.java b/racevisionGame/src/main/java/visualiser/model/ThisBoat.java new file mode 100644 index 00000000..a4660d07 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/model/ThisBoat.java @@ -0,0 +1,33 @@ +package visualiser.model; + +/** + * The properties of the boat currently being controlled by the player. Singleton. + */ +public class ThisBoat { + // TODO Initialise sourceID to the sourceID given by the network + private int sourceID = 125; + private boolean sailsOut = false; + private static ThisBoat instance = new ThisBoat(); + + private ThisBoat(){} + + public static ThisBoat getInstance(){ + return instance; + } + + public void setSailsOut(boolean sailsOut) { + this.sailsOut = sailsOut; + } + + public void setSourceID(int sourceID) { + this.sourceID = sourceID; + } + + public boolean isSailsOut() { + return sailsOut; + } + + public int getSourceID() { + return sourceID; + } +} From ace1252c1db76c7921c6d986b4f999be16f5fbfb Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Mon, 7 Aug 2017 17:40:21 +1200 Subject: [PATCH 03/18] Fixed sails so they behave correctly - Changed sail angle calculations back - Luffing currently displays no sail as a temporary representation of sails in #story[1098] --- .../visualiser/model/ResizableRaceCanvas.java | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index e0538b39..fadef653 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -328,32 +328,30 @@ public class ResizableRaceCanvas extends ResizableCanvas { double sailRotateAngle; // required rotation for correct sail display Image sailImage; - gc.save(); - // right half of points of sail - if (boatBearing < 180) { - sailImage = sailsRight; - sailRotateAngle = boatBearing; // math - xPos -= 1; // right align to boat edge on canvas -// System.out.println("right side -- boat: " + boatBearing + -// "|| rotate: " + sailRotateAngle); - } - // left half of points of sail - else { - sailImage = sailsLeft; - sailRotateAngle = -(360 - boatBearing); // math - xPos -= 5; // left align to boat edge on canvas -// System.out.println("left side -- boat: " + boatBearing + -// "|| rotate: " + sailRotateAngle); - } + // remove when method is finished + sailRotateAngle = 0; + sailImage = null; - // Change the angle of the sail if the sail is out + gc.save(); if (ThisBoat.getInstance().isSailsOut()) { - if (boatBearing < 180) { - sailRotateAngle -= 90; - } else { - sailRotateAngle += 90; + if (boatBearing < 180) { // right half of points of sail + sailImage = sailsRight; + sailRotateAngle = boatBearing * 0.5; // math + xPos -= 1; // right align to boat edge on canvas + // System.out.println("right side -- boat: " + boatBearing + + // "|| rotate: " + sailRotateAngle); + } + else { // left half of points of sail + sailImage = sailsLeft; + sailRotateAngle = -(360 - boatBearing) * 0.5; // math + xPos -= 5; // left align to boat edge on canvas + // System.out.println("left side -- boat: " + boatBearing + + // "|| rotate: " + sailRotateAngle); } } + else { +// TODO: display luffing sail + } // rotate sails based on boats current heading rotate(sailRotateAngle, boatPos.getX(), boatPos.getY()); From ce973fecfec2e6e7bef8700b98ad25339fabee07 Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Wed, 9 Aug 2017 21:48:17 +1200 Subject: [PATCH 04/18] Sails are displayed correctly for all wind and active boat directions. - Figured out the different situations that can occur using accurate points of sail - Mathed out the rotation angle for each situation - Manual testing carried out by running simulations - Manual testing carried out using pen and paper #story[1098] --- .../visualiser/model/ResizableRaceCanvas.java | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index fadef653..35242c8d 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -324,38 +324,54 @@ public class ResizableRaceCanvas extends ResizableCanvas { double yPos = boatPos.getY() - 6; // y pos of sail (on boat) double boatBearing = boat.getBearing().degrees(); double windDirection = visualiserRace.getWindDirection().degrees(); - windDirection = 0; // set to 0 for now - will be removed - double sailRotateAngle; // required rotation for correct sail display - Image sailImage; - - // remove when method is finished - sailRotateAngle = 0; - sailImage = null; + double sailRotateAngle = 0; // rotation for correct sail display + Image sailImage = null; + Boolean rightSail = true; + + // Getting the correct Points of Sail + if (ThisBoat.getInstance().isSailsOut()){ + // correct sail and sailRotateAngle start depending on wind+bearing + if ((windDirection + 180) > 360) { + if ((boatBearing < windDirection) && + (boatBearing > windDirection - 180)) { + rightSail = false; + } else { + if (boatBearing < 180) { + sailRotateAngle = -180; + } + } + } else { + if (!((boatBearing > windDirection) && + (boatBearing < windDirection + 180))) { + rightSail = false; + if (boatBearing > 180) { + sailRotateAngle = -180; + } + } + } - gc.save(); - if (ThisBoat.getInstance().isSailsOut()) { - if (boatBearing < 180) { // right half of points of sail + if (rightSail) { sailImage = sailsRight; - sailRotateAngle = boatBearing * 0.5; // math - xPos -= 1; // right align to boat edge on canvas - // System.out.println("right side -- boat: " + boatBearing + - // "|| rotate: " + sailRotateAngle); - } - else { // left half of points of sail + xPos -= 1; // right align sail to boat edge on canvas + } else { sailImage = sailsLeft; - sailRotateAngle = -(360 - boatBearing) * 0.5; // math - xPos -= 5; // left align to boat edge on canvas - // System.out.println("left side -- boat: " + boatBearing + - // "|| rotate: " + sailRotateAngle); + xPos -= 5; // left align sail to boat edge on canvas } } else { -// TODO: display luffing sail + // TODO: display luffing sail } + sailRotateAngle += ((boatBearing + windDirection) * 0.5); +// System.out.println("boat: " + boatBearing + " || rotate: " + +// sailRotateAngle + " || wind angle: " + windDirection); + + gc.save(); + // rotate sails based on boats current heading rotate(sailRotateAngle, boatPos.getX(), boatPos.getY()); gc.drawImage(sailImage, xPos, yPos); + gc.restore(); } From e23f20753d79552c73b4a7eec0828c32bf038b92 Mon Sep 17 00:00:00 2001 From: Joseph Date: Thu, 10 Aug 2017 09:42:59 +1200 Subject: [PATCH 05/18] Merged master. Added commands for sails in and out. Added logic to stop boat from moving when sails are out. Testing if the boat stops with sails out is blocked until command factory is merged. #story[1098] --- .../src/main/java/mock/model/MockRace.java | 2 +- .../model/commandFactory/CommandFactory.java | 2 ++ .../model/commandFactory/SailsInCommand.java | 19 +++++++++++++++++ .../model/commandFactory/SailsOutCommand.java | 21 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java create mode 100644 racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index d0b40ae3..c9222c20 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -321,7 +321,7 @@ public class MockRace extends Race { if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds) { - if (boat.getCurrentSpeed() == 0) { + if (boat.getCurrentSpeed() == 0 && !boat.isSailsOut()) { newOptimalVMG(boat); boat.setBearing(boat.calculateBearingToNextMarker()); } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java index 6e87f11b..003c590e 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java @@ -19,6 +19,8 @@ public class CommandFactory { switch(action) { case AUTO_PILOT: return new VMGCommand(race, boat); case TACK_GYBE: return new TackGybeCommand(race, boat); + case SAILS_IN: return new TackGybeCommand(race, boat); + case SAILS_OUT: return new TackGybeCommand(race, boat); default: return null; // TODO - please please have discussion over what to default to } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java new file mode 100644 index 00000000..551682c3 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java @@ -0,0 +1,19 @@ +package mock.model.commandFactory; + +import mock.model.MockBoat; +import mock.model.MockRace; + +public class SailsInCommand implements Command { + private MockRace race; + private MockBoat boat; + + public SailsInCommand(MockRace race, MockBoat boat) { + this.race = race; + this.boat = boat; + } + + @Override + public void execute() { + this.boat.setSailsOut(false); + } +} diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java new file mode 100644 index 00000000..32486b9d --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java @@ -0,0 +1,21 @@ +package mock.model.commandFactory; + +import mock.model.MockBoat; +import mock.model.MockRace; + +public class SailsOutCommand implements Command { + private MockRace race; + private MockBoat boat; + + public SailsOutCommand(MockRace race, MockBoat boat) { + this.race = race; + this.boat = boat; + } + + @Override + public void execute() { + System.out.println("hi"); + this.boat.setCurrentSpeed(0); + this.boat.setSailsOut(true); + } +} From 1a7152f54edfafb4988106f298fdc883ee477eb4 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 10 Aug 2017 12:32:05 +1200 Subject: [PATCH 06/18] Boats stop when the sails are out. Merged dev. #story[1098] --- racevisionGame/src/main/java/mock/model/MockRace.java | 10 ++++++---- .../java/mock/model/commandFactory/CommandFactory.java | 4 ++-- .../java/mock/model/commandFactory/SailsInCommand.java | 1 + .../mock/model/commandFactory/SailsOutCommand.java | 3 +-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 4672278d..48c55958 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -319,9 +319,9 @@ public class MockRace extends Race { //Checks if the current boat has finished the race or not. boolean finish = this.isLastLeg(boat.getCurrentLeg()); - if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds) { + if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds && !boat.isSailsOut()) { - if (boat.getCurrentSpeed() == 0 && !boat.isSailsOut()) { + if (boat.getCurrentSpeed() == 0) { newOptimalVMG(boat); boat.setBearing(boat.calculateBearingToNextMarker()); } @@ -342,10 +342,12 @@ public class MockRace extends Race { if (boat.isAutoVMG()) { newOptimalVMG(boat); } - - this.updateEstimatedTime(boat); + } else { + boat.setCurrentSpeed(0); } + this.updateEstimatedTime(boat); + } private void newOptimalVMG(MockBoat boat) { diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java index 003c590e..3cdb1085 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java @@ -19,8 +19,8 @@ public class CommandFactory { switch(action) { case AUTO_PILOT: return new VMGCommand(race, boat); case TACK_GYBE: return new TackGybeCommand(race, boat); - case SAILS_IN: return new TackGybeCommand(race, boat); - case SAILS_OUT: return new TackGybeCommand(race, boat); + case SAILS_IN: return new SailsInCommand(race, boat); + case SAILS_OUT: return new SailsOutCommand(race, boat); default: return null; // TODO - please please have discussion over what to default to } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java index 551682c3..2fc6a311 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java @@ -15,5 +15,6 @@ public class SailsInCommand implements Command { @Override public void execute() { this.boat.setSailsOut(false); + System.out.println("hi"); } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java index 32486b9d..79e3648b 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java @@ -14,8 +14,7 @@ public class SailsOutCommand implements Command { @Override public void execute() { - System.out.println("hi"); - this.boat.setCurrentSpeed(0); this.boat.setSailsOut(true); + System.out.println("hi2"); } } From 321dcde72f7e6c2ac5afd6305e237f16cf8179b5 Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Thu, 10 Aug 2017 12:49:00 +1200 Subject: [PATCH 07/18] Implemented luffing sail without image (yet). - Added sailsLuff image property - Displayed luffing sail in correct position and angle #story[1098] --- .../main/java/visualiser/model/ResizableRaceCanvas.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index 7e682abd..c7418f12 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -31,6 +31,8 @@ public class ResizableRaceCanvas extends ResizableCanvas { private Image background; private Image sailsRight = new Image("/images/sailsRight.png"); private Image sailsLeft = new Image("/images/sailsLeft.png"); + // TODO: change to luffing sail image + private Image sailsLuff = new Image("/images/sailsRight.png"); // annotations private boolean annoName = true; @@ -357,12 +359,15 @@ public class ResizableRaceCanvas extends ResizableCanvas { sailImage = sailsLeft; xPos -= 5; // left align sail to boat edge on canvas } + sailRotateAngle += ((boatBearing + windDirection) * 0.5); } else { - // TODO: display luffing sail + xPos -= 3; + sailImage = sailsLuff; + sailImage = null; // TODO: remove line when luffing image added + sailRotateAngle = boatBearing; } - sailRotateAngle += ((boatBearing + windDirection) * 0.5); // System.out.println("boat: " + boatBearing + " || rotate: " + // sailRotateAngle + " || wind angle: " + windDirection); From 20302496f0fd76626b582e6cdf8b77b57c77123a Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 10 Aug 2017 13:14:58 +1200 Subject: [PATCH 08/18] Made SailsInCommand and SailsOutCommand one class. #story[1098] --- .../src/main/java/mock/model/MockBoat.java | 2 +- .../src/main/java/mock/model/MockRace.java | 8 ++++---- .../model/commandFactory/CommandFactory.java | 6 ++++-- ...{SailsInCommand.java => SailsCommand.java} | 9 +++++---- .../model/commandFactory/SailsOutCommand.java | 20 ------------------- 5 files changed, 14 insertions(+), 31 deletions(-) rename racevisionGame/src/main/java/mock/model/commandFactory/{SailsInCommand.java => SailsCommand.java} (52%) delete mode 100644 racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java diff --git a/racevisionGame/src/main/java/mock/model/MockBoat.java b/racevisionGame/src/main/java/mock/model/MockBoat.java index a3332095..6e51295d 100644 --- a/racevisionGame/src/main/java/mock/model/MockBoat.java +++ b/racevisionGame/src/main/java/mock/model/MockBoat.java @@ -33,7 +33,7 @@ public class MockBoat extends Boat { /** * Stores whether the boat is on autoVMG or not */ - private boolean autoVMG = true; + private boolean autoVMG = false; diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 48c55958..496d1299 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -321,10 +321,10 @@ public class MockRace extends Race { if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds && !boat.isSailsOut()) { - if (boat.getCurrentSpeed() == 0) { - newOptimalVMG(boat); - boat.setBearing(boat.calculateBearingToNextMarker()); - } +// if (boat.getCurrentSpeed() == 0) { +// newOptimalVMG(boat); +// boat.setBearing(boat.calculateBearingToNextMarker()); +// } setBoatSpeed(boat); diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java index 3cdb1085..197c4ba7 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java @@ -19,8 +19,10 @@ public class CommandFactory { switch(action) { case AUTO_PILOT: return new VMGCommand(race, boat); case TACK_GYBE: return new TackGybeCommand(race, boat); - case SAILS_IN: return new SailsInCommand(race, boat); - case SAILS_OUT: return new SailsOutCommand(race, boat); + case UPWIND: return new WindCommand(race, boat, true); + case DOWNWIND: return new WindCommand(race, boat, false); + case SAILS_OUT: return new SailsCommand(race, boat, true); + case SAILS_IN: return new SailsCommand(race, boat, false); default: return null; // TODO - please please have discussion over what to default to } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java similarity index 52% rename from racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java rename to racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java index 2fc6a311..7d620a42 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsInCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java @@ -3,18 +3,19 @@ package mock.model.commandFactory; import mock.model.MockBoat; import mock.model.MockRace; -public class SailsInCommand implements Command { +public class SailsCommand implements Command { private MockRace race; private MockBoat boat; + private boolean sailsOut; - public SailsInCommand(MockRace race, MockBoat boat) { + public SailsCommand(MockRace race, MockBoat boat, Boolean sailsOut) { this.race = race; this.boat = boat; + this.sailsOut = sailsOut; } @Override public void execute() { - this.boat.setSailsOut(false); - System.out.println("hi"); + this.boat.setSailsOut(this.sailsOut); } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java deleted file mode 100644 index 79e3648b..00000000 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsOutCommand.java +++ /dev/null @@ -1,20 +0,0 @@ -package mock.model.commandFactory; - -import mock.model.MockBoat; -import mock.model.MockRace; - -public class SailsOutCommand implements Command { - private MockRace race; - private MockBoat boat; - - public SailsOutCommand(MockRace race, MockBoat boat) { - this.race = race; - this.boat = boat; - } - - @Override - public void execute() { - this.boat.setSailsOut(true); - System.out.println("hi2"); - } -} From d8628b42891730d4ccd807d7ff3aec64a5c59126 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 10 Aug 2017 13:25:57 +1200 Subject: [PATCH 09/18] Boats now start the race with sails out. #story[1098] --- racevisionGame/src/main/java/mock/model/MockRace.java | 2 +- racevisionGame/src/main/java/shared/model/Boat.java | 2 +- racevisionGame/src/main/java/visualiser/model/ThisBoat.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 496d1299..b9e655d9 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -319,7 +319,7 @@ public class MockRace extends Race { //Checks if the current boat has finished the race or not. boolean finish = this.isLastLeg(boat.getCurrentLeg()); - if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds && !boat.isSailsOut()) { + if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds && boat.isSailsOut()) { // if (boat.getCurrentSpeed() == 0) { // newOptimalVMG(boat); diff --git a/racevisionGame/src/main/java/shared/model/Boat.java b/racevisionGame/src/main/java/shared/model/Boat.java index 78b4aba6..6fbd5471 100644 --- a/racevisionGame/src/main/java/shared/model/Boat.java +++ b/racevisionGame/src/main/java/shared/model/Boat.java @@ -93,7 +93,7 @@ public class Boat { /** * The state of the boats sails. True if sails are out. */ - private boolean sailsOut = false; + private boolean sailsOut = true; /** * Constructs a boat object with a given sourceID, name, country/team abbreviation, and polars table. diff --git a/racevisionGame/src/main/java/visualiser/model/ThisBoat.java b/racevisionGame/src/main/java/visualiser/model/ThisBoat.java index a4660d07..e7f1675f 100644 --- a/racevisionGame/src/main/java/visualiser/model/ThisBoat.java +++ b/racevisionGame/src/main/java/visualiser/model/ThisBoat.java @@ -6,7 +6,7 @@ package visualiser.model; public class ThisBoat { // TODO Initialise sourceID to the sourceID given by the network private int sourceID = 125; - private boolean sailsOut = false; + private boolean sailsOut = true; private static ThisBoat instance = new ThisBoat(); private ThisBoat(){} From 0558629dc698196e3f3ac7b5aa94515a7ae275ab Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Mon, 14 Aug 2017 10:42:28 +1200 Subject: [PATCH 10/18] Added luffing sails image. - Created transparent gif of luffing sail - Displayed image when sail is luffing - Repositioned luffing sail #story[1098] --- .../visualiser/model/ResizableRaceCanvas.java | 13 +++++-------- .../src/main/resources/images/sailsLuff.gif | Bin 0 -> 4352 bytes 2 files changed, 5 insertions(+), 8 deletions(-) create mode 100644 racevisionGame/src/main/resources/images/sailsLuff.gif diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index c7418f12..736294d9 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -31,8 +31,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { private Image background; private Image sailsRight = new Image("/images/sailsRight.png"); private Image sailsLeft = new Image("/images/sailsLeft.png"); - // TODO: change to luffing sail image - private Image sailsLuff = new Image("/images/sailsRight.png"); + private Image sailsLuff = new Image("/images/sailsLuff.gif", 25, 10, false, false); // annotations private boolean annoName = true; @@ -361,16 +360,14 @@ public class ResizableRaceCanvas extends ResizableCanvas { } sailRotateAngle += ((boatBearing + windDirection) * 0.5); } + // Sails in = luffing sail else { - xPos -= 3; + xPos -= 6; + yPos += 1; sailImage = sailsLuff; - sailImage = null; // TODO: remove line when luffing image added - sailRotateAngle = boatBearing; + sailRotateAngle = boatBearing + 90; } -// System.out.println("boat: " + boatBearing + " || rotate: " + -// sailRotateAngle + " || wind angle: " + windDirection); - gc.save(); // rotate sails based on boats current heading diff --git a/racevisionGame/src/main/resources/images/sailsLuff.gif b/racevisionGame/src/main/resources/images/sailsLuff.gif new file mode 100644 index 0000000000000000000000000000000000000000..924023ba455ddebd2a8e2dcd91265e96e2a7f73d GIT binary patch literal 4352 zcmbu?YdD+fx(D!3BuyxK7;?~J93w*oElDssS|lhloz}6=8gVFVT8E%*%qk5bbm|zP zj1qC~)=G#Dot7k2)v6NIU@1cD(5)nj+0353*Is+NuC=b^{q%fzKmD%zdH(;~!Rd^p zRX`p94Y&aS{QBFc^((~n^to@ovU59)Ha@;j1^@tPN#*u~0Wtv8&Ka=#GeCBmMz8L9 zr~G4a^GL>jjPpJ!r%pNM%}^`ng%1}Y-S3@;)-q=|`qobZ6v33%GF5-OS6R;5b%F}H zkbY7vI2RP)QB%XXsqQ(k$fhMDz9pKmnNjvziHPsSeo&Mn&K8jaz=cKjSfr8BgB}ug1*ST> zAnghFp`mE(;`pjzfRTcawr)5prD>2X_*Z$c*BX7(-zHr zAVS3_9Sf<2pw=?0u()b|0H%y>M;5Lk?+BsbQ6ah8aN{(bLYQQ)eq0!3gzxBOBz^gI zqPW+m7S|4GH%ulZb9|W^2tbrfpTz3IxS>r}U)=$eD2}PRv~A_P9y#Fo>4l0?t|^j@H~Jak}C6Evl70emq{;rn;n z&2?C^B%C9YEG_Qc1dxZ=f|Ah5H5?Ha2C##vb|b72{W}6LnKnF}lxUvrJ<1>^LcB=R z*y0UrVKJlk$y=U!v2Jo$D`J8)2^Mu)zYdqEZZjhzE;vMH9q=tkZGS|NeSVa`ZgZBK zX0nj#@Terv&n9_nV(Yj;sykB+pq%oZ{$E|51SRlXn)%r!_qDYA?$%P%ban1ivyu4DpO-l7TGw=-7(!#4~b9w}o@dKeT2if?$@6|$VBL?CJ>6iJpX3d7qK zv0Gvt?$y}@_IpI zd=+W4>Ul9P{b=z0zF2P7%r0We>{u??wH*YJsr2oj2zWi_?$G=;PRl%{G99E%H3M>;|$i)a6 z_luws!yK`S*Icf}xbDns~>hVwEudvHouClD@M;4P{( z=k%ycgrUvRE{UTt$8nrC+?NBiMPC1`#Pf1yzVf@RpBt!hUtSn$eh0r5s>!@8_jEdl za-3pw>pkb?Xjf%A90^Uphg?a?3WDkS>5YJ>x*--{A^#ANxWxHA=^g%*-gmFgc{S93 z(E@)-u4Xqqu((ptQvHEj9Lf<@NI6I`_-;94YCw0(S+d2E-EtOrQ+csFJFcF_E`FEa1;^Xsp8HYp&uz8z6s`s3KE7*nTH%MWAk#)*yUC&CY3!Ao^watQ zi|D|yVImk!u$9{E*W|V)bQv`4jiMEcif9OSHtjs{@pxrw+=Qk&zM;!n*9CW!z4w zCJc;$o(mw`Vc4zU_0LyfshwV8JSAMy8^Wkr@W;wHR}K@f&WKvx+~`D|3($^5UDg6e;3Rh`qWh2;jcxT>wk zZ>49}#5{~}^*&2#WWNsmS-?st4vx!ze@ZWQ^=jjT?xAHMniH-5_>IH*mp47+O%0)f zW#awfE@!{AvGb<1g{M6n-Q-Tf@)0yMAXArfJb0yqfg)0 z^!uz7tGE=PtRs_nlG}6fnbtiTUF#ClYo7&;0}CFl-idmgrDNgh<6+)iJhX52=~9sY z8A8$ZSIuRIzH)nM1)n^KIrnO@>~C?Y^tV=VcrR6dp+i|wHtF$Hy?U@_X7j!OoC!W! z{#e}t)23ZD@=MLf&6L8R1~zSHoV*WXi^)BdDk(auH2;0vp`V2JEWZ9M{=xdm3LTJa zCD8z#n*C~d?uC4lBt{IHa}(r9Ra#AjVS4yM_jzgc3n5-@#j7d32v5f5=$Q75W=M?~ z1l0ws6G9P3OLAtg+G@v=+zExWFn8wNXShg>NKx9u84=Om^hYyj#-|dq)!BUy)3k%N zDwFoJMvl7GHc2=$FoVOCH?gjUMxyKMQ7sFDNM6nH!jMYs$JMLccd_-NN=aK(K78Qb zX7Y5^LkG2~SpQdQ29^ciIuu)$=gst<) zN)ah$B-&`D$eh5yg(A@u?jnB++=NVntsU>$(gbhSJEhBpD?xtpj+* zT^V(G<)Yk(L6$EBt9cAiVb@TBPuq9l|L>GLd(oz}d@p`CltJJ$TTOSO-9T3FWSyW` zC8(bi9U6HitD*MD%*|8H?8cUmddw5nD)()u$;(Q~$KWcXM-`jxOZsWq7CV0D5Ashs zf>JEk*K@jd{N_|o#8N#IJh2n@p!96%4 Date: Mon, 14 Aug 2017 12:41:21 +1200 Subject: [PATCH 11/18] Fixed first key press not working. #story[1098] --- racevisionGame/src/main/java/mock/model/MockRace.java | 7 +------ .../main/java/visualiser/Controllers/RaceController.java | 2 +- .../java/visualiser/gameController/ControllerServer.java | 2 +- .../visualiser/gameController/Keys/SailsToggleKey.java | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index b9e655d9..89c8ec7c 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -319,12 +319,7 @@ public class MockRace extends Race { //Checks if the current boat has finished the race or not. boolean finish = this.isLastLeg(boat.getCurrentLeg()); - if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds && boat.isSailsOut()) { - -// if (boat.getCurrentSpeed() == 0) { -// newOptimalVMG(boat); -// boat.setBearing(boat.calculateBearingToNextMarker()); -// } + if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds & boat.isSailsOut()) { setBoatSpeed(boat); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index a7985c6e..e77526d4 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -111,8 +111,8 @@ public class RaceController extends Controller { ControlKey controlKey = keyFactory.getKey(codeString); if(controlKey != null) { try { - controllerClient.sendKey(controlKey); controlKey.onAction(); // Change key state if applicable + controllerClient.sendKey(controlKey); event.consume(); } catch (IOException e) { e.printStackTrace(); diff --git a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java index fccb037c..1acfadba 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java +++ b/racevisionGame/src/main/java/visualiser/gameController/ControllerServer.java @@ -67,8 +67,8 @@ public class ControllerServer extends Observable implements Runnable { action = boatActionDecoder.getBoatAction(); // Notify observers of most recent action - this.notifyObservers(); this.setChanged(); + this.notifyObservers(); } } catch (IOException e) { e.printStackTrace(); diff --git a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java index 9d4a0bd8..f1e4d65b 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java +++ b/racevisionGame/src/main/java/visualiser/gameController/Keys/SailsToggleKey.java @@ -14,7 +14,7 @@ public class SailsToggleKey extends ControlKey { * */ public SailsToggleKey(String name) { - super(name, BoatActionEnum.SAILS_IN); + super(name, BoatActionEnum.NOT_A_STATUS); } /** From 47fc55245c9e9fb199cca581f9ddecc72a9b06a1 Mon Sep 17 00:00:00 2001 From: Joseph Date: Thu, 17 Aug 2017 09:27:41 +1200 Subject: [PATCH 12/18] Merged master. --- .../src/main/java/mock/model/MockRace.java | 14 +++++--------- .../model/commandFactory/CommandFactory.java | 2 ++ .../visualiser/model/ResizableRaceCanvas.java | 5 +++-- .../main/java/visualiser/model/ThisBoat.java | 18 ++++++++---------- .../visualiser/model/VisualiserRaceState.java | 1 + 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 3879e3fc..db20371d 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -313,14 +313,7 @@ public class MockRace extends Race { //Checks if the current boat has finished the race or not. boolean finish = this.isLastLeg(boat.getCurrentLeg()); - if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds) { - - checkPosition(boat, totalElapsedMilliseconds); - - if (boat.getCurrentSpeed() == 0) { - newOptimalVMG(boat); - boat.setBearing(boat.calculateBearingToNextMarker()); - } + if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds & boat.isSailsOut()) { setBoatSpeed(boat); @@ -339,9 +332,12 @@ public class MockRace extends Race { newOptimalVMG(boat); } - this.updateEstimatedTime(boat); + } else { + boat.setCurrentSpeed(0); } + this.updateEstimatedTime(boat); + } private void newOptimalVMG(MockBoat boat) { diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java index 4edb87c5..6c2224ec 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CommandFactory.java @@ -33,6 +33,8 @@ public class CommandFactory { case TACK_GYBE: return new TackGybeCommand(race, boat); case UPWIND: return new WindCommand(race, boat, true); case DOWNWIND: return new WindCommand(race, boat, false); + case SAILS_OUT: return new SailsCommand(race, boat, true); + case SAILS_IN: return new SailsCommand(race, boat, false); default: throw new CommandConstructionException("Could not create command for BoatAction: " + action + ". Unknown BoatAction."); } diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index dce6766a..8daea0b5 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -342,13 +342,13 @@ public class ResizableRaceCanvas extends ResizableCanvas { double[] x = { pos.getX() - 9, pos.getX(), - pos.getX() + 9 }; + pos.getX() + 9}; //The y coordinates of each vertex of the boat. double[] y = { pos.getY() + 15, pos.getY() - 15, - pos.getY() + 15 }; + pos.getY() + 15}; //The above shape is essentially a triangle 24px wide, and 48 long. @@ -359,6 +359,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { rotate(boat.getBearing().degrees(), pos.getX(), pos.getY()); gc.fillPolygon(x, y, 3); gc.restore(); + } /** * Draws sails for a given boat on the canvas. Sail position is diff --git a/racevisionGame/src/main/java/visualiser/model/ThisBoat.java b/racevisionGame/src/main/java/visualiser/model/ThisBoat.java index e7f1675f..91396902 100644 --- a/racevisionGame/src/main/java/visualiser/model/ThisBoat.java +++ b/racevisionGame/src/main/java/visualiser/model/ThisBoat.java @@ -4,9 +4,7 @@ package visualiser.model; * The properties of the boat currently being controlled by the player. Singleton. */ public class ThisBoat { - // TODO Initialise sourceID to the sourceID given by the network - private int sourceID = 125; - private boolean sailsOut = true; + private VisualiserBoat boat; private static ThisBoat instance = new ThisBoat(); private ThisBoat(){} @@ -16,18 +14,18 @@ public class ThisBoat { } public void setSailsOut(boolean sailsOut) { - this.sailsOut = sailsOut; - } - - public void setSourceID(int sourceID) { - this.sourceID = sourceID; + this.boat.setSailsOut(sailsOut); } public boolean isSailsOut() { - return sailsOut; + return this.boat.isSailsOut(); } public int getSourceID() { - return sourceID; + return this.boat.getSourceID(); + } + + public void setBoat(VisualiserBoat boat) { + this.boat = boat; } } diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceState.java b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceState.java index b1767cd5..b58313b9 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceState.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceState.java @@ -206,6 +206,7 @@ public class VisualiserRaceState extends RaceState { if (boat.getSourceID() == getPlayerBoatID()) { boat.setClientBoat(true); + ThisBoat.getInstance().setBoat(boat); } } From d7e0bfa86cf9486c8838a77f8eb4ee0e3dad1af7 Mon Sep 17 00:00:00 2001 From: Joseph Date: Thu, 17 Aug 2017 10:13:30 +1200 Subject: [PATCH 13/18] Trackpoints are only shown for the player's boat. #story[1098] --- .../BoatLocationCommand.java | 3 +- .../visualiser/model/ResizableRaceCanvas.java | 98 ++++++++++++++----- 2 files changed, 77 insertions(+), 24 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/BoatLocationCommand.java b/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/BoatLocationCommand.java index d2c60bd7..77748801 100644 --- a/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/BoatLocationCommand.java +++ b/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/BoatLocationCommand.java @@ -7,6 +7,7 @@ import shared.exceptions.BoatNotFoundException; import shared.exceptions.MarkNotFoundException; import shared.model.GPSCoordinate; import shared.model.Mark; +import visualiser.model.ThisBoat; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRaceEvent; import visualiser.model.VisualiserRaceState; @@ -95,7 +96,7 @@ public class BoatLocationCommand implements Command { * @param boat The boat to add a track point to. */ private void attemptAddTrackPoint(VisualiserBoat boat) { - if (boat.getStatus() == BoatStatusEnum.RACING) { + if (boat.getStatus() == BoatStatusEnum.RACING && boat.getSourceID() == ThisBoat.getInstance().getSourceID()) { boat.addTrackPoint(boat.getCurrentPosition(), visualiserRace.getRaceClock().getCurrentTime()); } } diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index 8daea0b5..693b6d39 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -27,8 +27,11 @@ import java.util.List; */ public class ResizableRaceCanvas extends ResizableCanvas { - private RaceMap map; // for converting GPSCoordinates to GraphCoordinates - private Image background; + /** + * The RaceMap used for converting GPSCoordinates to GraphCoordinates. + */ + private RaceMap map; + private Image sailsRight = new Image("/images/sailsRight.png"); private Image sailsLeft = new Image("/images/sailsLeft.png"); private Image sailsLuff = new Image("/images/sailsLuff.gif", 25, 10, false, false); @@ -47,12 +50,15 @@ public class ResizableRaceCanvas extends ResizableCanvas { private boolean annoTimeSinceLastMark = true; private boolean annoGuideLine = false; + + /** * Constructs a {@link ResizableRaceCanvas} using a given {@link VisualiserRaceEvent}. * @param visualiserRace The race that data is read from in order to be drawn. */ public ResizableRaceCanvas(VisualiserRaceEvent visualiserRace) { super(); + this.visualiserRace = visualiserRace; RaceDataSource raceData = visualiserRace.getVisualiserRaceState().getRaceDataSource(); @@ -63,9 +69,14 @@ public class ResizableRaceCanvas extends ResizableCanvas { double long2 = raceData.getMapBottomRight().getLongitude(); this.map = new RaceMap( - lat1, long1, lat2, long2, (int)getWidth(), (int)getHeight()); + lat1, long1, lat2, long2, + (int) getWidth(), (int) getHeight() ); + + } + + /** * Toggle name display in annotation */ @@ -116,8 +127,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { /** - * Rotates things displayed on the canvas. Note: this must be called in - * between gc.save() and gc.restore() else they will rotate everything + * Rotates things on the canvas Note: this must be called in between gc.save() and gc.restore() else they will rotate everything * * @param degrees Bearing degrees to rotate. * @param px Pivot point x of rotation. @@ -128,6 +138,8 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy()); } + + /** * Draws a circle with a given diameter, centred on a given graph coordinate. * @param center The center coordinate of the circle. @@ -139,8 +151,8 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.fillOval( center.getX() - (diameter / 2), center.getY() - (diameter / 2), - diameter, diameter - ); + diameter, diameter ); + } /** @@ -155,6 +167,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.setStroke(paint); gc.setFill(paint); + double endPointDiameter = 6; //Draw first end-point. @@ -168,8 +181,8 @@ public class ResizableRaceCanvas extends ResizableCanvas { graphCoordinateA.getX(), graphCoordinateA.getY(), graphCoordinateB.getX(), - graphCoordinateB.getY() - ); + graphCoordinateB.getY() ); + } /** @@ -189,6 +202,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { drawCircle(graphCoordinate, pointDiameter); } + /** * Display given name and speed of boat at a graph coordinate * @@ -204,6 +218,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { //The text to draw. Built during the function. String text = ""; + //Draw name if annotation is enabled. if (annoName) { text += String.format("%s ", name); @@ -229,6 +244,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { text += timeSinceLastMark; } + //Offset by 20 pixels horizontally. long xCoord = coordinate.getX() + 20; long yCoord = coordinate.getY(); @@ -247,11 +263,13 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.fillText(text, xCoord, yCoord); } + /** * Draws the label for a given boat. Includes name, abbreviation, speed, time since mark, and time to next mark. * @param boat The boat to draw text for. */ private void drawBoatText(VisualiserBoat boat) { + drawText( boat.getName(), boat.getCountry(), @@ -259,8 +277,12 @@ public class ResizableRaceCanvas extends ResizableCanvas { this.map.convertGPS(boat.getCurrentPosition()), boat.getTimeToNextMarkFormatted(this.visualiserRace.getVisualiserRaceState().getRaceClock().getCurrentTime()), boat.getTimeSinceLastMarkFormatted(this.visualiserRace.getVisualiserRaceState().getRaceClock().getCurrentTime()) ); + } + + + /** * Draws all of the boats on the canvas. */ @@ -276,8 +298,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { drawWake(boat); } - //Draw the boat. - drawBoat(boat); //If the race hasn't started, we set the time since last mark to the current time, to ensure we don't start counting until the race actually starts. if ((boat.getStatus() != BoatStatusEnum.RACING) && (boat.getStatus() == BoatStatusEnum.FINISHED)) { @@ -286,7 +306,12 @@ public class ResizableRaceCanvas extends ResizableCanvas { //Draw boat label. drawBoatText(boat); + + //Draw track. + drawTrack(boat); + } + } /** @@ -306,13 +331,13 @@ public class ResizableRaceCanvas extends ResizableCanvas { double[] x = { pos.getX() - 6, pos.getX(), - pos.getX() + 6}; + pos.getX() + 6 }; //The y coordinates of each vertex of the boat. double[] y = { pos.getY() + 12, pos.getY() - 12, - pos.getY() + 12}; + pos.getY() + 12 }; //The above shape is essentially a triangle 12px wide, and 24px long. @@ -342,13 +367,13 @@ public class ResizableRaceCanvas extends ResizableCanvas { double[] x = { pos.getX() - 9, pos.getX(), - pos.getX() + 9}; + pos.getX() + 9 }; //The y coordinates of each vertex of the boat. double[] y = { pos.getY() + 15, pos.getY() - 15, - pos.getY() + 15}; + pos.getY() + 15 }; //The above shape is essentially a triangle 24px wide, and 48 long. @@ -359,6 +384,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { rotate(boat.getBearing().degrees(), pos.getX(), pos.getY()); gc.fillPolygon(x, y, 3); gc.restore(); + } /** @@ -431,13 +457,18 @@ public class ResizableRaceCanvas extends ResizableCanvas { * @param boat Boat to draw wake for. */ private void drawWake(VisualiserBoat boat) { - // Calculate either end of wake line. + + //Calculate either end of wake line. GraphCoordinate wakeFrom = this.map.convertGPS(boat.getCurrentPosition()); GraphCoordinate wakeTo = this.map.convertGPS(boat.getWake()); + //Draw. drawLine(wakeFrom, wakeTo, boat.getColor()); + } + + /** * Draws all of the {@link Mark}s on the canvas. */ @@ -448,21 +479,31 @@ public class ResizableRaceCanvas extends ResizableCanvas { } } + /** * Draws a given mark on the canvas. * @param mark The mark to draw. */ private void drawMark(Mark mark) { - GraphCoordinate markToDraw = this.map.convertGPS(mark.getPosition()); - drawPoint(markToDraw, Color.LIMEGREEN); + + //Calculate screen position. + GraphCoordinate mark1 = this.map.convertGPS(mark.getPosition()); + + //Draw. + drawPoint(mark1, Color.LIMEGREEN); + } + + /** * Draws the Race Map. * Called when the canvas is resized. */ public void draw() { - clear(); // clear previous canvas + + //Clear canvas. + clear(); //Update our RaceMap using new canvas size. this.map.setWidth((int) getWidth()); @@ -473,6 +514,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { } + /** * Clears the canvas. */ @@ -480,6 +522,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.clearRect(0, 0, getWidth(), getHeight()); } + /** * Draws the race boundary. */ @@ -520,8 +563,10 @@ public class ResizableRaceCanvas extends ResizableCanvas { this.map.setGPSBotRight(visualiserRace.getVisualiserRaceState().getRaceDataSource().getMapBottomRight()); gc.setLineWidth(2); - clear(); // clear the previous canvas + clear(); + + //Race boundary. drawBoundary(); //Guiding Line @@ -531,7 +576,10 @@ public class ResizableRaceCanvas extends ResizableCanvas { //Boats. drawBoats(); + + //Marks. drawMarks(); + } /** @@ -671,9 +719,10 @@ public class ResizableRaceCanvas extends ResizableCanvas { + /** - * Draws all track points for a given boat. Colour is set by boat, opacity - * by track point. This checks if {@link #annoPath} is enabled. + * Draws all track points for a given boat. Colour is set by boat, opacity by track point. + * This checks if {@link #annoPath} is enabled. * @param boat The boat to draw tracks for. * @see TrackPoint */ @@ -694,6 +743,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.fillOval(scaledCoordinate.getX(), scaledCoordinate.getY(), point.getDiameter(), point.getDiameter()); } } + } -} + + +} \ No newline at end of file From a50d460222772ea64863c3da445dd6b9c39e17e8 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 17 Aug 2017 13:02:14 +1200 Subject: [PATCH 14/18] Merged master. --- .../src/main/java/visualiser/model/ResizableRaceCanvas.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index e5567b7e..6f94b40f 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -395,7 +395,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { */ private void drawSails(VisualiserBoat boat) { GraphCoordinate boatPos = - this.map.convertGPS(boat.getCurrentPosition()); + this.map.convertGPS(boat.getPosition()); double xPos = boatPos.getX(); // x pos of sail (on boat) double yPos = boatPos.getY() - 6; // y pos of sail (on boat) double boatBearing = boat.getBearing().degrees(); From 37fe7389fff5974e45f02f1faa515be7dd60cedd Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 17 Aug 2017 13:55:33 +1200 Subject: [PATCH 15/18] Rounding marks works. --- racevisionGame/src/main/java/mock/model/MockRace.java | 7 ++++--- racevisionGame/src/main/java/mock/model/RaceLogic.java | 10 +++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 72196be7..56317c78 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -299,7 +299,6 @@ public class MockRace extends Race { } - /** * Calculates the distance a boat has travelled and updates its current position according to this value. * @@ -314,6 +313,8 @@ public class MockRace extends Race { if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds & boat.isSailsOut()) { + checkPosition(boat, totalElapsedMilliseconds); + setBoatSpeed(boat); //Calculates the distance travelled, in meters, in the current timeslice. @@ -515,7 +516,7 @@ public class MockRace extends Race { if (boat.isStarboardSide(roundingMark) && GPSCoordinate.passesLine(roundingMark.getPosition(), roundingChecks.get(0), boat.getPosition(), legBearing) && - gateCheck && + gateCheck && boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(0)))) { boat.increaseRoundingStatus(); if (boat.getCurrentLeg().getLegNumber() + 2 >= legs.size()){ @@ -699,4 +700,4 @@ public class MockRace extends Race { -} +} \ No newline at end of file diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index a3560bbd..5f0c4191 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -180,9 +180,9 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { public void update(Observable o, Object arg) { Collision e = (Collision)arg; - if(e.getBearing().degrees() == 0) System.out.println("Ahead"); - else if(e.getBearing().degrees() < 90) System.out.println("Starboard"); - else if(e.getBearing().degrees() > 270) System.out.println("Port"); - else System.out.println("Behind"); +// if(e.getBearing().degrees() == 0) System.out.println("Ahead"); +// else if(e.getBearing().degrees() < 90) System.out.println("Starboard"); +// else if(e.getBearing().degrees() > 270) System.out.println("Port"); +// else System.out.println("Behind"); } -} +} \ No newline at end of file From e26fb736274e646500eebf32dacc3ed9e087ffeb Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 17 Aug 2017 16:08:23 +1200 Subject: [PATCH 16/18] Merged master. --- .../src/main/java/shared/dataInput/RaceXMLReader.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java b/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java index 772815d3..c2faea69 100644 --- a/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java +++ b/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java @@ -9,10 +9,7 @@ import shared.enums.RoundingType; import shared.enums.XMLFileType; import shared.exceptions.InvalidRaceDataException; import shared.exceptions.XMLReaderException; -import shared.model.CompoundMark; -import shared.model.GPSCoordinate; -import shared.model.Leg; -import shared.model.Mark; +import shared.model.*; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; From dcd1df2999d39bfa1b631fc6adf3ae27f9b9d4f0 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 17 Aug 2017 16:26:00 +1200 Subject: [PATCH 17/18] Merged master. --- racevisionGame/src/main/java/mock/app/Event.java | 1 - 1 file changed, 1 deletion(-) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 7d1ec47d..47696875 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -87,7 +87,6 @@ public class Event { //Read XML files. try { this.raceXML = RaceXMLCreator.alterRaceToWind(raceXMLFile, 90); - //this.raceXML = XMLReader.readXMLFileToString(raceXMLFile, StandardCharsets.UTF_8); this.boatXML = XMLReader.readXMLFileToString(boatsXMLFile, StandardCharsets.UTF_8); this.regattaXML = XMLReader.readXMLFileToString(regattaXMLFile, StandardCharsets.UTF_8); From 5ba6f526690df1a665fbafcff9be9fd0489a5ab2 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Thu, 17 Aug 2017 16:50:13 +1200 Subject: [PATCH 18/18] fixed autovmg. --- racevisionGame/src/main/java/mock/model/MockRace.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 1ca2407b..379123af 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -321,6 +321,11 @@ public class MockRace extends Race { checkPosition(boat, totalElapsedMilliseconds); + if (boat.getCurrentSpeed() == 0) { + newOptimalVMG(boat); + boat.setBearing(boat.calculateBearingToNextMarker()); + } + setBoatSpeed(boat); //Calculates the distance travelled, in meters, in the current timeslice.