From 5b6b0a99788a02fd6a91ea260507f3da9a400b02 Mon Sep 17 00:00:00 2001 From: hba56 Date: Tue, 29 Aug 2017 12:57:19 +1200 Subject: [PATCH 01/92] added the new program for holding known games #stroy[1188] --- matchBrowser/pom.xml | 82 +++++++++++++++++++ matchBrowser/src/main/java/app/Main.java | 7 ++ .../src/main/java/model/MatchTable.java | 34 ++++++++ .../src/main/java/model/TableKey.java | 30 +++++++ .../java/networkInterface/InInterface.java | 46 +++++++++++ .../java/networkInterface/OutInterface.java | 7 ++ .../src/test/java/model/MatchTableTest.java | 27 ++++++ 7 files changed, 233 insertions(+) create mode 100644 matchBrowser/pom.xml create mode 100644 matchBrowser/src/main/java/app/Main.java create mode 100644 matchBrowser/src/main/java/model/MatchTable.java create mode 100644 matchBrowser/src/main/java/model/TableKey.java create mode 100644 matchBrowser/src/main/java/networkInterface/InInterface.java create mode 100644 matchBrowser/src/main/java/networkInterface/OutInterface.java create mode 100644 matchBrowser/src/test/java/model/MatchTableTest.java diff --git a/matchBrowser/pom.xml b/matchBrowser/pom.xml new file mode 100644 index 00000000..fb8cabe9 --- /dev/null +++ b/matchBrowser/pom.xml @@ -0,0 +1,82 @@ + + + + team-7 + seng302 + 2.0 + + 4.0.0 + + + jar + matchBrowser + matchBrowser + 2.0 + + + + junit + junit + 4.12 + test + + + + + org.mockito + mockito-all + 1.9.5 + + + + org.testng + testng + 6.11 + test + + + + + 1.8 + 1.8 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + + + app.Main + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + package + + shade + + + + + + + + \ No newline at end of file diff --git a/matchBrowser/src/main/java/app/Main.java b/matchBrowser/src/main/java/app/Main.java new file mode 100644 index 00000000..e189c052 --- /dev/null +++ b/matchBrowser/src/main/java/app/Main.java @@ -0,0 +1,7 @@ +package app; + +/** + * Used when starting the matchmaking browser + */ +public class Main { +} diff --git a/matchBrowser/src/main/java/model/MatchTable.java b/matchBrowser/src/main/java/model/MatchTable.java new file mode 100644 index 00000000..d2798939 --- /dev/null +++ b/matchBrowser/src/main/java/model/MatchTable.java @@ -0,0 +1,34 @@ +package model; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Holds a table object that stores current games + */ +public class MatchTable { + private HashMap matchTable; + + public MatchTable() { + this.matchTable = new HashMap(); + } + + public void addEntry(ArrayList newEntry) { + //create a key from the ip and port + TableKey entryKey = new TableKey((String) newEntry.get(0), (Integer) newEntry.get(1)); + + //get the rest of the entry and use it as the value + List entryItems = new ArrayList(); + for(int i = 2; i getMatchTable() { + return matchTable; + } +} diff --git a/matchBrowser/src/main/java/model/TableKey.java b/matchBrowser/src/main/java/model/TableKey.java new file mode 100644 index 00000000..6b803fd9 --- /dev/null +++ b/matchBrowser/src/main/java/model/TableKey.java @@ -0,0 +1,30 @@ +package model; + +/** + * Used to create a key made of an ip and port. + */ +public class TableKey { + + private final String ip; + private final int port; + + public TableKey(String ip, int port) { + this.ip = ip; + this.port = port; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TableKey)) return false; + TableKey key = (TableKey) o; + return ip == key.ip && port == key.port; + } + + @Override + public int hashCode() { + int result = port; + result = 31 * result + ip.hashCode(); + return result; + } +} diff --git a/matchBrowser/src/main/java/networkInterface/InInterface.java b/matchBrowser/src/main/java/networkInterface/InInterface.java new file mode 100644 index 00000000..5d729e08 --- /dev/null +++ b/matchBrowser/src/main/java/networkInterface/InInterface.java @@ -0,0 +1,46 @@ +package networkInterface; + +import java.io.*; +import java.net.*; + +/** + * Holds the output for the network for + */ +public class InInterface { + private DatagramSocket serverSocket; + private byte[] receiveData = new byte[1024]; + private byte[] sendData = new byte[1024]; + + public InInterface(){ + try { + this.serverSocket = new DatagramSocket(3779); + + this.run(); + } catch (IOException e) { + System.err.println("Error listening on port: " + this.serverSocket.getLocalPort() + "."); + System.exit(-1); + } + + } + + private void run() throws IOException{ + while(true) { + DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); + serverSocket.receive(receivePacket); + + //decode and update table + + //client ip and port + InetAddress IPAddress = receivePacket.getAddress(); + int port = receivePacket.getPort(); + + + +// String capitalizedSentence = sentence.toUpperCase(); +// sendData = capitalizedSentence.getBytes(); +// DatagramPacket sendPacket = +// new DatagramPacket(sendData, sendData.length, IPAddress, port); +// serverSocket.send(sendPacket); + } + } +} diff --git a/matchBrowser/src/main/java/networkInterface/OutInterface.java b/matchBrowser/src/main/java/networkInterface/OutInterface.java new file mode 100644 index 00000000..18746004 --- /dev/null +++ b/matchBrowser/src/main/java/networkInterface/OutInterface.java @@ -0,0 +1,7 @@ +package networkInterface; + +/** + * Holds the connection to the network for output + */ +public class OutInterface { +} diff --git a/matchBrowser/src/test/java/model/MatchTableTest.java b/matchBrowser/src/test/java/model/MatchTableTest.java new file mode 100644 index 00000000..6c16cd9e --- /dev/null +++ b/matchBrowser/src/test/java/model/MatchTableTest.java @@ -0,0 +1,27 @@ +package model; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +import static org.junit.Assert.assertEquals; + +public class MatchTableTest { + private MatchTable testTable; + + @Before + public void setUp() { + testTable = new MatchTable(); + } + + @Test + public void testTable() { + ArrayList entry = new ArrayList(Arrays.asList("127.0.0.1", 4942, 1, 1, 2, 6, 1)); + + testTable.addEntry(entry); + + assertEquals(testTable.getMatchTable().get(new TableKey("127.0.0.1", 4942)), Arrays.asList(1, 1, 2, 6, 1)); + } +} From cb8e81a7b21f26db913aaee651b1b01b299798f9 Mon Sep 17 00:00:00 2001 From: hba56 Date: Tue, 29 Aug 2017 14:38:42 +1200 Subject: [PATCH 02/92] encoders and decoders for the host game message with datatype and test #story[1188] --- .../HostGameMessageDecoder.java | 63 +++++++++++++++ .../HostGameMessageEncoder.java | 54 +++++++++++++ .../network/Messages/Enums/MessageType.java | 2 + .../main/java/network/Messages/HostGame.java | 79 +++++++++++++++++++ .../HostGameMessageDecoderTest.java | 36 +++++++++ 5 files changed, 234 insertions(+) create mode 100644 racevisionGame/src/main/java/network/MessageDecoders/HostGameMessageDecoder.java create mode 100644 racevisionGame/src/main/java/network/MessageEncoders/HostGameMessageEncoder.java create mode 100644 racevisionGame/src/main/java/network/Messages/HostGame.java create mode 100644 racevisionGame/src/test/java/network/MessageDecoders/HostGameMessageDecoderTest.java diff --git a/racevisionGame/src/main/java/network/MessageDecoders/HostGameMessageDecoder.java b/racevisionGame/src/main/java/network/MessageDecoders/HostGameMessageDecoder.java new file mode 100644 index 00000000..3991b83e --- /dev/null +++ b/racevisionGame/src/main/java/network/MessageDecoders/HostGameMessageDecoder.java @@ -0,0 +1,63 @@ +package network.MessageDecoders; + +import network.Exceptions.InvalidMessageException; +import network.Messages.AC35Data; +import network.Messages.CourseWinds; +import network.Messages.Enums.RaceStatusEnum; +import network.Messages.HostGame; +import network.Messages.RaceStatus; + +import java.util.Arrays; + +import static network.Utils.ByteConverter.bytesToInt; + +public class HostGameMessageDecoder implements MessageDecoder { + + /** + * The encoded message. + */ + private byte[] encodedMessage; + + /** + * The decoded message. + */ + private HostGame message; + + /** + * Constructor + */ + public HostGameMessageDecoder() { + } + + @Override + public AC35Data decode(byte[] encodedMessage) throws InvalidMessageException { + this.encodedMessage = encodedMessage; + + try{ + byte ipPart1 = encodedMessage[0]; + byte ipPart2 = encodedMessage[1]; + byte ipPart3 = encodedMessage[2]; + byte ipPart4 = encodedMessage[3]; + String ipString = ipPart1 + "." + ipPart2 + "." + ipPart3 + "." + ipPart4; +// System.out.println(ipString); + int port = bytesToInt(Arrays.copyOfRange(encodedMessage, 4, 8)); + byte map = encodedMessage[8]; + byte speed = encodedMessage[9]; + byte status = encodedMessage[10]; + byte requiredNumPlayers = encodedMessage[11]; + byte currentNumPlayers = encodedMessage[12]; + + + message = new HostGame(ipString, port, map, + speed, RaceStatusEnum.fromByte(status), + requiredNumPlayers, currentNumPlayers); + + return message; + + } catch (Exception e) { + throw new InvalidMessageException("Could not decode Host game message.", e); + } + } + + +} diff --git a/racevisionGame/src/main/java/network/MessageEncoders/HostGameMessageEncoder.java b/racevisionGame/src/main/java/network/MessageEncoders/HostGameMessageEncoder.java new file mode 100644 index 00000000..0a5c9a08 --- /dev/null +++ b/racevisionGame/src/main/java/network/MessageEncoders/HostGameMessageEncoder.java @@ -0,0 +1,54 @@ +package network.MessageEncoders; + +import network.Exceptions.InvalidMessageException; +import network.Messages.AC35Data; +import network.Messages.HostGame; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.List; + +import static network.Utils.ByteConverter.intToBytes; + + +public class HostGameMessageEncoder implements MessageEncoder{ + + /** + * Constructor + */ + public HostGameMessageEncoder() { + } + + @Override + public byte[] encode(AC35Data message) throws InvalidMessageException { + try{ + //Downcast + HostGame hostGame = (HostGame) message; + + ByteBuffer hostGameMessage = ByteBuffer.allocate(14); + + ByteBuffer ipBytes = ByteBuffer.allocate(4); + String ip = hostGame.getIp(); + String[] ipValues = ip.split("\\."); + for(String value:ipValues){ + ipBytes.put(intToBytes(Integer.parseInt(value), 1)[0]); + } + byte raceStatus = hostGame.getStatus().getValue(); + + hostGameMessage.put(ipBytes.array()); + hostGameMessage.put(intToBytes(hostGame.getPort())); + hostGameMessage.put(hostGame.getMap()); + hostGameMessage.put(hostGame.getSpeed()); + hostGameMessage.put(raceStatus); + hostGameMessage.put(hostGame.getRequiredNumPlayers()); + hostGameMessage.put(hostGame.getCurrentNumPlayers()); + + +// System.out.println(hostGameMessage.array()[4]); + return hostGameMessage.array(); + + } catch (Exception e) { + throw new InvalidMessageException("Could not encode Host game message.", e); + } + } +} diff --git a/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java b/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java index aed5d70a..e6cabbe0 100644 --- a/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java +++ b/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java @@ -39,6 +39,8 @@ public enum MessageType { */ ASSIGN_PLAYER_BOAT(121), + HOST_GAME(108), + NOTAMESSAGE(0); diff --git a/racevisionGame/src/main/java/network/Messages/HostGame.java b/racevisionGame/src/main/java/network/Messages/HostGame.java new file mode 100644 index 00000000..d03292fe --- /dev/null +++ b/racevisionGame/src/main/java/network/Messages/HostGame.java @@ -0,0 +1,79 @@ +package network.Messages; + + +import network.Messages.Enums.MessageType; +import network.Messages.Enums.RaceStatusEnum; + +public class HostGame extends AC35Data { + + private String ip; + private int port; + private byte map; + private byte speed; + private RaceStatusEnum status; + private byte requiredNumPlayers; + private byte currentNumPlayers; + + public HostGame(String ip, int port, byte map, byte speed, + RaceStatusEnum status, byte requiredNumPlayers, + byte currentNumPlayers) { + super(MessageType.HOST_GAME); + this.ip = ip; + this.port = port; + this.map = map; + this.speed = speed; + this.status = status; + this.requiredNumPlayers = requiredNumPlayers; + this.currentNumPlayers = currentNumPlayers; + + } + + /** + * @return the ip of host + */ + public String getIp() { + return ip; + } + + /** + * @return the port of host + */ + public int getPort() { + return port; + } + + /** + * @return the map index + */ + public byte getMap() { + return map; + } + + /** + * @return the speed value of game + */ + public byte getSpeed() { + return speed; + } + + /** + * @return the status of race + */ + public RaceStatusEnum getStatus() { + return status; + } + + /** + * @return required number of players + */ + public byte getRequiredNumPlayers() { + return requiredNumPlayers; + } + + /** + * @return current number of players + */ + public byte getCurrentNumPlayers() { + return currentNumPlayers; + } +} diff --git a/racevisionGame/src/test/java/network/MessageDecoders/HostGameMessageDecoderTest.java b/racevisionGame/src/test/java/network/MessageDecoders/HostGameMessageDecoderTest.java new file mode 100644 index 00000000..2d73241d --- /dev/null +++ b/racevisionGame/src/test/java/network/MessageDecoders/HostGameMessageDecoderTest.java @@ -0,0 +1,36 @@ +package network.MessageDecoders; + +import network.MessageEncoders.HostGameMessageEncoder; +import network.Messages.AC35Data; +import network.Messages.Enums.RaceStatusEnum; +import network.Messages.HostGame; +import org.junit.Assert; +import org.junit.Test; + +public class HostGameMessageDecoderTest { + + @Test + public void hostGameMessageDecoderTest() throws Exception { + HostGame testHost = new HostGame("127.0.0.1", 3779, (byte) 1, (byte) 2, RaceStatusEnum.PRESTART, (byte) 6, (byte) 2); + + + HostGameMessageEncoder encoder = new HostGameMessageEncoder(); + + byte[] encodedMessage = encoder.encode(testHost); + + HostGameMessageDecoder decoder = new HostGameMessageDecoder(); + + HostGame decodedTest = (HostGame) decoder.decode(encodedMessage); + + compareHostGameMessage(testHost, decodedTest); + } + + public static void compareHostGameMessage(HostGame original, HostGame decoded) { + Assert.assertEquals(original.getIp(), decoded.getIp()); + Assert.assertEquals(original.getPort(), decoded.getPort()); + Assert.assertEquals(original.getSpeed(), decoded.getSpeed()); + Assert.assertEquals(original.getStatus(), decoded.getStatus()); + Assert.assertEquals(original.getRequiredNumPlayers(), decoded.getRequiredNumPlayers()); + Assert.assertEquals(original.getCurrentNumPlayers(), decoded.getCurrentNumPlayers()); + } +} From ca0a3f2a8b3d1c9b7fbe1d9f0c9a475081c09017 Mon Sep 17 00:00:00 2001 From: hba56 Date: Tue, 29 Aug 2017 15:28:03 +1200 Subject: [PATCH 03/92] encoders and decoders for the hosted games request message with datatype and test #story[1188] --- .../HostedGamesRequestDecoder.java | 34 ++++++++++++++ .../HostedGamesRequestEncoder.java | 44 +++++++++++++++++++ .../network/Messages/Enums/MessageType.java | 2 + .../network/Messages/HostGamesRequest.java | 22 ++++++++++ .../HostedGamesRequestDecoderTest.java | 38 ++++++++++++++++ 5 files changed, 140 insertions(+) create mode 100644 racevisionGame/src/main/java/network/MessageDecoders/HostedGamesRequestDecoder.java create mode 100644 racevisionGame/src/main/java/network/MessageEncoders/HostedGamesRequestEncoder.java create mode 100644 racevisionGame/src/main/java/network/Messages/HostGamesRequest.java create mode 100644 racevisionGame/src/test/java/network/MessageDecoders/HostedGamesRequestDecoderTest.java diff --git a/racevisionGame/src/main/java/network/MessageDecoders/HostedGamesRequestDecoder.java b/racevisionGame/src/main/java/network/MessageDecoders/HostedGamesRequestDecoder.java new file mode 100644 index 00000000..95f5cf5c --- /dev/null +++ b/racevisionGame/src/main/java/network/MessageDecoders/HostedGamesRequestDecoder.java @@ -0,0 +1,34 @@ +package network.MessageDecoders; + +import network.Exceptions.InvalidMessageException; +import network.Messages.AC35Data; +import network.Messages.HostGame; +import network.Messages.HostGamesRequest; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static network.Utils.ByteConverter.bytesToInt; + +public class HostedGamesRequestDecoder implements MessageDecoder{ + @Override + public AC35Data decode(byte[] encodedMessage) throws InvalidMessageException { + try{ + int numberOfGames = bytesToInt(Arrays.copyOfRange(encodedMessage, 0, 4)); + + HostGameMessageDecoder lineDecoder = new HostGameMessageDecoder(); + List knownGames = new ArrayList<>(); + int byteIndex = 4; + for (int i = 0; i < numberOfGames; i++){ + knownGames.add((HostGame) lineDecoder.decode(Arrays.copyOfRange(encodedMessage, byteIndex, byteIndex+14))); + byteIndex += 14; + } + + return new HostGamesRequest(knownGames); + + } catch (Exception e) { + throw new InvalidMessageException("Could not decode Host game message.", e); + } + } +} diff --git a/racevisionGame/src/main/java/network/MessageEncoders/HostedGamesRequestEncoder.java b/racevisionGame/src/main/java/network/MessageEncoders/HostedGamesRequestEncoder.java new file mode 100644 index 00000000..4b4b52d1 --- /dev/null +++ b/racevisionGame/src/main/java/network/MessageEncoders/HostedGamesRequestEncoder.java @@ -0,0 +1,44 @@ +package network.MessageEncoders; + +import network.Exceptions.InvalidMessageException; +import network.Messages.AC35Data; +import network.Messages.HostGame; +import network.Messages.HostGamesRequest; + +import java.nio.ByteBuffer; +import java.util.List; + +import static network.Utils.ByteConverter.intToBytes; + +public class HostedGamesRequestEncoder implements MessageEncoder{ + + /** + * Constructor + */ + public HostedGamesRequestEncoder() { + } + + @Override + public byte[] encode(AC35Data message) throws InvalidMessageException { + try{ + //Downcast + HostGamesRequest hostGamesRequest = (HostGamesRequest) message; + + int numGames = hostGamesRequest.getKnownGames().size(); + + ByteBuffer hostedGamesRequestMessage = ByteBuffer.allocate(4+14*numGames); + + hostedGamesRequestMessage.put(intToBytes(numGames)); + + HostGameMessageEncoder lineEncoder = new HostGameMessageEncoder(); + for (HostGame line: hostGamesRequest.getKnownGames()) { + hostedGamesRequestMessage.put(lineEncoder.encode(line)); + } + + return hostedGamesRequestMessage.array(); + + }catch(Exception e){ + throw new InvalidMessageException("Could not encode Host game message.", e); + } + } +} diff --git a/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java b/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java index e6cabbe0..0941fd08 100644 --- a/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java +++ b/racevisionGame/src/main/java/network/Messages/Enums/MessageType.java @@ -41,6 +41,8 @@ public enum MessageType { HOST_GAME(108), + HOSTED_GAMES_REQUEST(109), + NOTAMESSAGE(0); diff --git a/racevisionGame/src/main/java/network/Messages/HostGamesRequest.java b/racevisionGame/src/main/java/network/Messages/HostGamesRequest.java new file mode 100644 index 00000000..4ecfc2d2 --- /dev/null +++ b/racevisionGame/src/main/java/network/Messages/HostGamesRequest.java @@ -0,0 +1,22 @@ +package network.Messages; + +import network.Messages.Enums.MessageType; + +import java.util.List; + +public class HostGamesRequest extends AC35Data{ + + private List knownGames; + + /** + * Constructor + */ + public HostGamesRequest(List knownGames) { + super(MessageType.HOSTED_GAMES_REQUEST); + this.knownGames = knownGames; + } + + public List getKnownGames() { + return knownGames; + } +} diff --git a/racevisionGame/src/test/java/network/MessageDecoders/HostedGamesRequestDecoderTest.java b/racevisionGame/src/test/java/network/MessageDecoders/HostedGamesRequestDecoderTest.java new file mode 100644 index 00000000..7567fe23 --- /dev/null +++ b/racevisionGame/src/test/java/network/MessageDecoders/HostedGamesRequestDecoderTest.java @@ -0,0 +1,38 @@ +package network.MessageDecoders; + + +import network.MessageEncoders.HostGameMessageEncoder; +import network.MessageEncoders.HostedGamesRequestEncoder; +import network.Messages.Enums.RaceStatusEnum; +import network.Messages.HostGame; +import network.Messages.HostGamesRequest; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +public class HostedGamesRequestDecoderTest { + @Test + public void hostGamesRequestMessageDecoderTest() throws Exception { + HostGame testHostGame1 = new HostGame("127.0.0.1", 3779, (byte) 1, (byte) 2, RaceStatusEnum.PRESTART, (byte) 6, (byte) 2); + HostGame testHostGame2 = new HostGame("127.0.0.1", 3780, (byte) 1, (byte) 2, RaceStatusEnum.PRESTART, (byte) 6, (byte) 2); + + List knownGames = Arrays.asList(testHostGame1, testHostGame2); + + HostedGamesRequestEncoder encoder = new HostedGamesRequestEncoder(); + + byte[] encodedMessage = encoder.encode(new HostGamesRequest(knownGames)); + + HostedGamesRequestDecoder decoder = new HostedGamesRequestDecoder(); + + HostGamesRequest decodedTest = (HostGamesRequest) decoder.decode(encodedMessage); + + compareHostGamesRequestMessage(knownGames, decodedTest.getKnownGames()); + } + + public static void compareHostGamesRequestMessage(List original, List decoded) { + Assert.assertEquals(original.get(0).getIp(), decoded.get(0).getIp()); + Assert.assertEquals(original.get(1).getPort(), decoded.get(1).getPort()); + } +} From 88782182d7b7b373a188e13e26e732b81ae5d7dc Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 30 Aug 2017 11:39:41 +1200 Subject: [PATCH 04/92] Player panes and spectator list now call method on click. Will later be used for players to choose whether they want to play or spectate. #story[1188] --- .../visualiser/Controllers/HostController.java | 8 ++++++++ .../resources/visualiser/scenes/hostlobby.fxml | 14 +++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index 22c76426..9f96ad55 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -119,4 +119,12 @@ public class HostController extends Controller { System.out.println("Should start the race. This button is only visible for the host"); } + public void joinSpecPressed(){ + System.out.println("Spectator list pressed. Joining spectators"); + } + + public void joinRacePressed(){ + System.out.println("Empty race user pane pressed. Joining racers"); + } + } diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml index aed6664b..443aa548 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml @@ -44,7 +44,7 @@ - + @@ -60,7 +60,7 @@ - + @@ -76,7 +76,7 @@ - + @@ -92,7 +92,7 @@ - + @@ -108,7 +108,7 @@ - + @@ -124,7 +124,7 @@ - + @@ -164,7 +164,7 @@ - + From d2f0c1105a5cd6db1632d824f578b38a770d72e0 Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 30 Aug 2017 11:52:45 +1200 Subject: [PATCH 05/92] Merged 3d branch. Added 3d item to one of the player pane. #story[1188] --- .../main/java/visualiser/Controllers/HostController.java | 7 ++++++- .../src/main/resources/visualiser/scenes/hostlobby.fxml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index 53be0471..2d9605e4 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -7,6 +7,7 @@ import javafx.scene.control.SplitPane; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; +import javafx.scene.layout.Pane; import mock.app.Event; import mock.exceptions.EventConstructionException; import visualiser.model.View3D; @@ -49,6 +50,9 @@ public class HostController extends Controller { @FXML GridPane playerContainer; + @FXML + private Pane playerPane; + private Event game; private View3D fancyStuff; @@ -56,7 +60,8 @@ public class HostController extends Controller { @Override public void initialize(URL location, ResourceBundle resources) { fancyStuff = new View3D(); - playerContainer.add(fancyStuff, 0,0); + playerPane.getChildren().add(fancyStuff); + //playerContainer.add(fancyStuff, 0,0); fancyStuff.spinBox(); } diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml index 77e0ad15..045ff98d 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml @@ -46,7 +46,7 @@ - + From 028428da2c60c8dd4dc8b9f251374955eb713519 Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 30 Aug 2017 12:04:17 +1200 Subject: [PATCH 06/92] Fixed fxml issues due to merge. Added pane centering for panes. #story[1188] --- .../visualiser/Controllers/HostController.java | 10 +++++++++- .../resources/visualiser/scenes/hostlobby.fxml | 15 ++------------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java index 2d9605e4..506e6c15 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -53,6 +53,9 @@ public class HostController extends Controller { @FXML private Pane playerPane; + @FXML + private Pane playerPane4; + private Event game; private View3D fancyStuff; @@ -60,8 +63,13 @@ public class HostController extends Controller { @Override public void initialize(URL location, ResourceBundle resources) { fancyStuff = new View3D(); - playerPane.getChildren().add(fancyStuff); + playerPane4.getChildren().add(fancyStuff); + + //centering the 3d object + fancyStuff.layoutXProperty().bind(playerPane4.widthProperty().subtract(fancyStuff.widthProperty()).divide(2)); + fancyStuff.layoutYProperty().bind(playerPane4.heightProperty().subtract(fancyStuff.heightProperty()).divide(2)); //playerContainer.add(fancyStuff, 0,0); + fancyStuff.spinBox(); } diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml index 045ff98d..24aedebc 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostlobby.fxml @@ -94,7 +94,7 @@ - + @@ -145,7 +145,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml index ab14abaf..901cd255 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml @@ -1,44 +1,40 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml index 7aff44c0..f6ebbab4 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml @@ -7,8 +7,9 @@ - + + From a5050b8ea8a51cefbac8ec042d95e8f33a825453 Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Fri, 8 Sep 2017 18:08:58 +1200 Subject: [PATCH 33/92] Adding back lost changes and finishing splitting last controllers. - renamed fxml and their controllers to match - removed old controllers - finished lobby and lobbyhost controllers #story[1261] --- .../src/main/java/mock/app/Event.java | 15 +- .../src/main/java/shared/model/RaceClock.java | 6 +- .../ArrowController.java | 2 +- .../Controllers/ConnectionController.java | 37 +---- .../visualiser/Controllers/Controller.java | 32 ---- .../Controller2.java | 19 ++- .../KeyBindingsController.java | 2 +- .../Controllers/LobbyController.java | 71 +++------ ...oller.java => LobbyHostingController.java} | 54 ++----- .../Controllers/MainController.java | 135 ---------------- .../NotificationController.java | 2 +- .../RaceFinishController.java} | 4 +- .../RaceStartController.java} | 11 +- ...ontroller.java => RaceViewController.java} | 32 ++-- .../TitleController.java | 4 +- .../src/main/java/visualiser/app/App.java | 12 +- .../java/visualiser/model/TrackPoint.java | 4 +- .../java/visualiser/model/VisualiserBoat.java | 2 +- .../visualiser/model/VisualiserRaceEvent.java | 2 +- .../visualiser/network/ServerConnection.java | 6 +- .../resources/visualiser/scenes/arrow.fxml | 2 +- .../resources/visualiser/scenes/controls.fxml | 15 -- .../resources/visualiser/scenes/hostgame.fxml | 44 ------ .../visualiser/scenes/keyBindings.fxml | 2 +- .../{hostLobby.fxml => lobbyHosting.fxml} | 2 +- .../resources/visualiser/scenes/main.fxml | 14 -- .../visualiser/scenes/notification.fxml | 2 +- .../scenes/{finish.fxml => raceFinish.fxml} | 2 +- .../scenes/{start.fxml => raceStart.fxml} | 2 +- .../scenes/{race.fxml => raceView.fxml} | 6 +- .../resources/visualiser/scenes/title.fxml | 144 ++++++++++-------- .../visualiser/scenes/titleScreen.fxml | 85 ----------- 32 files changed, 193 insertions(+), 579 deletions(-) rename racevisionGame/src/main/java/visualiser/{Controllers2 => Controllers}/ArrowController.java (99%) delete mode 100644 racevisionGame/src/main/java/visualiser/Controllers/Controller.java rename racevisionGame/src/main/java/visualiser/{Controllers2 => Controllers}/Controller2.java (84%) rename racevisionGame/src/main/java/visualiser/{Controllers2 => Controllers}/KeyBindingsController.java (99%) rename racevisionGame/src/main/java/visualiser/Controllers/{HostController.java => LobbyHostingController.java} (67%) delete mode 100644 racevisionGame/src/main/java/visualiser/Controllers/MainController.java rename racevisionGame/src/main/java/visualiser/{Controllers2 => Controllers}/NotificationController.java (96%) rename racevisionGame/src/main/java/visualiser/{Controllers2/FinishController.java => Controllers/RaceFinishController.java} (93%) rename racevisionGame/src/main/java/visualiser/{Controllers2/StartController.java => Controllers/RaceStartController.java} (93%) rename racevisionGame/src/main/java/visualiser/Controllers/{RaceController.java => RaceViewController.java} (93%) rename racevisionGame/src/main/java/visualiser/{Controllers2 => Controllers}/TitleController.java (96%) delete mode 100644 racevisionGame/src/main/resources/visualiser/scenes/controls.fxml delete mode 100644 racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml rename racevisionGame/src/main/resources/visualiser/scenes/{hostLobby.fxml => lobbyHosting.fxml} (99%) delete mode 100644 racevisionGame/src/main/resources/visualiser/scenes/main.fxml rename racevisionGame/src/main/resources/visualiser/scenes/{finish.fxml => raceFinish.fxml} (98%) rename racevisionGame/src/main/resources/visualiser/scenes/{start.fxml => raceStart.fxml} (98%) rename racevisionGame/src/main/resources/visualiser/scenes/{race.fxml => raceView.fxml} (96%) delete mode 100644 racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 6f778852..3e8c0727 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -2,14 +2,14 @@ package mock.app; import mock.dataInput.PolarParser; import mock.exceptions.EventConstructionException; -import mock.model.*; +import mock.model.MockRace; +import mock.model.Polars; +import mock.model.RaceLogic; +import mock.model.SourceIdAllocator; import mock.model.commandFactory.CompositeCommand; -import mock.model.wind.RandomWindGenerator; import mock.model.wind.ShiftingWindGenerator; import mock.model.wind.WindGenerator; -import mock.xml.RaceXMLCreator; import network.Messages.LatestMessages; -import org.xml.sax.SAXException; import shared.dataInput.*; import shared.enums.XMLFileType; import shared.exceptions.InvalidBoatDataException; @@ -19,17 +19,10 @@ import shared.exceptions.XMLReaderException; import shared.model.Bearing; import shared.model.Constants; -import javax.xml.bind.JAXBException; -import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; /** diff --git a/racevisionGame/src/main/java/shared/model/RaceClock.java b/racevisionGame/src/main/java/shared/model/RaceClock.java index b3a631c6..3ce61245 100644 --- a/racevisionGame/src/main/java/shared/model/RaceClock.java +++ b/racevisionGame/src/main/java/shared/model/RaceClock.java @@ -3,7 +3,7 @@ package shared.model; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import org.jetbrains.annotations.Nullable; -import visualiser.Controllers2.StartController; +import visualiser.Controllers.RaceStartController; import visualiser.model.ResizableRaceCanvas; import java.time.Duration; @@ -16,8 +16,8 @@ import java.util.Date; * This class is used to implement a clock which keeps track of and * displays times relevant to a race. This is displayed on the * {@link ResizableRaceCanvas} via the - * {@link visualiser.Controllers.RaceController} and the - * {@link StartController}. + * {@link visualiser.Controllers.RaceViewController} and the + * {@link RaceStartController}. */ public class RaceClock { diff --git a/racevisionGame/src/main/java/visualiser/Controllers2/ArrowController.java b/racevisionGame/src/main/java/visualiser/Controllers/ArrowController.java similarity index 99% rename from racevisionGame/src/main/java/visualiser/Controllers2/ArrowController.java rename to racevisionGame/src/main/java/visualiser/Controllers/ArrowController.java index 069f04a5..739b2f6e 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers2/ArrowController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ArrowController.java @@ -1,4 +1,4 @@ -package visualiser.Controllers2; +package visualiser.Controllers; import javafx.application.Platform; import javafx.beans.property.Property; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index 28692488..dc4535e0 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -5,43 +5,24 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.layout.AnchorPane; -import mock.app.Event; -import org.xml.sax.SAXException; -import shared.exceptions.InvalidBoatDataException; -import shared.exceptions.InvalidRaceDataException; -import shared.exceptions.InvalidRegattaDataException; -import shared.exceptions.XMLReaderException; import visualiser.model.RaceConnection; - -import javax.xml.bind.JAXBException; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.soap.Text; import java.io.IOException; import java.net.Socket; import java.net.URL; -import java.net.UnknownHostException; import java.util.ResourceBundle; //TODO it appears this view/controller was replaced by Lobby.fxml. Remove? /** * Controls the connection that the VIsualiser can connect to. */ -public class ConnectionController extends Controller { - @FXML - private AnchorPane connectionWrapper; - @FXML - private TableView connectionTable; - @FXML - private TableColumn hostnameColumn; - @FXML - private TableColumn statusColumn; - @FXML - private Button connectButton; - - @FXML - private TextField urlField; - @FXML - private TextField portField; +public class ConnectionController extends Controller2 { + @FXML AnchorPane connectionWrapper; + @FXML TableView connectionTable; + @FXML TableColumn hostnameColumn; + @FXML TableColumn statusColumn; + @FXML Button connectButton; + @FXML TextField urlField; + @FXML TextField portField; /*Title Screen fxml items*/ @@ -87,7 +68,6 @@ public class ConnectionController extends Controller { - @Override public void initialize(URL location, ResourceBundle resources) { // TODO - replace with config file connections = FXCollections.observableArrayList(); @@ -143,5 +123,4 @@ public class ConnectionController extends Controller { } } - } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/Controller.java b/racevisionGame/src/main/java/visualiser/Controllers/Controller.java deleted file mode 100644 index 220b7816..00000000 --- a/racevisionGame/src/main/java/visualiser/Controllers/Controller.java +++ /dev/null @@ -1,32 +0,0 @@ -package visualiser.Controllers; - -import javafx.fxml.Initializable; - -import java.net.URL; -import java.util.ResourceBundle; - -/** - * Controller parent for app controllers. - * Created by fwy13 on 15/03/2017. - */ -public abstract class Controller implements Initializable { - protected MainController parent; - - /** - * Sets the parent of the application - * - * @param parent controller - */ - public void setParent(MainController parent) { - this.parent = parent; - } - - /** - * Initialisation class that is run on start up. - * - * @param location resources location - * @param resources resources bundle - */ - @Override - public abstract void initialize(URL location, ResourceBundle resources); -} diff --git a/racevisionGame/src/main/java/visualiser/Controllers2/Controller2.java b/racevisionGame/src/main/java/visualiser/Controllers/Controller2.java similarity index 84% rename from racevisionGame/src/main/java/visualiser/Controllers2/Controller2.java rename to racevisionGame/src/main/java/visualiser/Controllers/Controller2.java index c941b0f7..74d8390a 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers2/Controller2.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/Controller2.java @@ -1,4 +1,4 @@ -package visualiser.Controllers2; +package visualiser.Controllers; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -7,13 +7,25 @@ import javafx.scene.image.Image; import javafx.stage.Modality; import javafx.stage.Stage; import visualiser.app.App; + import java.io.IOException; + /** * Abstract controller class to give each subclass the functionality to load * a new scene into the existing stage, or create a new popup window. */ -public class Controller2 { +public abstract class Controller2 { + Stage stage = App.getStage(); + + protected void loadTitleScreen() throws IOException { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/visualiser/scenes/title.fxml")); + Parent root = loader.load(); + stage.setResizable(false); + Scene scene = new Scene(root); + stage.setScene(scene); + stage.show(); + } /** * Used to load a new scene in the currently open stage. @@ -34,12 +46,13 @@ public class Controller2 { Double stageWidth = stage.getWidth(); // set new scene into existing window - Scene scene = new Scene(root); + Scene scene = new Scene(root, stageWidth, stageHeight); stage.setScene(scene); stage.setResizable(true); stage.show(); stage.setHeight(stageHeight); stage.setWidth(stageWidth); + stage.sizeToScene(); // return controller for the loaded fxml scene return loader.getController(); diff --git a/racevisionGame/src/main/java/visualiser/Controllers2/KeyBindingsController.java b/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java similarity index 99% rename from racevisionGame/src/main/java/visualiser/Controllers2/KeyBindingsController.java rename to racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java index a1c8ae51..7da5a818 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers2/KeyBindingsController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java @@ -1,4 +1,4 @@ -package visualiser.Controllers2; +package visualiser.Controllers; import javafx.application.Platform; import javafx.event.EventHandler; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index 2b69cff5..2230bbdb 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -7,9 +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.layout.AnchorPane; -import visualiser.Controllers2.Controller2; -import visualiser.Controllers2.StartController; import visualiser.model.RaceConnection; import java.io.IOException; @@ -19,34 +16,21 @@ import java.net.Socket; * Controller for the Lobby for entering games */ public class LobbyController extends Controller2 { - - @FXML - private AnchorPane lobbyWrapper; - @FXML - private TableView lobbyTable; - @FXML - private TableColumn gameNameColumn; - @FXML - private TableColumn hostNameColumn; - @FXML - private TableColumn statusColumn; - @FXML - private Button joinGameBtn; - @FXML - private TextField addressFld; - @FXML - private TextField portFld; - + private @FXML TableView lobbyTable; + private @FXML TableColumn gameNameColumn; + private @FXML TableColumn hostNameColumn; + private @FXML TableColumn statusColumn; + private @FXML Button joinGameBtn; + private @FXML TextField addressFld; + private @FXML TextField portFld; private ObservableList connections; - -// @Override public void initialize() { + // set up the connection table connections = FXCollections.observableArrayList(); //connections.add(new RaceConnection("localhost", 4942, "Local Game")); lobbyTable.setItems(connections); - gameNameColumn.setCellValueFactory(cellData -> cellData.getValue().gamenameProperty()); hostNameColumn.setCellValueFactory(cellData -> cellData.getValue().hostnameProperty()); statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty()); @@ -54,8 +38,7 @@ public class LobbyController extends Controller2 { lobbyTable.getSelectionModel().selectedItemProperty().addListener((obs, prev, curr) -> { if (curr != null && curr.statusProperty().getValue().equals("Ready")) { joinGameBtn.setDisable(false); - } - else { + } else { joinGameBtn.setDisable(true); } }); @@ -81,23 +64,15 @@ public class LobbyController extends Controller2 { /** * Connect to a connection. */ - public void connectSocket() { - try{ - RaceConnection connection = lobbyTable.getSelectionModel().getSelectedItem(); - Socket socket = new Socket(connection.getHostname(), connection.getPort()); - lobbyWrapper.setVisible(false); -// parent.enterLobby(socket, false); - StartController sc = (StartController)loadScene( - "/visualiser/scenes/start.fxml"); - sc.enterLobby(socket, false); - } catch (IOException e) { /* Never reached */ - e.printStackTrace(); - } + public void connectSocket() throws IOException { + RaceConnection connection = lobbyTable.getSelectionModel().getSelectedItem(); + Socket socket = new Socket(connection.getHostname(), connection.getPort()); + RaceStartController rsc = (RaceStartController)loadScene("raceStart.fxml"); + rsc.enterLobby(socket, false); } public void menuBtnPressed() throws IOException { -// parent.enterTitle(); - loadScene("titleScreen.fxml"); + loadScene("title.fxml"); } /** @@ -106,24 +81,14 @@ public class LobbyController extends Controller2 { public void addConnectionPressed(){ String hostName = addressFld.getText(); String portString = portFld.getText(); - try{ + try { int port = Integer.parseInt(portString); connections.add(new RaceConnection(hostName, port, "Boat Game")); addressFld.clear(); portFld.clear(); - }catch(NumberFormatException e){ + } catch (NumberFormatException e) { System.err.println("Port number entered is not a number"); } } - public AnchorPane startWrapper(){ - return lobbyWrapper; - } - - /** - * Enter the lobby page. - */ - public void enterLobby(){ - lobbyWrapper.setVisible(true); - } -} +} \ No newline at end of file diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java similarity index 67% rename from racevisionGame/src/main/java/visualiser/Controllers/HostController.java rename to racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java index 6d0ec3a1..dd2fcb89 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java @@ -2,14 +2,9 @@ package visualiser.Controllers; import com.interactivemesh.jfx.importer.stl.StlMeshImporter; import javafx.animation.AnimationTimer; -import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; -import javafx.event.EventHandler; import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; import javafx.scene.control.SplitPane; @@ -17,12 +12,8 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.shape.MeshView; -import javafx.stage.Stage; -import javafx.stage.WindowEvent; import mock.app.Event; import mock.exceptions.EventConstructionException; -import visualiser.Controllers2.Controller2; -import visualiser.Controllers2.StartController; import visualiser.app.App; import visualiser.layout.Subject3D; import visualiser.layout.View3D; @@ -37,13 +28,12 @@ import java.util.logging.Logger; /** * Controller for Hosting a game. */ -public class HostController extends Controller2 { +public class LobbyHostingController extends Controller2 { private @FXML ImageView imageView; private @FXML AnchorPane imagePane; private @FXML SplitPane splitPane; private @FXML AnchorPane specPane; private @FXML GridPane playerContainer; - private Event game; private View3D view3D; public void initialize() { @@ -54,7 +44,7 @@ public class HostController extends Controller2 { view3D.setItems(subjects); playerContainer.add(view3D, 0,0); - URL asset = HostController.class.getClassLoader().getResource("assets/V1.2 Complete Boat.stl"); + URL asset = LobbyHostingController.class.getClassLoader().getResource("assets/V1.2 Complete Boat.stl"); StlMeshImporter importer = new StlMeshImporter(); importer.read(asset); @@ -81,30 +71,25 @@ public class HostController extends Controller2 { */ public void hostGamePressed() { try { - this.game = new Event(false); + App.game = new Event(false); connectSocket("localhost", 4942); } catch (EventConstructionException e) { Logger.getGlobal().log(Level.SEVERE, "Could not create Event.", e); throw new RuntimeException(e); + } catch (IOException e) { + e.printStackTrace(); } } - public void endEvent() throws IOException { - game.endEvent(); - } - /** * Connect to a socket * @param address address of the server * @param port port that the server is run off */ - public void connectSocket(String address, int port) { - try{ - Socket socket = new Socket(address, port); - StartController sc = (StartController)loadScene - ("start.fxml"); - sc.enterLobby(socket, true); - } catch (IOException e) { /* Never reached */ } + public void connectSocket(String address, int port) throws IOException { + Socket socket = new Socket(address, port); + RaceStartController rsc = (RaceStartController)loadScene("raceStart.fxml"); + rsc.enterLobby(socket, true); } /** @@ -115,34 +100,21 @@ public class HostController extends Controller2 { splitPane.lookupAll(".split-pane-divider").stream().forEach(div -> div.setMouseTransparent(true)); imageView.fitWidthProperty().bind(imagePane.widthProperty()); imageView.fitHeightProperty().bind(imagePane.heightProperty()); -// hostWrapper.setVisible(true); tick } /** * Menu button pressed. Prompt alert then return to menu */ - public void menuBtnPressed() throws IOException { + public void menuBtnPressed() throws Exception { Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setTitle("Quitting race"); alert.setContentText("Do you wish to quit the race?"); alert.setHeaderText("You are about to quit the race"); Optional result = alert.showAndWait(); if(result.get() == ButtonType.OK){ -// hostWrapper.setVisible(false); - Stage stage = App.getStage(); - FXMLLoader loader = new FXMLLoader(getClass().getResource("/visualiser/scenes/main.fxml")); - Parent root = loader.load(); - stage.setResizable(false); - Scene scene = new Scene(root); - stage.setScene(scene); - stage.show(); - stage.setOnCloseRequest(new EventHandler() { - @Override public void handle(WindowEvent event) { - Platform.exit(); - System.exit(0); - } - }); -// parent.enterTitle(); tick +// getStage().close(); +// App.app.loadTitleScreen(); + loadTitleScreen(); } } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java deleted file mode 100644 index 7007b8b9..00000000 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ /dev/null @@ -1,135 +0,0 @@ -package visualiser.Controllers; - -import javafx.collections.ObservableList; -import javafx.fxml.FXML; -import javafx.scene.layout.AnchorPane; -import visualiser.Controllers2.FinishController; -import visualiser.Controllers2.StartController; -import visualiser.Controllers2.TitleController; -import visualiser.gameController.ControllerClient; -import visualiser.model.VisualiserBoat; -import visualiser.model.VisualiserRaceEvent; - -import java.io.IOException; -import java.net.Socket; -import java.net.URL; -import java.util.ResourceBundle; - - -/** - * Controller that everything is overlayed onto. This makes it so that changing scenes does not resize your stage. - */ -public class MainController extends Controller { - - @FXML private StartController startController; - @FXML private RaceController raceController; - @FXML private ConnectionController connectionController; - @FXML private FinishController finishController; - @FXML private TitleController titleController; - @FXML private HostController hostController; - @FXML private LobbyController lobbyController; - - - /** - * Ctor. - */ - public MainController() { - } - - - - /** - * Transitions from the StartController screen (displays pre-race information) to the RaceController (displays the actual race). - * @param visualiserRace The object modelling the race. - * @param controllerClient Socket Client that manipulates the controller. - * @param isHost if the client is the host of a race or not. - */ - public void beginRace(VisualiserRaceEvent visualiserRace, ControllerClient controllerClient, Boolean isHost) { - raceController.startRace(visualiserRace, controllerClient, isHost); - } - - public void endEvent() throws IOException { hostController.endEvent(); } - - /** - * Transitions from the server selection screen to the pre-race lobby for a given server. - * @param socket The server to read data from. - * @param isHost is connection a host - */ - public void enterLobby(Socket socket, Boolean isHost) { - startController.enterLobby(socket, isHost); - } - - /** - * Transitions from the {@link RaceController} screen to the {@link FinishController} screen. - * @param boats The boats to display on the finish screen. - */ - public void enterFinish(ObservableList boats) { - finishController.loadFinish(boats); - } - -// /** -// * Transitions into the title screen -// */ -// public void enterTitle() { -// titleController.enterTitle(); -// } - - /** - * Transitions into lobby screen - */ - public void enterLobby(){ lobbyController.enterLobby(); } - - /** - * Transitions into host game screen - */ - public void hostGame(){ hostController.hostGame(); } - - /** - * Sets up the css for the start of the program - */ - public void startCss(){titleController.setDayMode();} - - /** - * Main Controller for the applications will house the menu and the displayed pane. - * - * @param location of resources - * @param resources bundle - */ - @Override - public void initialize(URL location, ResourceBundle resources) { - -// startController.setParent(this); -// raceController.setParent(this); -// connectionController.setParent(this); -// finishController.setParent(this); -// titleController.setParent(this); -// hostController.setParent(this); -// lobbyController.setParent(this); - - -// AnchorPane.setTopAnchor(startController.startWrapper(), 0.0); -// AnchorPane.setBottomAnchor(startController.startWrapper(), 0.0); -// AnchorPane.setLeftAnchor(startController.startWrapper(), 0.0); -// AnchorPane.setRightAnchor(startController.startWrapper(), 0.0); - - AnchorPane.setTopAnchor(lobbyController.startWrapper(), 0.0); - AnchorPane.setBottomAnchor(lobbyController.startWrapper(), 0.0); - AnchorPane.setLeftAnchor(lobbyController.startWrapper(), 0.0); - AnchorPane.setRightAnchor(lobbyController.startWrapper(), 0.0); - -// AnchorPane.setTopAnchor(hostController.startWrapper(), 0.0); -// AnchorPane.setBottomAnchor(hostController.startWrapper(), 0.0); -// AnchorPane.setLeftAnchor(hostController.startWrapper(), 0.0); -// AnchorPane.setRightAnchor(hostController.startWrapper(), 0.0); - -// AnchorPane.setTopAnchor(finishController.finishWrapper, 0.0); -// AnchorPane.setBottomAnchor(finishController.finishWrapper, 0.0); -// AnchorPane.setLeftAnchor(finishController.finishWrapper, 0.0); -// AnchorPane.setRightAnchor(finishController.finishWrapper, 0.0); - -// AnchorPane.setTopAnchor(titleController.titleWrapper, 0.0); -// AnchorPane.setBottomAnchor(titleController.titleWrapper, 0.0); -// AnchorPane.setLeftAnchor(titleController.titleWrapper, 0.0); -// AnchorPane.setRightAnchor(titleController.titleWrapper, 0.0); - } -} diff --git a/racevisionGame/src/main/java/visualiser/Controllers2/NotificationController.java b/racevisionGame/src/main/java/visualiser/Controllers/NotificationController.java similarity index 96% rename from racevisionGame/src/main/java/visualiser/Controllers2/NotificationController.java rename to racevisionGame/src/main/java/visualiser/Controllers/NotificationController.java index b8fe1b9c..d122ec80 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers2/NotificationController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/NotificationController.java @@ -1,4 +1,4 @@ -package visualiser.Controllers2; +package visualiser.Controllers; import javafx.fxml.FXML; import javafx.scene.control.Label; diff --git a/racevisionGame/src/main/java/visualiser/Controllers2/FinishController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceFinishController.java similarity index 93% rename from racevisionGame/src/main/java/visualiser/Controllers2/FinishController.java rename to racevisionGame/src/main/java/visualiser/Controllers/RaceFinishController.java index f5ae6044..659af532 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers2/FinishController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceFinishController.java @@ -1,4 +1,4 @@ -package visualiser.Controllers2; +package visualiser.Controllers; import javafx.collections.ObservableList; import javafx.fxml.FXML; @@ -10,7 +10,7 @@ import visualiser.model.VisualiserBoat; /** * Finish Screen for when the race finishes. */ -public class FinishController extends Controller2 { +public class RaceFinishController extends Controller2 { private @FXML TableView boatInfoTable; private @FXML TableColumn boatRankColumn; private @FXML TableColumn boatNameColumn; diff --git a/racevisionGame/src/main/java/visualiser/Controllers2/StartController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceStartController.java similarity index 93% rename from racevisionGame/src/main/java/visualiser/Controllers2/StartController.java rename to racevisionGame/src/main/java/visualiser/Controllers/RaceStartController.java index 4ff74987..fbf23a58 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers2/StartController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceStartController.java @@ -1,4 +1,4 @@ -package visualiser.Controllers2; +package visualiser.Controllers; import javafx.animation.AnimationTimer; import javafx.application.Platform; @@ -9,7 +9,6 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import network.Messages.Enums.RaceStatusEnum; import network.Messages.Enums.RequestToJoinEnum; -import visualiser.Controllers.RaceController; import visualiser.gameController.ControllerClient; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRaceEvent; @@ -23,7 +22,7 @@ import java.util.logging.Logger; /** * Controller to for waiting for the race to start. */ -public class StartController extends Controller2 { +public class RaceStartController extends Controller2 { private @FXML Label raceTitleLabel; private @FXML Label raceStartLabel; private @FXML Label timeZoneTime; @@ -127,8 +126,10 @@ public class StartController extends Controller2 { stop(); // stop this timer // load up the race scene try { - RaceController rc = (RaceController)loadScene("race.fxml"); - rc.startRace(visualiserRaceEvent, controllerClient, isHost); + RaceViewController rvc = (RaceViewController) + loadScene("raceView.fxml"); + rvc.startRace(visualiserRaceEvent, controllerClient, + isHost); } catch (IOException e) { e.printStackTrace(); } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java similarity index 93% rename from racevisionGame/src/main/java/visualiser/Controllers/RaceController.java rename to racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java index b3b29374..b6836665 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java @@ -17,9 +17,6 @@ import javafx.scene.layout.StackPane; import javafx.util.Callback; import network.Messages.Enums.RaceStatusEnum; import shared.model.Leg; -import visualiser.Controllers2.ArrowController; -import visualiser.Controllers2.Controller2; -import visualiser.Controllers2.FinishController; import visualiser.app.App; import visualiser.gameController.ControllerClient; import visualiser.gameController.Keys.ControlKey; @@ -35,13 +32,12 @@ import java.util.logging.Logger; /** * Controller used to display a running race. */ -public class RaceController extends Controller2 { +public class RaceViewController extends Controller2 { private VisualiserRaceEvent visualiserRace; private VisualiserRaceState raceState; private ControllerClient controllerClient; private ResizableRaceCanvas raceCanvas; - private KeyFactory keyFactory; - + private KeyFactory keyFactory = new KeyFactory(); private boolean infoTableShow = true; // shown or hidden private boolean isHost; @@ -87,9 +83,10 @@ public class RaceController extends Controller2 { race.addEventFilter(KeyEvent.KEY_PRESSED, event -> { String codeString = event.getCode().toString(); + // tab key if (codeString.equals("TAB")){toggleTable();} - // valid key pressed + // any key pressed ControlKey controlKey = keyFactory.getKey(codeString); if(controlKey != null) { try { @@ -98,13 +95,12 @@ public class RaceController extends Controller2 { event.consume(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - Logger.getGlobal().log(Level.WARNING, "RaceController was interrupted on thread: " + Thread.currentThread() + "while sending: " + controlKey, e); + Logger.getGlobal().log(Level.WARNING, "RaceViewController was interrupted on thread: " + Thread.currentThread() + "while sending: " + controlKey, e); } } // escape key if(event.getCode() == KeyCode.ESCAPE) { - try { if (isHost) { Alert alert = new Alert(Alert.AlertType.CONFIRMATION); @@ -112,10 +108,8 @@ public class RaceController extends Controller2 { alert.setContentText("Do you wish to quit the race? You are the host"); Optional result = alert.showAndWait(); if (result.get() == ButtonType.OK) { - HostController hc = (HostController)loadScene( - "hostgame.fxml"); - hc.endEvent(); - App.app.loadTitleScreen(); + App.game.endEvent(); + loadTitleScreen(); } } else { Alert alert = new Alert(Alert.AlertType.CONFIRMATION); @@ -123,7 +117,7 @@ public class RaceController extends Controller2 { alert.setContentText("Do you wish to quit the race?"); Optional result = alert.showAndWait(); if (result.get() == ButtonType.OK) { - App.app.loadTitleScreen(); + loadTitleScreen(); } } } catch (IOException e) { @@ -170,10 +164,8 @@ public class RaceController extends Controller2 { showFPS.selectedProperty().addListener((ov, old_val, new_val) -> { if (showFPS.isSelected()) { FPS.setVisible(true); - } else { FPS.setVisible(false); - } }); @@ -260,8 +252,6 @@ public class RaceController extends Controller2 { private void initialiseRaceCanvas() { //Create canvas. raceCanvas = new ResizableRaceCanvas(raceState); - - //Set properties. raceCanvas.setMouseTransparent(true); raceCanvas.widthProperty().bind(canvasBase.widthProperty()); raceCanvas.heightProperty().bind(canvasBase.heightProperty()); @@ -288,8 +278,8 @@ public class RaceController extends Controller2 { * Transition from the race view to the finish view. */ public void finishRace() throws IOException { - FinishController fc = - (FinishController)loadScene("/visualiser/scenes/finish.fxml"); + RaceFinishController fc = + (RaceFinishController)loadScene("raceFinish.fxml"); fc.loadFinish(raceState.getBoats()); } @@ -317,7 +307,7 @@ public class RaceController extends Controller2 { //Return to main screen if we lose connection. if (!visualiserRace.getServerConnection().isAlive()) { try { - App.app.loadTitleScreen(); + loadTitleScreen(); } catch (Exception e) { e.printStackTrace(); } diff --git a/racevisionGame/src/main/java/visualiser/Controllers2/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java similarity index 96% rename from racevisionGame/src/main/java/visualiser/Controllers2/TitleController.java rename to racevisionGame/src/main/java/visualiser/Controllers/TitleController.java index 62ef4324..42925021 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers2/TitleController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java @@ -1,4 +1,4 @@ -package visualiser.Controllers2; +package visualiser.Controllers; import javafx.fxml.FXML; import javafx.scene.control.RadioButton; @@ -23,7 +23,7 @@ public class TitleController extends Controller2 { * @throws IOException if main has problems */ public void hostAGame() throws IOException { - loadScene("hostLobby.fxml"); + loadScene("lobbyHosting.fxml"); } /** diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java index 08aba761..9cd9794b 100644 --- a/racevisionGame/src/main/java/visualiser/app/App.java +++ b/racevisionGame/src/main/java/visualiser/app/App.java @@ -26,6 +26,7 @@ import javafx.stage.Stage; import javafx.stage.StageStyle; import javafx.stage.WindowEvent; import javafx.util.Duration; +import mock.app.Event; import visualiser.gameController.Keys.KeyFactory; public class App extends Application { @@ -36,8 +37,9 @@ public class App extends Application { private Label progressText; private static final int SPLASH_WIDTH = 676; private static final int SPLASH_HEIGHT = 227; - public static KeyFactory keyFactory = new KeyFactory(); - public static App app; + public static KeyFactory keyFactory; + public static App app = new App(); + public static Event game; /** * Entry point for running the programme @@ -50,6 +52,7 @@ public class App extends Application { @Override public void init() { // load the user's personalised key bindings + keyFactory = new KeyFactory(); keyFactory.load(); ImageView splash = new ImageView(new Image( @@ -103,11 +106,9 @@ public class App extends Application { } Thread.sleep(100); updateMessage("Burger's done!"); - return addedFilling; } }; - showSplash( stage, boatTask, @@ -120,7 +121,6 @@ public class App extends Application { } ); new Thread(boatTask).start(); - } /** @@ -134,7 +134,7 @@ public class App extends Application { public void loadTitleScreen() throws Exception { stage = new Stage(); FXMLLoader loader = new FXMLLoader(getClass().getResource - ("/visualiser/scenes/titleScreen.fxml")); + ("/visualiser/scenes/title.fxml")); Parent root = loader.load(); stage.setResizable(false); Scene scene = new Scene(root); diff --git a/racevisionGame/src/main/java/visualiser/model/TrackPoint.java b/racevisionGame/src/main/java/visualiser/model/TrackPoint.java index f3378a43..60a07d3b 100644 --- a/racevisionGame/src/main/java/visualiser/model/TrackPoint.java +++ b/racevisionGame/src/main/java/visualiser/model/TrackPoint.java @@ -8,8 +8,8 @@ import shared.model.GPSCoordinate; * {@link VisualiserBoat Boat} has travelled in a race.
* TrackPoints are displayed on a * {@link ResizableRaceCanvas}, via the - * {@link visualiser.Controllers.RaceController}.
- * Track points can be made visible or hidden via the RaceController's + * {@link visualiser.Controllers.RaceViewController}.
+ * Track points can be made visible or hidden via the RaceViewController's * {@link Annotations}. */ public class TrackPoint { diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java b/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java index 555def15..12e2ee37 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java @@ -17,7 +17,7 @@ import java.util.List; * This class is used to represent and store information about a boat which may * travel around in a race. It is displayed on the * {@link ResizableRaceCanvas ResizableRaceCanvas} via the - * {@link visualiser.Controllers.RaceController RaceController}. + * {@link visualiser.Controllers.RaceViewController RaceViewController}. */ public class VisualiserBoat extends Boat { diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java index d5ab9b66..467499be 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java @@ -66,7 +66,7 @@ public class VisualiserRaceEvent { this.serverConnection = new ServerConnection(socket, visualiserRaceState, raceCommands, requestType); - this.serverConnectionThread = new Thread(serverConnection, "StartController.enterLobby()->serverConnection thread " + serverConnection); + this.serverConnectionThread = new Thread(serverConnection, "RaceStartController.enterLobby()->serverConnection thread " + serverConnection); this.serverConnectionThread.start(); diff --git a/racevisionGame/src/main/java/visualiser/network/ServerConnection.java b/racevisionGame/src/main/java/visualiser/network/ServerConnection.java index 5d6d8773..70cc7631 100644 --- a/racevisionGame/src/main/java/visualiser/network/ServerConnection.java +++ b/racevisionGame/src/main/java/visualiser/network/ServerConnection.java @@ -7,14 +7,12 @@ import network.MessageRouters.MessageRouter; import network.Messages.AC35Data; import network.Messages.Enums.MessageType; import network.Messages.Enums.RequestToJoinEnum; -import network.Messages.LatestMessages; import network.StreamRelated.MessageDeserialiser; import network.StreamRelated.MessageSerialiser; import shared.model.RunnableWithFramePeriod; -import visualiser.model.VisualiserRaceEvent; -import visualiser.model.VisualiserRaceController; import visualiser.enums.ConnectionToServerState; import visualiser.gameController.ControllerClient; +import visualiser.model.VisualiserRaceController; import visualiser.model.VisualiserRaceState; import java.io.IOException; @@ -310,7 +308,7 @@ public class ServerConnection implements RunnableWithFramePeriod { } - //TODO create input controller here. RaceController should query for it, if it exists. + //TODO create input controller here. RaceViewController should query for it, if it exists. private void createPlayerInputController() { this.messageRouter.addRoute(MessageType.BOATACTION, messageSerialiser.getMessagesToSend()); diff --git a/racevisionGame/src/main/resources/visualiser/scenes/arrow.fxml b/racevisionGame/src/main/resources/visualiser/scenes/arrow.fxml index 1721d988..196c4c10 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/arrow.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/arrow.fxml @@ -8,7 +8,7 @@ - + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/controls.fxml b/racevisionGame/src/main/resources/visualiser/scenes/controls.fxml deleted file mode 100644 index f82ffa17..00000000 --- a/racevisionGame/src/main/resources/visualiser/scenes/controls.fxml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml deleted file mode 100644 index ab14abaf..00000000 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/racevisionGame/src/main/resources/visualiser/scenes/keyBindings.fxml b/racevisionGame/src/main/resources/visualiser/scenes/keyBindings.fxml index 037efdab..40217567 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/keyBindings.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/keyBindings.fxml @@ -6,7 +6,7 @@ - + + + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml b/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml deleted file mode 100644 index 9e067b8e..00000000 --- a/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 0dff85006a2247d3fb7d6af31df161787267ce26 Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Fri, 8 Sep 2017 22:07:16 +1200 Subject: [PATCH 34/92] Changes to code to use new controller structure. - renamed javadoc referencing old controllers - keybindings no longer need to be static - finished lobby and lobbyhost controllers #story[1261] --- .../Controllers/ConnectionController.java | 2 +- .../{Controller2.java => Controller.java} | 6 ++-- .../Controllers/KeyBindingsController.java | 32 +++++++------------ .../Controllers/LobbyController.java | 2 +- .../Controllers/LobbyHostingController.java | 2 +- .../Controllers/NotificationController.java | 2 +- .../Controllers/RaceFinishController.java | 2 +- .../Controllers/RaceStartController.java | 2 +- .../Controllers/RaceViewController.java | 2 +- .../Controllers/TitleController.java | 2 +- .../src/main/java/visualiser/app/App.java | 11 ++----- .../gameController/InputChecker.java | 8 ++--- .../java/visualiser/model/Annotations.java | 2 +- .../visualiser/model/ResizableRaceCanvas.java | 2 +- .../main/java/visualiser/model/Sparkline.java | 2 +- 15 files changed, 31 insertions(+), 48 deletions(-) rename racevisionGame/src/main/java/visualiser/Controllers/{Controller2.java => Controller.java} (93%) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index dc4535e0..c95ce731 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -15,7 +15,7 @@ import java.util.ResourceBundle; /** * Controls the connection that the VIsualiser can connect to. */ -public class ConnectionController extends Controller2 { +public class ConnectionController extends Controller { @FXML AnchorPane connectionWrapper; @FXML TableView connectionTable; @FXML TableColumn hostnameColumn; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/Controller2.java b/racevisionGame/src/main/java/visualiser/Controllers/Controller.java similarity index 93% rename from racevisionGame/src/main/java/visualiser/Controllers/Controller2.java rename to racevisionGame/src/main/java/visualiser/Controllers/Controller.java index 74d8390a..23094fd7 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/Controller2.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/Controller.java @@ -15,7 +15,7 @@ import java.io.IOException; * Abstract controller class to give each subclass the functionality to load * a new scene into the existing stage, or create a new popup window. */ -public abstract class Controller2 { +public abstract class Controller { Stage stage = App.getStage(); protected void loadTitleScreen() throws IOException { @@ -33,7 +33,7 @@ public abstract class Controller2 { * @return the controller of the new scene * @throws IOException if there is an issue with the fxmlUrl */ - protected Controller2 loadScene(String fxmlUrl) throws IOException { + protected Controller loadScene(String fxmlUrl) throws IOException { // load the correct fxml file FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource @@ -66,7 +66,7 @@ public abstract class Controller2 { * @return the controller of the new scene * @throws IOException if there is an issue with the fxmlUrl */ - protected Controller2 loadPopupScene(String fxmlUrl, String title, Modality + protected Controller loadPopupScene(String fxmlUrl, String title, Modality modality) throws IOException { // load the correct fxml scene FXMLLoader loader = new FXMLLoader(); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java b/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java index 7da5a818..63e7ffda 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java @@ -3,9 +3,6 @@ package visualiser.Controllers; import javafx.application.Platform; import javafx.event.EventHandler; 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.ListView; import javafx.scene.input.KeyCode; @@ -21,12 +18,10 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; -import static visualiser.app.App.keyFactory; - /** * Controller for the scene used to display and update current key bindings. */ -public class KeyBindingsController extends Controller2 { +public class KeyBindingsController extends Controller { private @FXML Button btnSave; private @FXML Button btnCancel; private @FXML Button btnReset; @@ -34,12 +29,15 @@ public class KeyBindingsController extends Controller2 { private @FXML ListView lstKey; private @FXML ListView lstDescription; private @FXML AnchorPane anchor; + private KeyFactory existingKeyFactory; private KeyFactory newKeyFactory; private Boolean changed = false; // keyBindings have been modified private Button currentButton = null; // last button clicked public void initialize(){ // create new key factory to modify, keeping the existing one safe + existingKeyFactory = new KeyFactory(); + existingKeyFactory.load(); newKeyFactory = copyExistingFactory(); initializeTable(); populateTable(); @@ -106,7 +104,7 @@ public class KeyBindingsController extends Controller2 { */ public KeyFactory copyExistingFactory(){ newKeyFactory = new KeyFactory(); - Map oldKeyState = keyFactory.getKeyState(); + Map oldKeyState = existingKeyFactory.getKeyState(); Map newKeyState = new HashMap<>(); // copy over commands and their keys @@ -204,10 +202,10 @@ public class KeyBindingsController extends Controller2 { */ public void save(){ if (isFactoryValid()) { - keyFactory = newKeyFactory; + existingKeyFactory = newKeyFactory; newKeyFactory = new KeyFactory(); changed = false; - keyFactory.save(); // save persistently + existingKeyFactory.save(); // save persistently loadNotification("Key bindings were successfully saved.", false); } else { loadNotification("One or more key bindings are missing. " + @@ -251,22 +249,14 @@ public class KeyBindingsController extends Controller2 { * @param warning true if the message to be displayed is due to user error */ public void loadNotification(String message, Boolean warning){ - Parent root = null; - FXMLLoader loader = new FXMLLoader(getClass().getResource - ("/visualiser/scenes/notification.fxml")); try { - root = loader.load(); + NotificationController nc = (NotificationController) + loadPopupScene("notification.fxml", + "", Modality.APPLICATION_MODAL); + nc.setMessage(message, warning); } catch (IOException e) { e.printStackTrace(); } - NotificationController controller = loader.getController(); - Stage stage = new Stage(); - stage.setScene(new Scene(root)); - stage.centerOnScreen(); - stage.initModality(Modality.APPLICATION_MODAL); - stage.show(); - // displays given message in the window - controller.setMessage(message, warning); } } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index 2230bbdb..6a4fc447 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -15,7 +15,7 @@ import java.net.Socket; /** * Controller for the Lobby for entering games */ -public class LobbyController extends Controller2 { +public class LobbyController extends Controller { private @FXML TableView lobbyTable; private @FXML TableColumn gameNameColumn; private @FXML TableColumn hostNameColumn; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java index dd2fcb89..9462ad4d 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java @@ -28,7 +28,7 @@ import java.util.logging.Logger; /** * Controller for Hosting a game. */ -public class LobbyHostingController extends Controller2 { +public class LobbyHostingController extends Controller { private @FXML ImageView imageView; private @FXML AnchorPane imagePane; private @FXML SplitPane splitPane; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/NotificationController.java b/racevisionGame/src/main/java/visualiser/Controllers/NotificationController.java index d122ec80..ce3c25ee 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/NotificationController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/NotificationController.java @@ -9,7 +9,7 @@ import javafx.stage.Stage; /** * Controller for a popup notification regarding user activity. */ -public class NotificationController { +public class NotificationController extends Controller{ private @FXML Label lblDescription; private @FXML Text txtMessage; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceFinishController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceFinishController.java index 659af532..29d2b290 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceFinishController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceFinishController.java @@ -10,7 +10,7 @@ import visualiser.model.VisualiserBoat; /** * Finish Screen for when the race finishes. */ -public class RaceFinishController extends Controller2 { +public class RaceFinishController extends Controller { private @FXML TableView boatInfoTable; private @FXML TableColumn boatRankColumn; private @FXML TableColumn boatNameColumn; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceStartController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceStartController.java index fbf23a58..34057d41 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceStartController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceStartController.java @@ -22,7 +22,7 @@ import java.util.logging.Logger; /** * Controller to for waiting for the race to start. */ -public class RaceStartController extends Controller2 { +public class RaceStartController extends Controller { private @FXML Label raceTitleLabel; private @FXML Label raceStartLabel; private @FXML Label timeZoneTime; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java index b6836665..45ce8146 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java @@ -32,7 +32,7 @@ import java.util.logging.Logger; /** * Controller used to display a running race. */ -public class RaceViewController extends Controller2 { +public class RaceViewController extends Controller { private VisualiserRaceEvent visualiserRace; private VisualiserRaceState raceState; private ControllerClient controllerClient; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java index 42925021..68fefe98 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java @@ -12,7 +12,7 @@ import java.io.IOException; * burger-boat and comic sans styling to allure and entice users into playing * the game. */ -public class TitleController extends Controller2 { +public class TitleController extends Controller { private @FXML RadioButton dayModeRD; private @FXML RadioButton nightModeRD; diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java index 9cd9794b..c8c8d1f3 100644 --- a/racevisionGame/src/main/java/visualiser/app/App.java +++ b/racevisionGame/src/main/java/visualiser/app/App.java @@ -27,19 +27,16 @@ import javafx.stage.StageStyle; import javafx.stage.WindowEvent; import javafx.util.Duration; import mock.app.Event; -import visualiser.gameController.Keys.KeyFactory; public class App extends Application { - private static Stage stage; + public static Event game; private Pane splashLayout; private ProgressBar loadProgress; private Label progressText; private static final int SPLASH_WIDTH = 676; private static final int SPLASH_HEIGHT = 227; - public static KeyFactory keyFactory; - public static App app = new App(); - public static Event game; + /** * Entry point for running the programme @@ -51,10 +48,6 @@ public class App extends Application { @Override public void init() { - // load the user's personalised key bindings - keyFactory = new KeyFactory(); - keyFactory.load(); - ImageView splash = new ImageView(new Image( getClass().getClassLoader().getResourceAsStream("images/splashScreen.png") )); diff --git a/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java index b4b3de9b..88cdcb74 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java +++ b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java @@ -3,15 +3,14 @@ package visualiser.gameController; import javafx.animation.AnimationTimer; import javafx.scene.Scene; import visualiser.gameController.Keys.ControlKey; - +import visualiser.gameController.Keys.KeyFactory; import java.util.HashMap; -import static visualiser.app.App.keyFactory; - /** * Class for checking what keys are currently being used */ public class InputChecker { + private KeyFactory keyFactory; private HashMap currentlyActiveKeys = new HashMap<>(); /** @@ -19,7 +18,8 @@ public class InputChecker { * @param scene Scene the controller is to run in parallel with. */ public void runWithScene(Scene scene){ -// KeyFactory keyFactory = KeyFactory.getFactory(); + KeyFactory keyFactory = new KeyFactory(); + keyFactory.load(); scene.setOnKeyPressed(event -> { String codeString = event.getCode().toString(); diff --git a/racevisionGame/src/main/java/visualiser/model/Annotations.java b/racevisionGame/src/main/java/visualiser/model/Annotations.java index 54976c35..f5f2c46d 100644 --- a/racevisionGame/src/main/java/visualiser/model/Annotations.java +++ b/racevisionGame/src/main/java/visualiser/model/Annotations.java @@ -15,7 +15,7 @@ import java.util.Map; * Class that processes user selected annotation visibility options to * display the requested information on the * {@link ResizableRaceCanvas}. These are displayed - * via the {@link visualiser.Controllers.RaceController}.
+ * via the {@link visualiser.Controllers.RaceViewController}.
* Annotation options for a {@link VisualiserBoat} include: its name, * abbreviation, speed, the time since it passed the last * {@link shared.model.Mark}, estimated time to the next marker, diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index 03e86e27..0618cd6a 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -18,7 +18,7 @@ import java.util.List; /** * This JavaFX Canvas is used to update and display details for a * {@link RaceMap} via the - * {@link visualiser.Controllers.RaceController}.
+ * {@link visualiser.Controllers.RaceViewController}.
* It fills it's parent and cannot be downsized.
* Details displayed include: * {@link VisualiserBoat}s (and their diff --git a/racevisionGame/src/main/java/visualiser/model/Sparkline.java b/racevisionGame/src/main/java/visualiser/model/Sparkline.java index 3f7e07b8..e50931be 100644 --- a/racevisionGame/src/main/java/visualiser/model/Sparkline.java +++ b/racevisionGame/src/main/java/visualiser/model/Sparkline.java @@ -21,7 +21,7 @@ import java.util.Map; * placing position as they complete each {@link shared.model.Leg} by * passing a course {@link shared.model.Mark}.
* This sparkline is displayed using the - * {@link visualiser.Controllers.RaceController}. + * {@link visualiser.Controllers.RaceViewController}. */ public class Sparkline { From 1ed7ccf146d649a2b333406f4ee3b198fe822987 Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Sat, 9 Sep 2017 10:44:19 +1200 Subject: [PATCH 35/92] Minor changes preparing to merge in 3D #story[1261] --- .../Controllers/ConnectionController.java | 3 +- .../Controllers/KeyBindingsController.java | 37 +++++++++---------- .../Controllers/LobbyHostingController.java | 2 - .../Controllers/RaceViewController.java | 2 - 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index c95ce731..7c9269e3 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -6,6 +6,7 @@ import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.layout.AnchorPane; import visualiser.model.RaceConnection; + import java.io.IOException; import java.net.Socket; import java.net.URL; @@ -13,7 +14,7 @@ import java.util.ResourceBundle; //TODO it appears this view/controller was replaced by Lobby.fxml. Remove? /** - * Controls the connection that the VIsualiser can connect to. + * Controls the connection that the Visualiser can connect to. */ public class ConnectionController extends Controller { @FXML AnchorPane connectionWrapper; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java b/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java index 63e7ffda..b8359aad 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java @@ -1,7 +1,6 @@ package visualiser.Controllers; import javafx.application.Platform; -import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ListView; @@ -49,7 +48,7 @@ public class KeyBindingsController extends Controller { * Sets up table before populating it. * Set up includes headings, CSS styling and modifying default properties. */ - public void initializeTable(){ + private void initializeTable(){ // set the headings for each column lstKey.getItems().add("Key"); lstControl.getItems().add("Command"); @@ -67,15 +66,15 @@ public class KeyBindingsController extends Controller { // stop the columns from being selectable, so only the buttons are lstKey.getSelectionModel().selectedItemProperty() - .addListener((observable, oldvalue, newValue) -> + .addListener((observable, oldValue, newValue) -> Platform.runLater(() -> lstKey.getSelectionModel().select(0))); lstDescription.getSelectionModel().selectedItemProperty() - .addListener((observable, oldvalue, newValue) -> + .addListener((observable, oldValue, newValue) -> Platform.runLater(() -> lstDescription.getSelectionModel().select(0))); lstControl.getSelectionModel().selectedItemProperty() - .addListener((observable, oldvalue, newValue) -> + .addListener((observable, oldValue, newValue) -> Platform.runLater(() -> lstControl.getSelectionModel().select(0))); } @@ -83,7 +82,7 @@ public class KeyBindingsController extends Controller { /** * Populates the table with commands and their key binding details. */ - public void populateTable(){ + private void populateTable(){ // add each command to the table for (Map.Entry entry : newKeyFactory.getKeyState().entrySet()) { // create button for command @@ -100,9 +99,9 @@ public class KeyBindingsController extends Controller { /** * Makes a copy of the {@link KeyFactory} that does not modify the original. - * @return new keyfactory to be modified + * @return new keyFactory to be modified */ - public KeyFactory copyExistingFactory(){ + private KeyFactory copyExistingFactory(){ newKeyFactory = new KeyFactory(); Map oldKeyState = existingKeyFactory.getKeyState(); Map newKeyState = new HashMap<>(); @@ -118,18 +117,16 @@ public class KeyBindingsController extends Controller { /** * Creates a listener for when a user tries to close the current window. */ - public void setClosedListener(){ + private void setClosedListener(){ anchor.sceneProperty().addListener((obsS, oldS, newS) -> { if (newS != null) { newS.windowProperty().addListener((obsW, oldW, newW) -> { if (newW != null) { Stage stage = (Stage)newW; // WE is processed by onExit method - stage.setOnCloseRequest(new EventHandler() { - public void handle(WindowEvent we) { - if (we.getEventType() == WindowEvent.WINDOW_CLOSE_REQUEST) { - onExit(we); - } + stage.setOnCloseRequest(we -> { + if (we.getEventType() == WindowEvent.WINDOW_CLOSE_REQUEST) { + onExit(we); } }); } @@ -139,11 +136,11 @@ public class KeyBindingsController extends Controller { } /** - * Creates a listener for the base anchorpane for key presses. + * Creates a listener for the base anchorPane for key presses. * It updates the current key bindings of the {@link KeyFactory} if * required. */ - public void setKeyListener(){ + private void setKeyListener(){ anchor.addEventFilter(KeyEvent.KEY_PRESSED, event -> { // if esc, cancel current button click if (event.getCode() == KeyCode.ESCAPE){ @@ -218,10 +215,10 @@ public class KeyBindingsController extends Controller { * commands are missing a key binding. * @return True if valid, false if invalid */ - public Boolean isFactoryValid(){ + private Boolean isFactoryValid(){ for (Map.Entry entry : newKeyFactory.getKeyState().entrySet ()) { - if (entry.getKey().toString()==entry.getValue().toString()){ + if (entry.getKey().toString().equals(entry.getValue().toString())){ return false; } } @@ -234,7 +231,7 @@ public class KeyBindingsController extends Controller { * @param we {@link WindowEvent} close request to be consumed if settings * have not been successfully saved. */ - public void onExit(WindowEvent we){ + private void onExit(WindowEvent we){ // if modified KeyFactory hasn't been saved if (changed){ loadNotification("Please cancel or save your changes before exiting" + @@ -248,7 +245,7 @@ public class KeyBindingsController extends Controller { * @param message the message to be displayed to the user * @param warning true if the message to be displayed is due to user error */ - public void loadNotification(String message, Boolean warning){ + private void loadNotification(String message, Boolean warning){ try { NotificationController nc = (NotificationController) loadPopupScene("notification.fxml", diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java index 9462ad4d..fdbfea6a 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyHostingController.java @@ -112,8 +112,6 @@ public class LobbyHostingController extends Controller { alert.setHeaderText("You are about to quit the race"); Optional result = alert.showAndWait(); if(result.get() == ButtonType.OK){ -// getStage().close(); -// App.app.loadTitleScreen(); loadTitleScreen(); } } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java index 45ce8146..1b787e2f 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java @@ -120,8 +120,6 @@ public class RaceViewController extends Controller { loadTitleScreen(); } } - } catch (IOException e) { - e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } From ddc3a6ae4759d494c308081d6cebe9078fabe508 Mon Sep 17 00:00:00 2001 From: hba56 Date: Sat, 9 Sep 2017 16:26:17 +1200 Subject: [PATCH 36/92] boxes in lobby are now boats --- .../src/main/java/shared/model/Constants.java | 2 +- .../Controllers/InGameLobbyController.java | 14 +- .../main/java/visualiser/layout/View3D.java | 259 +++++++++++++++++- 3 files changed, 269 insertions(+), 6 deletions(-) diff --git a/racevisionGame/src/main/java/shared/model/Constants.java b/racevisionGame/src/main/java/shared/model/Constants.java index 18a2aaed..54a4e264 100644 --- a/racevisionGame/src/main/java/shared/model/Constants.java +++ b/racevisionGame/src/main/java/shared/model/Constants.java @@ -46,7 +46,7 @@ public class Constants { * The race preparatory time, in milliseconds. 1 minute. */ // public static final long RacePreparatoryTime = 60 * 1000; - public static final long RacePreparatoryTime = 3 * 1000; + public static final long RacePreparatoryTime = 1* 60 * 1000; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java index 9f152728..e2f0f787 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java @@ -1,5 +1,6 @@ package visualiser.Controllers; +import com.interactivemesh.jfx.importer.stl.StlMeshImporter; import javafx.animation.AnimationTimer; import javafx.application.Platform; import javafx.collections.FXCollections; @@ -12,6 +13,7 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.shape.Box; +import javafx.scene.shape.MeshView; import mock.app.Event; import network.Messages.Enums.RaceStatusEnum; import network.Messages.Enums.RequestToJoinEnum; @@ -78,6 +80,8 @@ public class InGameLobbyController extends Controller { private ObservableList subjects = FXCollections.observableArrayList(); + private StlMeshImporter importer; + @Override public void initialize(URL location, ResourceBundle resources) { allPlayerLabels = new ArrayList(Arrays.asList(playerLabel, playerLabel2, @@ -85,6 +89,10 @@ public class InGameLobbyController extends Controller { playerLabel4, playerLabel5, playerLabel6)); + + URL asset = HostController.class.getClassLoader().getResource("assets/V1.2 Complete Boat.stl"); + importer = new StlMeshImporter(); + importer.read(asset); } private void populatePlayers(ListChangeListener.Change change){ @@ -98,10 +106,12 @@ public class InGameLobbyController extends Controller { for (VisualiserBoat boat :this.visualiserRaceEvent.getVisualiserRaceState().getBoats()) { View3D playerBoatToSet = new View3D(); playerBoatToSet.setItems(subjects); + playerContainer.add(playerBoatToSet, (count % 3) , row); playerContainer.setMargin(playerBoatToSet, new Insets(10, 10, 10, 10)); - Subject3D subject = new Subject3D(new Box()); + MeshView mesh = new MeshView(importer.getImport()); + Subject3D subject = new Subject3D(mesh); subjects.add(subject); playerBoatToSet.setDistance(50); @@ -113,7 +123,7 @@ public class InGameLobbyController extends Controller { AnimationTimer rotate = new AnimationTimer() { @Override public void handle(long now) { - subject.setHeading(subject.getHeading() + 0.1); + subject.setHeading(subject.getHeading().getAngle() + 0.1); } }; rotate.start(); diff --git a/racevisionGame/src/main/java/visualiser/layout/View3D.java b/racevisionGame/src/main/java/visualiser/layout/View3D.java index e7635498..6b5db309 100644 --- a/racevisionGame/src/main/java/visualiser/layout/View3D.java +++ b/racevisionGame/src/main/java/visualiser/layout/View3D.java @@ -1,7 +1,260 @@ package visualiser.layout; +import javafx.beans.value.ChangeListener; +import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; +import javafx.scene.Group; +import javafx.scene.PerspectiveCamera; +import javafx.scene.SubScene; +import javafx.scene.input.PickResult; +import javafx.scene.layout.Pane; +import javafx.scene.paint.Color; +import javafx.scene.shape.Shape3D; +import javafx.scene.transform.Rotate; +import javafx.scene.transform.Translate; + +import java.util.HashMap; +import java.util.Map; + /** - * Created by hba56 on 9/09/17. + * Control for rendering 3D objects visible through a PerspectiveCamera. Implements Adapter Pattern to + * interface with camera, and allows clients to add shapes to the scene. All scenes contain sea plane and + * sky box, whose textures are set with special methods. */ -public class View3D { -} +public class View3D extends Pane { + /** + * Container for group and camera + */ + private SubScene scene; + /** + * Observable list of renderable items + */ + private ObservableList items; + /** + * Map for selecting Subject3D from Shape3D + */ + private Map selectionMap; + /** + * Subject tracked by camera + */ + private Subject3D target; + /** + * Rendering container for shapes + */ + private Group world; + /** + * Near limit of view frustum + */ + private double nearClip; + /** + * Far limit of view frustum + */ + private double farClip; + /** + * Camera origin + */ + private Translate pivot; + /** + * Distance of camera from pivot point + */ + private Translate distance; + /** + * Angle along ground between z-axis and camera + */ + private Rotate yaw; + /** + * Angle between ground plane and camera direction + */ + private Rotate pitch; + /** + * Single listener for subject heading changes + */ + private ChangeListener pivotHeading = (o, prev, curr) -> yaw.setAngle((double)curr); + /** + * Single listener for subject position (x) changes + */ + private ChangeListener pivotX = (o, prev, curr) -> pivot.setX((double)curr); + /** + * Single listener for subject position (y) changes + */ + private ChangeListener pivotY = (o, prev, curr) -> pivot.setY((double)curr); + /** + * Single listener for subject position (z) changes + */ + private ChangeListener pivotZ = (o, prev, curr) -> pivot.setZ((double)curr); + /** + * Distance to switch from third person to bird's eye + */ + private double THIRD_PERSON_LIMIT = 100; + + /** + * Default constructor for View3D. Sets up Scene and PerspectiveCamera. + */ + public View3D() { + this.world = new Group(); + this.selectionMap = new HashMap<>(); + this.target = null; + this.scene = new SubScene(world, 300, 300); + + scene.widthProperty().bind(this.widthProperty()); + scene.heightProperty().bind(this.heightProperty()); + scene.setFill(new Color(0.2, 0.6, 1, 1)); + + scene.setCamera(buildCamera()); + + this.getChildren().add(scene); + } + + /** + * Sets up camera view frustum and binds transformations + * @return perspective camera + */ + private PerspectiveCamera buildCamera() { + PerspectiveCamera camera = new PerspectiveCamera(true); + + // Set up view frustum + nearClip = 0.1; + farClip = 3000.0; + camera.setNearClip(nearClip); + camera.setFarClip(farClip); + + // Set up transformations + pivot = new Translate(); + distance = new Translate(); + yaw = new Rotate(0, Rotate.Y_AXIS); + pitch = new Rotate(0, Rotate.X_AXIS); + camera.getTransforms().addAll(pivot, yaw, pitch, distance); + + return camera; + } + + /** + * Provide the list of subjects to be automatically added or removed from the view as the list + * changes. + * @param items list managed by client + */ + public void setItems(ObservableList items) { + this.items = items; + this.items.addListener((ListChangeListener) c -> { + while(c.next()) { + if (c.wasRemoved() || c.wasAdded()) { + for (Subject3D shape : c.getRemoved()) { + world.getChildren().remove(shape.getMesh()); + selectionMap.remove(shape.getMesh()); + } + for (Subject3D shape : c.getAddedSubList()) { + world.getChildren().add(shape.getMesh()); + selectionMap.put(shape.getMesh(), shape); + } + } + } + }); + } + + /** + * Intercept mouse clicks on subjects in view. The applied listener cannot be removed. + */ + public void enableTracking() { + scene.setOnMousePressed(e -> { + PickResult result = e.getPickResult(); + if(result != null && result.getIntersectedNode() != null && result.getIntersectedNode() instanceof Shape3D) { + trackSubject(selectionMap.get(result.getIntersectedNode())); + } + }); + } + + /** + * Stop camera from following the last selected subject + */ + private void untrackSubject() { + if(target != null) { + target.getPosition().xProperty().removeListener(pivotX); + target.getPosition().yProperty().removeListener(pivotY); + target.getPosition().zProperty().removeListener(pivotZ); + target.getHeading().angleProperty().removeListener(pivotHeading); + } + } + + /** + * Set camera to follow the selected subject + * @param subject to track + */ + private void trackSubject(Subject3D subject) { + untrackSubject(); + target = subject; + + updatePivot(target.getPosition()); + setYaw(target.getHeading().getAngle()); + + target.getPosition().xProperty().addListener(pivotX); + target.getPosition().yProperty().addListener(pivotY); + target.getPosition().zProperty().addListener(pivotZ); + target.getHeading().angleProperty().addListener(pivotHeading); + + this.setDistance(THIRD_PERSON_LIMIT); + this.setPitch(20); + } + + public void setNearClip(double nearClip) { + this.nearClip = nearClip; + } + + public void setFarClip(double farClip) { + this.farClip = farClip; + } + + /** + * Sets the coordinates of the camera pivot once. + * @param pivot source of coordinates + */ + public void updatePivot(Translate pivot) { + this.pivot.setX(pivot.getX()); + this.pivot.setY(pivot.getY()); + this.pivot.setZ(pivot.getZ()); + } + + /** + * Set distance of camera from pivot + * @param distance in units + */ + public void setDistance(double distance) { + this.distance.setZ(-distance); + } + + /** + * Adds delta to current distance and changes camera mode if applicable. + * Third person limit specifies the distance at which a third person camera + * switches to bird's-eye, remaining focused on the same position. + * @param delta amount to change distance by + */ + public void updateDistance(double delta) { + double distance = -this.distance.getZ() + delta; + + if(distance <= 0) { + this.setDistance(0); + } else if(distance > THIRD_PERSON_LIMIT) { + untrackSubject(); + this.setYaw(0); + this.setPitch(60); + this.setDistance(distance); + } else { + this.setDistance(distance); + } + } + + /** + * Set angle of camera from z-axis along ground + * @param yaw in degrees + */ + public void setYaw(double yaw) { + this.yaw.setAngle(yaw); + } + + /** + * Set elevation of camera + * @param pitch in degrees + */ + public void setPitch(double pitch) { + this.pitch.setAngle(-pitch); + } +} \ No newline at end of file From 346aa148ef495a7fb06cf4c420568f2b9a0b970c Mon Sep 17 00:00:00 2001 From: fjc40 Date: Mon, 11 Sep 2017 11:35:11 +1200 Subject: [PATCH 37/92] Added some debug statements, and WIP MarkRoundingSequence class. Temporarily disabled source id allocator time checks. Added mark rounding stuff to race canvas to help debug. #story[1185] --- .../src/main/java/mock/model/MockRace.java | 64 ++++++++--- .../java/mock/model/SourceIdAllocator.java | 4 +- .../main/java/shared/model/CompoundMark.java | 2 +- .../src/main/java/shared/model/Constants.java | 2 +- .../shared/model/MarkRoundingSequence.java | 78 ++++++++++++++ .../visualiser/model/ResizableRaceCanvas.java | 101 +++++++++++++++--- 6 files changed, 217 insertions(+), 34 deletions(-) create mode 100644 racevisionGame/src/main/java/shared/model/MarkRoundingSequence.java diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index a9f11770..c598eb05 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -8,6 +8,7 @@ import network.Messages.BoatLocation; import network.Messages.BoatStatus; import network.Messages.Enums.BoatStatusEnum; import network.Messages.Enums.RaceStatusEnum; +import network.Utils.AC35UnitConverter; import shared.dataInput.BoatDataSource; import shared.dataInput.RaceDataSource; import shared.dataInput.RegattaDataSource; @@ -524,12 +525,22 @@ public class MockRace extends RaceState { boolean gateCheck = boat.getCurrentLeg().getEndCompoundMark().getMark2() == null || boat.isBetweenGate(boat.getCurrentLeg().getEndCompoundMark()); Mark roundingMark = boat.getCurrentLeg().getEndCompoundMark().getMarkForRounding(legBearing); + System.out.println("boat rounding state: " + boat.getRoundingStatus());//TEMP REMOVE + switch (boat.getRoundingStatus()) { case 0://hasn't started rounding + System.out.println("portside? " + boat.isPortSide(roundingMark));//TEMP REMOVE + System.out.println("passes line? " + GPSCoordinate.passesLine(roundingMark.getPosition(), roundingChecks.get(0), boat.getPosition(), legBearing));//TEMP REMOVE + System.out.println("gatecheck? " + gateCheck);//TEMP REMOVE + System.out.println("between gates? " + boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(0))));//TEMP REMOVE if (boat.isPortSide(roundingMark) && - GPSCoordinate.passesLine(roundingMark.getPosition(), - roundingChecks.get(0), boat.getPosition(), legBearing) && - gateCheck && boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(0)))) { + GPSCoordinate.passesLine( + roundingMark.getPosition(), + roundingChecks.get(0), + boat.getPosition(), + legBearing) && + gateCheck && + boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(0)))) { boat.increaseRoundingStatus(); if (boat.getCurrentLeg().getLegNumber() + 2 >= getLegs().size()){ //boat has finished race @@ -539,8 +550,10 @@ public class MockRace extends RaceState { break; case 1://has been parallel to the mark; if (boat.isPortSide(roundingMark) && - GPSCoordinate.passesLine(roundingMark.getPosition(), - roundingChecks.get(1), boat.getPosition(), + GPSCoordinate.passesLine( + roundingMark.getPosition(), + roundingChecks.get(1), + boat.getPosition(), Bearing.fromDegrees(legBearing.degrees() - 90)) &&//negative 90 from bearing because of port rounding boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(1)))) { boat.increaseRoundingStatus(); @@ -568,6 +581,8 @@ public class MockRace extends RaceState { boolean gateCheck = boat.getCurrentLeg().getEndCompoundMark().getMark2() == null || boat.isBetweenGate(boat.getCurrentLeg().getEndCompoundMark()); Mark roundingMark = boat.getCurrentLeg().getEndCompoundMark().getMarkForRounding(legBearing); + System.out.println("boat rounding state: " + boat.getRoundingStatus());//TEMP REMOVE + switch (boat.getRoundingStatus()) { case 0://hasn't started rounding if (boat.isStarboardSide(roundingMark) && @@ -606,19 +621,27 @@ public class MockRace extends RaceState { */ protected void checkPosition(MockBoat boat, long timeElapsed) { //The distance, in nautical miles, within which the boat needs to get in order to consider that it has reached the marker. - double epsilonNauticalMiles = boat.getCurrentLeg().getEndCompoundMark().getRoundingDistance(); //250 meters. + double epsilonMeters = boat.getCurrentLeg().getEndCompoundMark().getRoundingDistance(); //250 meters. + //System.out.println("epsilon dist meters: " + epsilonMeters);//TEMP REMOVE + + //System.out.println("boat dist to next point NM: " + boat.calculateDistanceToNextMarker());//TEMP REMOVE + + double epsilonNM = epsilonMeters / Constants.NMToMetersConversion; - if (boat.calculateDistanceToNextMarker() < epsilonNauticalMiles) { + //System.out.println("epsilon NM: " + epsilonNM);//TEMP REMOVE + + if (boat.calculateDistanceToNextMarker() < epsilonNM) { //Boat is within an acceptable distance from the mark. - GPSCoordinate startDirectionLinePoint = boat.getCurrentLeg().getStartCompoundMark().getMark1Position(); - GPSCoordinate endDirectionLinePoint = boat.getCurrentLeg().getEndCompoundMark().getMark1Position(); + GPSCoordinate startDirectionLinePoint = boat.getCurrentLeg().getStartCompoundMark().getAverageGPSCoordinate(); + GPSCoordinate endDirectionLinePoint = boat.getCurrentLeg().getEndCompoundMark().getAverageGPSCoordinate(); Bearing bearingOfDirectionLine = GPSCoordinate.calculateBearing(startDirectionLinePoint, endDirectionLinePoint); //use the direction line to create three invisible points that act as crossover lines a boat must cross //to round a mark double bearingToAdd; + //System.out.println("leg: " + boat.getCurrentLeg().getName() + " has bearing DL of: " + bearingOfDirectionLine.degrees());//TEMP REMOVE if (boat.getCurrentLeg().getEndCompoundMark().getRoundingType() == RoundingType.Port || boat.getCurrentLeg().getEndCompoundMark().getRoundingType() == RoundingType.SP){ bearingToAdd = 90; @@ -626,25 +649,32 @@ public class MockRace extends RaceState { bearingToAdd = -90; } - GPSCoordinate roundCheck1 = GPSCoordinate.calculateNewPosition(endDirectionLinePoint, - epsilonNauticalMiles, Azimuth.fromDegrees(bearingOfDirectionLine.degrees() + bearingToAdd)); + //System.out.println("so new bearing is " + (bearingToAdd + bearingOfDirectionLine.degrees()));//TEMP REMOVE + + GPSCoordinate roundCheck1 = GPSCoordinate.calculateNewPosition( + endDirectionLinePoint, + epsilonMeters, + Azimuth.fromDegrees(bearingOfDirectionLine.degrees() + bearingToAdd) ); + //System.out.println("this has a rounding coordinate of (" + roundCheck1.getLongitude() + ", " + roundCheck1.getLatitude() + ")");//TEMP REMOVE GPSCoordinate roundCheck2; try{ Leg nextLeg = getLegs().get(getLegs().indexOf(boat.getCurrentLeg()) + 1); - GPSCoordinate startNextDirectionLinePoint = nextLeg.getStartCompoundMark().getMark1Position(); - GPSCoordinate endNextDirectionLinePoint = nextLeg.getEndCompoundMark().getMark1Position(); + GPSCoordinate startNextDirectionLinePoint = nextLeg.getStartCompoundMark().getAverageGPSCoordinate(); + GPSCoordinate endNextDirectionLinePoint = nextLeg.getEndCompoundMark().getAverageGPSCoordinate(); Bearing bearingOfNextDirectionLine = GPSCoordinate.calculateBearing(startNextDirectionLinePoint, endNextDirectionLinePoint); - roundCheck2 = GPSCoordinate.calculateNewPosition(endDirectionLinePoint, - epsilonNauticalMiles, Azimuth.fromDegrees(bearingOfNextDirectionLine.degrees() + bearingToAdd)); + roundCheck2 = GPSCoordinate.calculateNewPosition( + endDirectionLinePoint, + epsilonMeters, + Azimuth.fromDegrees(bearingOfNextDirectionLine.degrees() + bearingToAdd) ); }catch(NullPointerException e){ //this is caused by the last leg not being having a leg after it roundCheck2 = roundCheck1; } - List roundingChecks = new ArrayList(Arrays.asList(roundCheck1, roundCheck2)); + List roundingChecks = new ArrayList<>(Arrays.asList(roundCheck1, roundCheck2)); switch (boat.getCurrentLeg().getEndCompoundMark().getRoundingType()) { case SP://Not yet implemented so these gates will be rounded port side @@ -657,6 +687,8 @@ public class MockRace extends RaceState { break; } + System.out.println("resultant boat rounding state: " + boat.getRoundingStatus());//TEMP REMOVE + //Check if the boat has finished or stopped racing. if (this.isLastLeg(boat.getCurrentLeg())) { diff --git a/racevisionGame/src/main/java/mock/model/SourceIdAllocator.java b/racevisionGame/src/main/java/mock/model/SourceIdAllocator.java index 17a7e85f..ed36093c 100644 --- a/racevisionGame/src/main/java/mock/model/SourceIdAllocator.java +++ b/racevisionGame/src/main/java/mock/model/SourceIdAllocator.java @@ -36,10 +36,10 @@ public class SourceIdAllocator { */ public synchronized int allocateSourceID() throws SourceIDAllocationException { - if (!((mockRace.getRaceStatusEnum() == RaceStatusEnum.PRESTART) + /*if (!((mockRace.getRaceStatusEnum() == RaceStatusEnum.PRESTART) || (mockRace.getRaceStatusEnum() == RaceStatusEnum.WARNING))) { throw new SourceIDAllocationException("Could not allocate a source ID. Can only allocate during pre-start period. It is currently: " + mockRace.getRaceStatusEnum()); - } + }*///TEMP DISABLED FOR TESTING - RE-ENABLE THIS List allocatedIDs = mockRace.getRaceDataSource().getParticipants(); List allIDs = new ArrayList<>(mockRace.getBoatDataSource().getBoats().keySet()); diff --git a/racevisionGame/src/main/java/shared/model/CompoundMark.java b/racevisionGame/src/main/java/shared/model/CompoundMark.java index 4fa2599c..57d9a32b 100644 --- a/racevisionGame/src/main/java/shared/model/CompoundMark.java +++ b/racevisionGame/src/main/java/shared/model/CompoundMark.java @@ -187,7 +187,7 @@ public class CompoundMark extends XMLCompoundMark{ } //finds the mark furthest west and east - if(this.getMark1Position().getLongitude() > this.getMark2Position().getLongitude()){ + if(this.getMark1Position().getLongitude() < this.getMark2Position().getLongitude()){ westMostMark = this.mark1; eastMostMark = this.mark2; }else{ diff --git a/racevisionGame/src/main/java/shared/model/Constants.java b/racevisionGame/src/main/java/shared/model/Constants.java index bb7ec598..247b4c9b 100644 --- a/racevisionGame/src/main/java/shared/model/Constants.java +++ b/racevisionGame/src/main/java/shared/model/Constants.java @@ -33,7 +33,7 @@ public class Constants { * Frame periods are multiplied by this to get the amount of time a single frame represents. * E.g., frame period = 20ms, scale = 5, frame represents 20 * 5 = 100ms, and so boats are simulated for 100ms, even though only 20ms actually occurred. */ - public static final int RaceTimeScale = 2;//10; + public static final int RaceTimeScale = 10;//10; /** * The race pre-start time, in milliseconds. 3 minutes. diff --git a/racevisionGame/src/main/java/shared/model/MarkRoundingSequence.java b/racevisionGame/src/main/java/shared/model/MarkRoundingSequence.java new file mode 100644 index 00000000..48fc3999 --- /dev/null +++ b/racevisionGame/src/main/java/shared/model/MarkRoundingSequence.java @@ -0,0 +1,78 @@ +package shared.model; + +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * This class contains a sequence of points that describe the mark rounding order for a course. + */ +public class MarkRoundingSequence { + + + /** + * Legs in the race. + */ + private List legs; + + /** + * For each leg, a sequence of rounding points. + */ + private Map> roundingPoints; + + + + public MarkRoundingSequence(List legs) { + this.legs = legs; + generateRoundingPoints(); + } + + + /** + * Generates the rounding points for all legs in the race. + */ + private void generateRoundingPoints() { + this.roundingPoints = new HashMap<>(this.legs.size()); + + for (int i = 0; i < this.legs.size(); i++) { + Leg currentLeg = this.legs.get(i); + Optional nextLeg = Optional.ofNullable(this.legs.get(i + 1)); + + generateRoundingPoint(currentLeg, nextLeg); + } + + } + + + /** + * Generates the rounding points for a specific leg. + * @param currentLeg The leg to generate rounding points for. + * @param nextLeg The following leg, used to help generate rounding points. + */ + private void generateRoundingPoint(Leg currentLeg, Optional nextLeg) { + + + + + + + + //Rounding points: + + //each mark/gate has a specific mark to round. Call this ROUNDINGMARK + // with a mark, it is the mark + // with a gate, it depends if it is a starboard or port gate. + // it is the mark that allows the boat to enter between both marks of the gate, whilst obeying the starboard/port requirement. + + //let the bearing between start of leg and end of leg be called LEGBEARING + + //the first rounding point is ROUNDINGDISTANCE units away from the ROUNDINGMARK, on an angle perpendicular to LEGBEARING. + // the angle means that the rounding mark is at the center of a gate, for gates. + + //the second rounding point is the same as the first, except LEGBEARING is the bearing between end of current leg, and start of next leg. + } + +} diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index 03e86e27..3f475e63 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -325,18 +325,6 @@ public class ResizableRaceCanvas extends ResizableCanvas { } - - -/* - //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)) { - boat.setTimeAtLastMark(visualiserRace.getVisualiserRaceState().getRaceClock().getCurrentTime()); - } -*/ - - - - } /** @@ -504,6 +492,87 @@ public class ResizableRaceCanvas extends ResizableCanvas { } + private void drawRoundingLines() { + + + + + //ugly hack + //rounding lines + + //Boat is within an acceptable distance from the mark. + VisualiserBoat boat = null; + for (VisualiserBoat visualiserBoat : new ArrayList<>(raceState.getBoats())) { + if (visualiserBoat.isClientBoat()) { + boat = visualiserBoat; + } + } + if (boat == null) { + return; + } + + GPSCoordinate startDirectionLinePoint = boat.getCurrentLeg().getStartCompoundMark().getAverageGPSCoordinate(); + GPSCoordinate endDirectionLinePoint = boat.getCurrentLeg().getEndCompoundMark().getAverageGPSCoordinate(); + Bearing bearingOfDirectionLine = GPSCoordinate.calculateBearing(startDirectionLinePoint, endDirectionLinePoint); + + //use the direction line to create three invisible points that act as crossover lines a boat must cross + //to round a mark + + double bearingToAdd; + if (boat.getCurrentLeg().getEndCompoundMark().getRoundingType() == RoundingType.Port || + boat.getCurrentLeg().getEndCompoundMark().getRoundingType() == RoundingType.SP) { + bearingToAdd = 90; + }else{ + bearingToAdd = -90; + } + + double epsilonMeters = boat.getCurrentLeg().getEndCompoundMark().getRoundingDistance(); + + GPSCoordinate endMarkPos = boat.getCurrentLeg().getEndCompoundMark().getMarkForRounding(bearingOfDirectionLine).getPosition(); + + GPSCoordinate roundCheck1 = GPSCoordinate.calculateNewPosition( + endMarkPos, + epsilonMeters, + Azimuth.fromDegrees(bearingOfDirectionLine.degrees() + bearingToAdd) ); + + GPSCoordinate roundCheck2; + try{ + Leg nextLeg = raceState.getLegs().get(raceState.getLegs().indexOf(boat.getCurrentLeg()) + 1); + + GPSCoordinate startNextDirectionLinePoint = nextLeg.getStartCompoundMark().getAverageGPSCoordinate(); + GPSCoordinate endNextDirectionLinePoint = nextLeg.getEndCompoundMark().getAverageGPSCoordinate(); + Bearing bearingOfNextDirectionLine = GPSCoordinate.calculateBearing(startNextDirectionLinePoint, endNextDirectionLinePoint); + + roundCheck2 = GPSCoordinate.calculateNewPosition( + endDirectionLinePoint, + epsilonMeters, + Azimuth.fromDegrees(bearingOfNextDirectionLine.degrees() + bearingToAdd) ); + } catch(NullPointerException e) { + //this is caused by the last leg not being having a leg after it + roundCheck2 = roundCheck1; + } + + //To screen coords. + GraphCoordinate legEnd = map.convertGPS(endDirectionLinePoint); + GraphCoordinate round1 = map.convertGPS(roundCheck1); + GraphCoordinate round2 = map.convertGPS(roundCheck2); + + + + gc.strokeLine( + legEnd.getX(), + legEnd.getY(), + round1.getX(), + round1.getY() ); + + gc.strokeLine( + legEnd.getX(), + legEnd.getY(), + round2.getX(), + round2.getY() ); + + } + /** * Draws all of the {@link Mark}s on the canvas. @@ -513,6 +582,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { for (Mark mark : new ArrayList<>(raceState.getMarks())) { drawMark(mark); } + } @@ -621,6 +691,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { //Marks. drawMarks(); + //TEMP + drawRoundingLines(); + } /** @@ -655,7 +728,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { //finds the direction of the current leg as a bearing startDirectionLinePoint = legStartPoint; - GPSCoordinate tempEndDirectionLinePoint = legs.get(index).getEndCompoundMark().getAverageGPSCoordinate(); + GPSCoordinate tempEndDirectionLinePoint = legs.get(index).getEndCompoundMark().getMark1Position(); bearingOfDirectionLine = GPSCoordinate.calculateBearing(startDirectionLinePoint, tempEndDirectionLinePoint); @@ -826,4 +899,4 @@ public class ResizableRaceCanvas extends ResizableCanvas { -} \ No newline at end of file +} From d92410b9b4560db786fc0f86e40a2633f821a164 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 11 Sep 2017 18:14:26 +1200 Subject: [PATCH 38/92] Fixed XML Issue where sometimes the last boat would not display itself #story[1188] --- racevisionGame/src/main/java/mock/app/MockOutput.java | 2 -- racevisionGame/src/main/java/mock/model/MockRace.java | 1 + racevisionGame/src/main/java/mock/model/RaceServer.java | 9 +++++++++ .../src/main/java/network/Messages/LatestMessages.java | 2 ++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/MockOutput.java b/racevisionGame/src/main/java/mock/app/MockOutput.java index 023235cc..198dcc3f 100644 --- a/racevisionGame/src/main/java/mock/app/MockOutput.java +++ b/racevisionGame/src/main/java/mock/app/MockOutput.java @@ -60,7 +60,6 @@ public class MockOutput implements RunnableWithFramePeriod { try { Thread.sleep(500); - } catch (InterruptedException e) { //If we get interrupted, exit the function. Logger.getGlobal().log(Level.WARNING, "MockOutput.run().sleep(waitForXMLs) was interrupted on thread: " + Thread.currentThread(), e); @@ -72,7 +71,6 @@ public class MockOutput implements RunnableWithFramePeriod { } } - long previousFrameTime = System.currentTimeMillis(); diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index a9f11770..05444f6f 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -126,6 +126,7 @@ public class MockRace extends RaceState { this.boats.add(mockBoat); getRaceDataSource().incrementSequenceNumber(); + } /** diff --git a/racevisionGame/src/main/java/mock/model/RaceServer.java b/racevisionGame/src/main/java/mock/model/RaceServer.java index b7ccef12..31c9aea0 100644 --- a/racevisionGame/src/main/java/mock/model/RaceServer.java +++ b/racevisionGame/src/main/java/mock/model/RaceServer.java @@ -21,6 +21,8 @@ import java.util.logging.Logger; * Created by connortaylorbrown on 2/08/17. */ public class RaceServer { + private static RaceServer server;//this is for updating xml files as I cannot find an elegant way to do this and since it is near the end of the sprint we shouldn't be doing large scale refactors + private MockRace race; private LatestMessages latestMessages; @@ -47,6 +49,7 @@ public class RaceServer { public RaceServer(MockRace race, LatestMessages latestMessages) { + server = this; this.race = race; this.latestMessages = latestMessages; } @@ -73,6 +76,12 @@ public class RaceServer { } + public static void staticUpdateXML(){ + if (server != null){ + server.updateXMLFiles(); + } + } + /** * Checks if the race/boat/regatta data sources have changed, and if they have, update their xml representations. */ diff --git a/racevisionGame/src/main/java/network/Messages/LatestMessages.java b/racevisionGame/src/main/java/network/Messages/LatestMessages.java index c16d722f..ba6cc45c 100644 --- a/racevisionGame/src/main/java/network/Messages/LatestMessages.java +++ b/racevisionGame/src/main/java/network/Messages/LatestMessages.java @@ -1,5 +1,6 @@ package network.Messages; +import mock.model.RaceServer; import network.Messages.Enums.XMLMessageType; import java.util.*; @@ -152,6 +153,7 @@ public class LatestMessages extends Observable { return false; } else { + RaceServer.staticUpdateXML(); return true; } From df04cdf87ccb807b54f9598486951318f9483a1c Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 11 Sep 2017 19:54:43 +1200 Subject: [PATCH 39/92] Boats are now visualy removed when they leave the lobby. --- .../Controllers/InGameLobbyController.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java index e2f0f787..7cc40eeb 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java @@ -8,6 +8,7 @@ import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.geometry.Insets; +import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; @@ -95,12 +96,28 @@ public class InGameLobbyController extends Controller { importer.read(asset); } + private void resetLobby(){ + int count = 0; + for (Label label: allPlayerLabels){ + label.setText("Player " + count + 1); + count ++; + } + List nodeCopy = new ArrayList(playerContainer.getChildren()); + for (Node node: nodeCopy){ + if (node instanceof View3D){ + playerContainer.getChildren().remove(node); + } + } + } + private void populatePlayers(ListChangeListener.Change change){ + Platform.runLater( () -> { while (change.next()){ - if (change.wasAdded()){ + if (change.wasAdded() || change.wasRemoved() || change.wasUpdated() || change.wasPermutated()){ try{ + resetLobby(); int count = 0; int row = 0; for (VisualiserBoat boat :this.visualiserRaceEvent.getVisualiserRaceState().getBoats()) { From 669a303e9b8034c4422481a7a1bda7b3d836c72d Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Mon, 11 Sep 2017 20:19:10 +1200 Subject: [PATCH 40/92] Merge branch 'master' of https://eng-git.canterbury.ac.nz/seng302-2017/team-7 into controllerSplit # Conflicts: # racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java # racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java # racevisionGame/src/main/java/visualiser/Controllers/StartController.java # racevisionGame/src/main/java/visualiser/Controllers/hostgame.fxml # racevisionGame/src/main/java/visualiser/Controllers/lobbyHosting.fxml # racevisionGame/src/main/java/visualiser/Controllers/main.fxml # racevisionGame/src/main/java/visualiser/Controllers/raceView.fxml --- .../src/main/java/mock/app/Event.java | 1 - .../main/java/mock/xml/RaceXMLCreator.java | 26 +--- .../visualiser/Controllers/Controller.java | 23 ++- .../Controllers/HostGameController.java | 90 ++++-------- .../Controllers/KeyBindingsController.java | 2 +- .../Controllers/LobbyController.java | 1 - .../Controllers/RaceViewController.java | 134 ++++++++++++------ .../Controllers/TitleController.java | 5 +- .../src/main/java/visualiser/app/App.java | 22 +-- .../resources/visualiser/scenes/hostGame.fxml | 2 +- .../resources/visualiser/scenes/raceView.fxml | 6 +- 11 files changed, 174 insertions(+), 138 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 84481ce0..f8177612 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -18,7 +18,6 @@ import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; import shared.model.Bearing; import shared.model.Constants; -import shared.xml.XMLUtilities; import java.io.IOException; import java.nio.charset.StandardCharsets; diff --git a/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java b/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java index b168862f..6c098ebe 100644 --- a/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java +++ b/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java @@ -1,34 +1,22 @@ package mock.xml; -import org.w3c.dom.Document; import org.xml.sax.SAXException; import shared.dataInput.RaceXMLReader; import shared.enums.XMLFileType; import shared.exceptions.InvalidRaceDataException; import shared.exceptions.XMLReaderException; -import shared.model.*; -import shared.xml.Race.*; +import shared.model.CompoundMark; +import shared.model.Constants; +import shared.model.GPSCoordinate; +import shared.xml.Race.XMLCompoundMark; +import shared.xml.Race.XMLLimit; +import shared.xml.Race.XMLMark; +import shared.xml.Race.XMLRace; import shared.xml.XMLUtilities; -import javax.xml.XMLConstants; -import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.util.JAXBSource; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.Source; -import javax.xml.transform.dom.DOMSource; -import javax.xml.validation.Schema; -import javax.xml.validation.SchemaFactory; -import javax.xml.validation.Validator; -import java.io.File; import java.io.IOException; -import java.io.StringWriter; -import java.math.BigInteger; -import java.net.URL; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/Controller.java b/racevisionGame/src/main/java/visualiser/Controllers/Controller.java index 23094fd7..6d14b32d 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/Controller.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/Controller.java @@ -7,22 +7,25 @@ import javafx.scene.image.Image; import javafx.stage.Modality; import javafx.stage.Stage; import visualiser.app.App; - import java.io.IOException; - /** * Abstract controller class to give each subclass the functionality to load * a new scene into the existing stage, or create a new popup window. */ public abstract class Controller { - Stage stage = App.getStage(); + private Stage stage = App.getStage(); + /** + * Loads the title screen again when app is already running. + * @throws IOException if a problem with the title.fxml + */ protected void loadTitleScreen() throws IOException { FXMLLoader loader = new FXMLLoader(getClass().getResource("/visualiser/scenes/title.fxml")); Parent root = loader.load(); stage.setResizable(false); Scene scene = new Scene(root); + addCssStyle(scene); stage.setScene(scene); stage.show(); } @@ -47,6 +50,7 @@ public abstract class Controller { // set new scene into existing window Scene scene = new Scene(root, stageWidth, stageHeight); + addCssStyle(scene); stage.setScene(scene); stage.setResizable(true); stage.show(); @@ -81,6 +85,7 @@ public abstract class Controller { stage.centerOnScreen(); stage.getIcons().add(new Image(getClass().getClassLoader().getResourceAsStream("images/SailIcon.png"))); Scene scene = new Scene(root); + addCssStyle(scene); stage.setScene(scene); stage.show(); @@ -88,4 +93,16 @@ public abstract class Controller { return loader.getController(); } + /** + * Adds the relevant CSS styling to the scene being loaded. + * @param scene new scene to be loaded and displayed + */ + private void addCssStyle(Scene scene){ + if (App.dayMode) { + scene.getStylesheets().add("/css/dayMode.css"); + } else { + scene.getStylesheets().add("/css/nightMode.css"); + } + } + } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java index b5c9e4b8..dcd2a42d 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java @@ -2,15 +2,13 @@ package visualiser.Controllers; import javafx.application.Platform; import javafx.fxml.FXML; -import javafx.scene.control.*; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.layout.AnchorPane; -import javafx.stage.Stage; import mock.app.Event; import mock.exceptions.EventConstructionException; import visualiser.app.App; - import java.io.IOException; import java.net.Socket; import java.util.ArrayList; @@ -22,38 +20,31 @@ import java.util.logging.Logger; /** * Controller for Hosting a game. */ -public class HostController extends Controller { - private @FXML ImageView imageView; - private @FXML AnchorPane imagePane; - private @FXML SplitPane splitPane; - private @FXML AnchorPane specPane; - @FXML ImageView mapImage; +public class HostGameController extends Controller { + private @FXML ImageView mapImage; private ArrayList listOfMaps; private int currentMapIndex = 0; - @FXML TextField gameNameField; - - @FXML TextField hostNameField; - @FXML Button previousButton; - - @FXML Button nextButton; public void initialize() { + loadMaps(); + } + + /** + * Loads in the list of playable maps to be selected from. + */ + private void loadMaps(){ + // image preview of maps Image ac35Map = new Image(getClass().getClassLoader().getResourceAsStream("images/AC35_Racecourse_MAP.png")); Image oMap = new Image(getClass().getClassLoader().getResourceAsStream("images/oMapLayout.png")); Image iMap = new Image(getClass().getClassLoader().getResourceAsStream("images/iMapLayout.png")); Image mMap = new Image(getClass().getClassLoader().getResourceAsStream("images/mMapLayout.png")); listOfMaps = new ArrayList(Arrays.asList(ac35Map, oMap, iMap, mMap)); -// mapImage.setImage(listOfMaps.get(currentMapIndex)); + mapImage.setImage(listOfMaps.get(currentMapIndex)); Platform.runLater(() -> { - mapImage.setImage(listOfMaps.get(currentMapIndex)); + mapImage.fitWidthProperty() + .bind(mapImage.getScene().getWindow().widthProperty().multiply(0.6)); }); - hostGame(); - - - // mapImage..addListener( -// (observable, oldValue, newValue) -> Platform -// .runLater(() -> )); } /** @@ -76,29 +67,12 @@ public class HostController extends Controller { * @param address address of the server * @param port port that the server is run off */ - public void connectSocket(String address, int port) throws IOException { + private void connectSocket(String address, int port) throws IOException { Socket socket = new Socket(address, port); RaceStartController rsc = (RaceStartController)loadScene("raceStart.fxml"); rsc.enterLobby(socket, true); } - /** - * Hosts a game. - */ - public void hostGame(){ -// splitPane.setResizableWithParent(specPane, false); -// splitPane.lookupAll(".split-pane-divider").stream().forEach(div -> div.setMouseTransparent(true)); -// imageView.fitWidthProperty().bind(imagePane.widthProperty()); -// imageView.fitHeightProperty().bind(imagePane.heightProperty()); - - Platform.runLater(() -> { - mapImage.fitWidthProperty() - .bind(((Stage)mapImage.getScene().getWindow()).widthProperty().multiply(0.6)); - - }); -// mapImage.fitWidthProperty().bind(((Stage) mapImage.getScene().getWindow()).widthProperty().multiply(0.6)); - } - /** * Menu button pressed. Prompt alert then return to menu */ @@ -110,32 +84,30 @@ public class HostController extends Controller { Optional result = alert.showAndWait(); if(result.get() == ButtonType.OK){ loadTitleScreen(); - }} + } + } /** - * Start button pressed. Currently only prints out start + * Method called when the 'next' arrow button is pressed. It is used to + * change the currently displayed map preview to the next in the list. */ - public void startBtnPressed() { - //System.out.println("Should start the race. This button is only visible for the host"); - hostGamePressed(); - } - - public void nextImage(){ - increaseIndex(); + // increase index + currentMapIndex = (currentMapIndex + 1) % listOfMaps.size(); + // update map preview mapImage.setImage(listOfMaps.get(currentMapIndex)); } + /** + * Method called when the 'previous' arrow button is pressed. It is used to + * change the currently displayed map preview to the previous in the list. + */ public void previousImage(){ - decreaseIndex(); + // decrease index + currentMapIndex = ((((currentMapIndex - 1) % listOfMaps.size()) + + listOfMaps.size()) % listOfMaps.size()); + // update map preview mapImage.setImage(listOfMaps.get(currentMapIndex)); } - private void increaseIndex(){ - currentMapIndex = (currentMapIndex + 1)%listOfMaps.size(); - } - - private void decreaseIndex(){ - currentMapIndex = ((((currentMapIndex - 1)%listOfMaps.size())+listOfMaps.size())%listOfMaps.size()); - } } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java b/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java index b8359aad..617af614 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/KeyBindingsController.java @@ -218,7 +218,7 @@ public class KeyBindingsController extends Controller { private Boolean isFactoryValid(){ for (Map.Entry entry : newKeyFactory.getKeyState().entrySet ()) { - if (entry.getKey().toString().equals(entry.getValue().toString())){ + if (entry.getKey().equals(entry.getValue().toString())){ return false; } } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index 6a4fc447..3f416536 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -8,7 +8,6 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import visualiser.model.RaceConnection; - import java.io.IOException; import java.net.Socket; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java index 1b787e2f..48b02f41 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java @@ -1,5 +1,6 @@ package visualiser.Controllers; +import com.interactivemesh.jfx.importer.stl.StlMeshImporter; import javafx.animation.AnimationTimer; import javafx.application.Platform; import javafx.collections.FXCollections; @@ -11,20 +12,29 @@ import javafx.scene.chart.LineChart; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; -import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.StackPane; +import javafx.scene.shape.MeshView; +import javafx.scene.shape.Sphere; +import javafx.scene.transform.Translate; import javafx.util.Callback; import network.Messages.Enums.RaceStatusEnum; +import shared.dataInput.RaceDataSource; import shared.model.Leg; +import shared.model.Mark; import visualiser.app.App; import visualiser.gameController.ControllerClient; import visualiser.gameController.Keys.ControlKey; import visualiser.gameController.Keys.KeyFactory; -import visualiser.model.*; - +import visualiser.layout.Subject3D; +import visualiser.layout.View3D; +import visualiser.model.Sparkline; +import visualiser.model.VisualiserBoat; +import visualiser.model.VisualiserRaceEvent; +import visualiser.model.VisualiserRaceState; +import visualiser.utils.GPSConverter; import java.io.IOException; -import java.util.List; +import java.net.URL; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; @@ -36,15 +46,16 @@ public class RaceViewController extends Controller { private VisualiserRaceEvent visualiserRace; private VisualiserRaceState raceState; private ControllerClient controllerClient; - private ResizableRaceCanvas raceCanvas; private KeyFactory keyFactory = new KeyFactory(); private boolean infoTableShow = true; // shown or hidden private boolean isHost; + private View3D view3D; + private ObservableList viewSubjects; // note: it says it's not used but it is! do not remove :) private @FXML ArrowController arrowController; private @FXML GridPane canvasBase; - private @FXML SplitPane race; + private @FXML SplitPane racePane; private @FXML StackPane arrowPane; private @FXML Label timer; private @FXML Label FPS; @@ -56,7 +67,6 @@ public class RaceViewController extends Controller { private @FXML TableColumn boatMarkColumn; private @FXML TableColumn boatSpeedColumn; private @FXML LineChart sparklineChart; - private @FXML AnchorPane annotationPane; /** * Displays a specified race. @@ -79,8 +89,8 @@ public class RaceViewController extends Controller { /** * Sets up the listener and actions that occur when a key is pressed. */ - public void initKeypressHandler() { - race.addEventFilter(KeyEvent.KEY_PRESSED, event -> { + private void initKeypressHandler() { + racePane.addEventFilter(KeyEvent.KEY_PRESSED, event -> { String codeString = event.getCode().toString(); // tab key @@ -124,7 +134,7 @@ public class RaceViewController extends Controller { e.printStackTrace(); } } - }); + }); } /** @@ -134,23 +144,82 @@ public class RaceViewController extends Controller { // initialise displays initialiseFps(); initialiseInfoTable(); - initialiseRaceCanvas(); initialiseView3D(); initialiseRaceClock(); raceTimer(); // start the timer - new Annotations(this.annotationPane, this.raceCanvas); new Sparkline(this.raceState, this.sparklineChart); timeZone.setText(this.raceState.getRaceClock().getTimeZone()); arrowController.setWindProperty(this.raceState.windProperty()); } private void initialiseView3D() { - List boats = raceState.getBoats(); - for(VisualiserBoat boat: boats) { - boat.positionProperty().addListener((o, prev, curr) -> { - System.out.println(boat.getCountry() + " is at " + curr.toString()); - }); + viewSubjects = FXCollections.observableArrayList(); + + // Import boat mesh + URL asset = RaceViewController.class.getClassLoader().getResource("assets/V1.2 " + + "Complete Boat.stl"); + StlMeshImporter importer = new StlMeshImporter(); + importer.read(asset); + + // Configure camera angles and control + view3D = new View3D(); + view3D.setDistance(1050); + view3D.setYaw(0); + view3D.setPitch(60); + view3D.enableTracking(); + canvasBase.add(view3D, 0, 0); + + // Set up projection from GPS to view + RaceDataSource raceData = raceState.getRaceDataSource(); + final GPSConverter gpsConverter = new GPSConverter(raceData, 450, 450); + + view3D.setItems(viewSubjects); + // Position and add each mark to view + for (Mark mark : raceState.getMarks()) { + Subject3D subject = new Subject3D(new Sphere(2)); + subject.setX(gpsConverter.convertGPS(mark.getPosition()).getX()); + subject.setZ(gpsConverter.convertGPS(mark.getPosition()).getY()); + + viewSubjects.add(subject); + } + // Position and add each boat to view + for (VisualiserBoat boat : raceState.getBoats()) { + MeshView mesh = new MeshView(importer.getImport()); + Subject3D subject = new Subject3D(mesh); + viewSubjects.add(subject); + + // Track this boat's movement with the new subject + AnimationTimer trackBoat = new AnimationTimer() { + @Override public void handle(long now) { + subject.setHeading(boat.getBearing().degrees()); + subject.setX(gpsConverter.convertGPS(boat.getPosition()).getX()); + subject.setZ(gpsConverter.convertGPS(boat.getPosition()).getY()); + } + }; + trackBoat.start(); } + // Fix initial bird's-eye position + view3D.updatePivot(new Translate(250, 0, 210)); + + // Bind zooming to scrolling + view3D.setOnScroll(e -> { + view3D.updateDistance(e.getDeltaY()); + }); + + // Bind zooming to keypress (Z/X default) + racePane.addEventFilter(KeyEvent.KEY_PRESSED, e -> { + ControlKey key = keyFactory.getKey(e.getCode().toString()); + if (key != null) { + switch (key.toString()) { + case "Zoom In": + view3D.updateDistance(-10); + break; + case "Zoom Out": + view3D.updateDistance(10); + break; + } + } + }); } /** @@ -178,7 +247,7 @@ public class RaceViewController extends Controller { /** * Initialises the information table view to listen to a given race. */ - public void initialiseInfoTable() { + private void initialiseInfoTable() { // list of boats to display data for ObservableList boats = FXCollections .observableArrayList(this.visualiserRace.getVisualiserRaceState().getBoats()); @@ -243,23 +312,6 @@ public class RaceViewController extends Controller { }); } - /** - * Initialises the {@link ResizableRaceCanvas}, provides the race to - * read data from. - */ - private void initialiseRaceCanvas() { - //Create canvas. - raceCanvas = new ResizableRaceCanvas(raceState); - raceCanvas.setMouseTransparent(true); - raceCanvas.widthProperty().bind(canvasBase.widthProperty()); - raceCanvas.heightProperty().bind(canvasBase.heightProperty()); - - // draw and display - raceCanvas.draw(); - raceCanvas.setVisible(true); - canvasBase.getChildren().add(0, raceCanvas); - } - /** * Initialises the race clock to listen to the specified race. */ @@ -275,7 +327,7 @@ public class RaceViewController extends Controller { /** * Transition from the race view to the finish view. */ - public void finishRace() throws IOException { + private void finishRace() throws IOException { RaceFinishController fc = (RaceFinishController)loadScene("raceFinish.fxml"); fc.loadFinish(raceState.getBoats()); @@ -298,7 +350,7 @@ public class RaceViewController extends Controller { } } else { // refresh visual race display - raceCanvas.drawRace(); +// raceCanvas.drawRace(); boatInfoTable.sort(); } @@ -320,16 +372,18 @@ public class RaceViewController extends Controller { * toggles if the info table is shown */ private void toggleTable() { - double tablePercent = 1 - (boatPlacingColumn.getPrefWidth() + boatTeamColumn.getPrefWidth() + boatMarkColumn.getPrefWidth() + boatSpeedColumn.getPrefWidth())/race.getWidth(); + double tablePercent = 1 - (boatPlacingColumn.getPrefWidth() + + boatTeamColumn.getPrefWidth() + boatMarkColumn.getPrefWidth() + + boatSpeedColumn.getPrefWidth())/racePane.getWidth(); if (infoTableShow) { - race.setDividerPositions(tablePercent); + racePane.setDividerPositions(tablePercent); arrowPane.setScaleX(0.5); arrowPane.setScaleY(0.5); arrowPane.setTranslateX(0 + (arrowPane.getScene().getWidth()/4)*tablePercent); arrowPane.setTranslateY(0 - arrowPane.getScene().getHeight()/4); } else { - race.setDividerPositions(1); + racePane.setDividerPositions(1); arrowPane.setScaleX(1); arrowPane.setScaleY(1); arrowPane.setTranslateX(0); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java index 68fefe98..20d5bb9a 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java @@ -3,6 +3,7 @@ package visualiser.Controllers; import javafx.fxml.FXML; import javafx.scene.control.RadioButton; import javafx.stage.Modality; +import visualiser.app.App; import java.io.IOException; @@ -23,7 +24,7 @@ public class TitleController extends Controller { * @throws IOException if main has problems */ public void hostAGame() throws IOException { - loadScene("lobbyHosting.fxml"); + loadScene("hostGame.fxml"); } /** @@ -41,6 +42,7 @@ public class TitleController extends Controller { dayModeRD.getScene().getStylesheets().clear(); dayModeRD.getScene().getStylesheets().add("/css/dayMode.css"); nightModeRD.setSelected(false); + App.dayMode = true; } /** @@ -50,6 +52,7 @@ public class TitleController extends Controller { nightModeRD.getScene().getStylesheets().clear(); nightModeRD.getScene().getStylesheets().add("/css/nightMode.css"); dayModeRD.setSelected(false); + App.dayMode = false; } /** diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java index c8c8d1f3..ccb25d07 100644 --- a/racevisionGame/src/main/java/visualiser/app/App.java +++ b/racevisionGame/src/main/java/visualiser/app/App.java @@ -7,7 +7,6 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.concurrent.Task; import javafx.concurrent.Worker; -import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; import javafx.geometry.Rectangle2D; @@ -24,20 +23,19 @@ import javafx.scene.paint.Color; import javafx.stage.Screen; import javafx.stage.Stage; import javafx.stage.StageStyle; -import javafx.stage.WindowEvent; import javafx.util.Duration; import mock.app.Event; public class App extends Application { private static Stage stage; public static Event game; + public static Boolean dayMode = true; private Pane splashLayout; private ProgressBar loadProgress; private Label progressText; private static final int SPLASH_WIDTH = 676; private static final int SPLASH_HEIGHT = 227; - /** * Entry point for running the programme * @param args for starting the programme @@ -73,7 +71,7 @@ public class App extends Application { /** * Method that sets up and displays the splash screen - * @param stage the inital stage + * @param stage the initial stage * @throws Exception if something wrong with title screen. */ public void start(Stage stage) throws Exception { @@ -81,7 +79,7 @@ public class App extends Application { @Override protected ObservableList call() throws InterruptedException { ObservableList addedFilling = - FXCollections.observableArrayList(); + FXCollections.observableArrayList(); ObservableList burgerFilling = FXCollections.observableArrayList( "Buns", "Patties", "Lettuce", "Onions", "Tomato", @@ -124,7 +122,11 @@ public class App extends Application { return App.stage; } - public void loadTitleScreen() throws Exception { + /** + * Loads the title screen for the first time on app start. + * @throws Exception if there is a problem with a resource loaded + */ + private void loadTitleScreen() throws Exception { stage = new Stage(); FXMLLoader loader = new FXMLLoader(getClass().getResource ("/visualiser/scenes/title.fxml")); @@ -135,11 +137,9 @@ public class App extends Application { stage.getIcons().add(new Image(getClass().getClassLoader().getResourceAsStream("images/SailIcon.png"))); stage.setScene(scene); stage.show(); - stage.setOnCloseRequest(new EventHandler() { - @Override public void handle(WindowEvent event) { - Platform.exit(); - System.exit(0); - } + stage.setOnCloseRequest(event -> { + Platform.exit(); + System.exit(0); }); } diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostGame.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostGame.fxml index ab964820..cf82c285 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/hostGame.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/hostGame.fxml @@ -10,7 +10,7 @@ - + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml b/racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml index b6496743..8733a73e 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml @@ -22,7 +22,11 @@ - + From 54a9140f31cb495aa01a4211333482f728e02d28 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 11 Sep 2017 20:29:15 +1200 Subject: [PATCH 41/92] lobby listener is added and removed so that the program doesn't drasticaly slow down when the lobby is connected to multiple times #story[1188] --- .../Controllers/InGameLobbyController.java | 107 ++++++++++-------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java index 7cc40eeb..5e9c8792 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java @@ -83,6 +83,8 @@ public class InGameLobbyController extends Controller { private StlMeshImporter importer; + private PopulatePlayers lobbyUpdateListener; + @Override public void initialize(URL location, ResourceBundle resources) { allPlayerLabels = new ArrayList(Arrays.asList(playerLabel, playerLabel2, @@ -94,6 +96,8 @@ public class InGameLobbyController extends Controller { URL asset = HostController.class.getClassLoader().getResource("assets/V1.2 Complete Boat.stl"); importer = new StlMeshImporter(); importer.read(asset); + lobbyUpdateListener = new PopulatePlayers(); + } private void resetLobby(){ @@ -110,56 +114,69 @@ public class InGameLobbyController extends Controller { } } - private void populatePlayers(ListChangeListener.Change change){ + public class PopulatePlayers implements ListChangeListener { + + @Override + public void onChanged(Change change) { - Platform.runLater( - () -> { - while (change.next()){ - if (change.wasAdded() || change.wasRemoved() || change.wasUpdated() || change.wasPermutated()){ - try{ - resetLobby(); - int count = 0; - int row = 0; - for (VisualiserBoat boat :this.visualiserRaceEvent.getVisualiserRaceState().getBoats()) { - View3D playerBoatToSet = new View3D(); - playerBoatToSet.setItems(subjects); - - playerContainer.add(playerBoatToSet, (count % 3) , row); - playerContainer.setMargin(playerBoatToSet, new Insets(10, 10, 10, 10)); - - MeshView mesh = new MeshView(importer.getImport()); - Subject3D subject = new Subject3D(mesh); - subjects.add(subject); - - playerBoatToSet.setDistance(50); - playerBoatToSet.setYaw(45); - playerBoatToSet.setPitch(20); - - - - AnimationTimer rotate = new AnimationTimer() { - @Override - public void handle(long now) { - subject.setHeading(subject.getHeading().getAngle() + 0.1); + Platform.runLater( + () -> { + if (visualiserRaceEvent.getVisualiserRaceState().getRaceStatusEnum() != RaceStatusEnum.PRESTART){ + return; + } + while (change.next()){ + if (change.wasAdded() || change.wasRemoved() || change.wasUpdated() || change.wasPermutated()){ + if (visualiserRaceEvent.getVisualiserRaceState().getRaceStatusEnum() != RaceStatusEnum.PRESTART){ + return; + } + try{ + resetLobby(); + int count = 0; + int row = 0; + for (VisualiserBoat boat :visualiserRaceEvent.getVisualiserRaceState().getBoats()) { + View3D playerBoatToSet = new View3D(); + playerBoatToSet.setItems(subjects); + + playerContainer.add(playerBoatToSet, (count % 3) , row); + playerContainer.setMargin(playerBoatToSet, new Insets(10, 10, 10, 10)); + + MeshView mesh = new MeshView(importer.getImport()); + Subject3D subject = new Subject3D(mesh); + subjects.add(subject); + + playerBoatToSet.setDistance(50); + playerBoatToSet.setYaw(45); + playerBoatToSet.setPitch(20); + + + + AnimationTimer rotate = new AnimationTimer() { + @Override + public void handle(long now) { + subject.setHeading(subject.getHeading().getAngle() + 0.1); + } + }; + rotate.start(); + + allPlayerLabels.get(count).setText("Player: " + boat.getSourceID()); + allPlayerLabels.get(count).toFront(); + count += 1; + if (count > 2){ + row = 1; } - }; - rotate.start(); - - allPlayerLabels.get(count).setText("Player: " + boat.getSourceID()); - allPlayerLabels.get(count).toFront(); - count += 1; - if (count > 2){ - row = 1; } } - } - catch(ConcurrentModificationException e){ + catch(ConcurrentModificationException e){ + } } } } - } - ); + ); + } } + /* + private void populatePlayers(ListChangeListener.Change change){ + }*/ /** * Starts the race. @@ -220,7 +237,7 @@ public class InGameLobbyController extends Controller { //Hide this, and display the race controller. gameLobbyWrapper.setVisible(false); - + visualiserRaceEvent.getVisualiserRaceState().getBoats().removeListener(lobbyUpdateListener); parent.beginRace(visualiserRaceEvent, controllerClient, isHost); } @@ -239,9 +256,7 @@ public class InGameLobbyController extends Controller { this.controllerClient = visualiserRaceEvent.getControllerClient(); - this.visualiserRaceEvent.getVisualiserRaceState().getBoats().addListener((ListChangeListener) c ->{ - populatePlayers(c); - }); + this.visualiserRaceEvent.getVisualiserRaceState().getBoats().addListener(this.lobbyUpdateListener); gameLobbyWrapper.setVisible(true); From 2cda5ea70de24cf011b54e5ed5f0b89b642bad1e Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Mon, 11 Sep 2017 20:34:34 +1200 Subject: [PATCH 42/92] Lobby no longer glitches out when a person disconnects and reconnects without restarting the program #story[1188] --- .../visualiser/Controllers/InGameLobbyController.java | 1 + .../java/visualiser/model/VisualiserRaceEvent.java | 4 ++-- .../main/java/visualiser/network/ServerConnection.java | 10 +++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java index 5e9c8792..b8108c18 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java @@ -277,6 +277,7 @@ public class InGameLobbyController extends Controller { alert.setHeaderText("You are about to quit the race"); Optional result = alert.showAndWait(); if(result.get() == ButtonType.OK){ + visualiserRaceEvent.terminate(); gameLobbyWrapper.setVisible(false); parent.enterTitle(); } diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java index d5ab9b66..24da83f3 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java @@ -112,8 +112,8 @@ public class VisualiserRaceEvent { * Terminates the server connection and race service. */ public void terminate() { - this.serverConnectionThread.interrupt(); - this.visualiserRaceServiceThread.interrupt(); + this.serverConnectionThread.interrupt(); + serverConnection.terminate(); } } diff --git a/racevisionGame/src/main/java/visualiser/network/ServerConnection.java b/racevisionGame/src/main/java/visualiser/network/ServerConnection.java index 5d6d8773..899cbc45 100644 --- a/racevisionGame/src/main/java/visualiser/network/ServerConnection.java +++ b/racevisionGame/src/main/java/visualiser/network/ServerConnection.java @@ -468,7 +468,15 @@ public class ServerConnection implements RunnableWithFramePeriod { this.visualiserRaceControllerThread.interrupt(); } - + if (this.socket != null) { + try { + this.socket.getInputStream().close(); + this.socket.getOutputStream().close(); + this.socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } //TODO input controller? From 9bc36ba544113c0731414108d5bdc92ee2c5343c Mon Sep 17 00:00:00 2001 From: Jessica Syder Date: Mon, 11 Sep 2017 23:09:48 +1200 Subject: [PATCH 43/92] Merge branch 'master' of https://eng-git.canterbury.ac.nz/seng302-2017/team-7 into controllerSplit # Conflicts: # racevisionGame/src/main/java/visualiser/Controllers/HostController.java # racevisionGame/src/main/java/visualiser/Controllers/MainController.java # racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java # racevisionGame/src/main/java/visualiser/Controllers/StartController.java # racevisionGame/src/main/java/visualiser/Controllers/TitleController.java # racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml # racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml --- .../Controllers/LobbyController.java | 2 +- .../Controllers/RaceViewController.java | 94 +++++++------------ .../Controllers/TitleController.java | 23 +---- .../src/main/java/visualiser/app/App.java | 3 +- .../java/visualiser/enums/TutorialState.java | 6 -- .../resources/visualiser/scenes/title.fxml | 4 +- settings/keyBindings.xml | 2 +- 7 files changed, 44 insertions(+), 90 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index 3f416536..8df0e4ed 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -57,7 +57,7 @@ public class LobbyController extends Controller { } else { joinGameBtn.setDisable(true); } - } catch (Exception e){} + } catch (Exception ignored){} } /** diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java index b0403cac..5ff07193 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java @@ -12,7 +12,6 @@ import javafx.scene.chart.LineChart; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; -import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.StackPane; import javafx.scene.shape.MeshView; @@ -27,6 +26,7 @@ import visualiser.app.App; import visualiser.enums.TutorialState; import visualiser.gameController.ControllerClient; import visualiser.gameController.Keys.ControlKey; +import visualiser.gameController.Keys.KeyFactory; import visualiser.layout.Subject3D; import visualiser.layout.View3D; import visualiser.model.Sparkline; @@ -34,9 +34,12 @@ import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRaceEvent; import visualiser.model.VisualiserRaceState; import visualiser.utils.GPSConverter; + import java.io.IOException; import java.net.URL; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; @@ -73,7 +76,6 @@ public class RaceViewController extends Controller { private @FXML TableColumn boatMarkColumn; private @FXML TableColumn boatSpeedColumn; private @FXML LineChart sparklineChart; - private @FXML Label tutorialText; @@ -91,10 +93,35 @@ public class RaceViewController extends Controller { this.isHost = isHost; keyFactory.load(); + tutorialCheck(); initKeypressHandler(); initialiseRaceVisuals(); } + /** + * Checks if the current game is a tutorial race and sets up initial + * tutorial displays if it is. + */ + private void tutorialCheck(){ + if (App.gameType == 4) { + isTutorial = true; + tutorialText.setVisible(true); + tutorialStates = new ArrayList<>(Arrays.asList(TutorialState.values())); + + currentState = tutorialStates.get(0); + tutorialStates.remove(0); + searchMapForKey("Upwind"); + + tutorialText.setText( + "Welcome to the tutorial! Exit at anytime with ESC. \nWe will first learn how to turn upwind. Press " + + keyToPress + " to turn upwind."); + + } else { + isTutorial = false; + tutorialText.setVisible(false); + } + } + /** * Sets up the listener and actions that occur when a key is pressed. */ @@ -167,7 +194,6 @@ public class RaceViewController extends Controller { initialiseFps(); initialiseInfoTable(); initialiseView3D(); - initialiseArrow(); initialiseRaceClock(); raceTimer(); // start the timer new Sparkline(this.raceState, this.sparklineChart); @@ -374,45 +400,6 @@ public class RaceViewController extends Controller { }); } - - - /** - * Displays a specified race. - * @param visualiserRace Object modelling the race. - * @param controllerClient Socket Client that manipulates the controller. - * @param isHost is user a host - */ - public void startRace(VisualiserRaceEvent visualiserRace, ControllerClient controllerClient, Boolean isHost) { - - this.visualiserRace = visualiserRace; - this.controllerClient = controllerClient; - this.isHost = isHost; - - - //Check if the game is a tutorial - if (parent.getGameType()==4){ - isTutorial = true; - tutorialText.setVisible(true); - tutorialStates = new ArrayList<>(Arrays.asList(TutorialState.values())); - - currentState = tutorialStates.get(0); - tutorialStates.remove(0); - - searchMapForKey("Upwind"); - - tutorialText.setText("Welcome to the tutorial! Exit at anytime with ESC. \nWe will first learn how to turn upwind. Press " + keyToPress + " to turn upwind."); - - } else { - isTutorial = false; - tutorialText.setVisible(false); - } - - initialiseRace(); - - //Display this controller. - racePane.setVisible(true); - } - /** * Transition from the race view to the finish view. */ @@ -422,16 +409,6 @@ public class RaceViewController extends Controller { fc.loadFinish(raceState.getBoats()); } - - /** - * Initialises the arrow controller with data from the race to observe. - * @param race The race to observe. - */ - private void initialiseArrow(VisualiserRaceEvent race) { - arrowController.setWindProperty(race.getVisualiserRaceState().windProperty()); - } - - /** * Timer which monitors the race. */ @@ -581,19 +558,16 @@ public class RaceViewController extends Controller { alert.setContentText("Now you know the controls you are ready to race!"); Optional result = alert.showAndWait(); if (result.get() == ButtonType.OK) { - parent.endEvent(); - racePane.setVisible(false); - App.app.showMainStage(App.getStage()); + App.game.endEvent(); + loadTitleScreen(); } break; default: //State not found. Exit tutorial to title menu - parent.endEvent(); - racePane.setVisible(false); - App.app.showMainStage(App.getStage()); + App.game.endEvent(); + loadTitleScreen(); break; } - } } \ No newline at end of file diff --git a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java index 721833f4..aaf17739 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java @@ -1,28 +1,15 @@ 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.Label; import javafx.scene.control.RadioButton; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; import javafx.stage.Modality; -import javafx.stage.Stage; -import mock.app.Event; -import mock.exceptions.EventConstructionException; -import javafx.stage.WindowEvent; import visualiser.app.App; import java.io.IOException; -import java.net.URL; -import java.util.ResourceBundle; -import java.util.logging.Level; -import java.util.logging.Logger; /** * Controller for the opening title window. @@ -93,12 +80,10 @@ public class TitleController extends Controller { } } - - public void tutorialStartPressed() throws IOException { - titleWrapper.setVisible(false); - parent.setGameType(4); - parent.beginGame(); - + public void tutorialStartPressed() { + App.gameType = 4; + HostGameController hgc = new HostGameController(); + hgc.hostGamePressed(); } } \ No newline at end of file diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java index 316387c9..2e3287ae 100644 --- a/racevisionGame/src/main/java/visualiser/app/App.java +++ b/racevisionGame/src/main/java/visualiser/app/App.java @@ -3,7 +3,6 @@ package visualiser.app; import javafx.animation.FadeTransition; import javafx.application.Application; import javafx.application.Platform; -import javafx.beans.property.ReadOnlyObjectProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.concurrent.Task; @@ -14,7 +13,6 @@ import javafx.geometry.Rectangle2D; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Label; -import javafx.scene.control.ListView; import javafx.scene.control.ProgressBar; import javafx.scene.effect.DropShadow; import javafx.scene.image.Image; @@ -32,6 +30,7 @@ public class App extends Application { private static Stage stage; public static Event game; public static Boolean dayMode = true; + public static Integer gameType = 0; private Pane splashLayout; private ProgressBar loadProgress; private Label progressText; diff --git a/racevisionGame/src/main/java/visualiser/enums/TutorialState.java b/racevisionGame/src/main/java/visualiser/enums/TutorialState.java index ab811a43..9764f130 100644 --- a/racevisionGame/src/main/java/visualiser/enums/TutorialState.java +++ b/racevisionGame/src/main/java/visualiser/enums/TutorialState.java @@ -1,12 +1,6 @@ package visualiser.enums; -import javafx.scene.input.KeyCode; -import network.Messages.BoatAction; import network.Messages.Enums.BoatActionEnum; -import visualiser.gameController.Keys.ControlKey; -import static visualiser.app.App.keyFactory; - -import java.util.ArrayList; /** * State of which stage the tutorial is currently in diff --git a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml index da0b495b..eae21544 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml @@ -40,7 +40,9 @@ -