diff --git a/racevisionGame/src/main/java/mock/app/MockOutput.java b/racevisionGame/src/main/java/mock/app/MockOutput.java index 12eaf807..aff0947e 100644 --- a/racevisionGame/src/main/java/mock/app/MockOutput.java +++ b/racevisionGame/src/main/java/mock/app/MockOutput.java @@ -58,7 +58,8 @@ public class MockOutput implements Runnable /** * Ctor. - * + * @param latestMessages Latests Messages that the Mock is to send out + * @param outToVisualiser DataStream to output to Visualisers * @throws IOException if server socket cannot be opened. */ public MockOutput(LatestMessages latestMessages, DataOutputStream outToVisualiser) throws IOException { diff --git a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java index 92ca8809..ae8c682c 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/ConnectionController.java @@ -3,10 +3,7 @@ package visualiser.Controllers; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; -import javafx.scene.control.Button; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; -import javafx.scene.control.TextField; +import javafx.scene.control.*; import javafx.scene.layout.AnchorPane; import mock.app.Event; import shared.exceptions.InvalidBoatDataException; @@ -15,6 +12,7 @@ import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.XMLReaderException; import visualiser.model.RaceConnection; +import javax.xml.soap.Text; import java.io.IOException; import java.net.Socket; import java.net.URL; @@ -41,6 +39,46 @@ public class ConnectionController extends Controller { @FXML private TextField portField; + + /*Title Screen fxml items*/ + @FXML + private Button hostGameTitleBtn; + @FXML + private Button connectGameBtn; + @FXML + private RadioButton nightRadioBtn; + @FXML + private RadioButton dayRadioButton; + + /*Lobby fxml items*/ + @FXML + private TableView lobbyTable; + @FXML + private TableColumn gameNameColumn; + @FXML + private TableColumn hostNameColumn; + @FXML + private TableColumn playerCountColumn; + @FXML + private TextField playerNameField; + @FXML + private Button joinGameBtn; + + /*Host game fxml items*/ + @FXML + private TextField gameNameField; + @FXML + private TextField hostNameField; + @FXML + private TextField hostGameBtn; + + + + + + + + private ObservableList connections; @@ -100,7 +138,7 @@ public class ConnectionController extends Controller { String portString = portField.getText(); try{ int port = Integer.parseInt(portString); - connections.add(new RaceConnection(hostName, port)); + connections.add(new RaceConnection(hostName, port, null)); }catch(NumberFormatException e){ System.err.println("Port number entered is not a number"); } diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java new file mode 100644 index 00000000..e87ea689 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostController.java @@ -0,0 +1,86 @@ +package visualiser.Controllers; + +import javafx.application.Application; +import javafx.fxml.FXML; +import javafx.scene.control.*; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import mock.app.Event; +import shared.exceptions.InvalidBoatDataException; +import shared.exceptions.InvalidRaceDataException; +import shared.exceptions.InvalidRegattaDataException; +import shared.exceptions.XMLReaderException; +import visualiser.model.RaceConnection; + +import java.io.IOException; +import java.net.Socket; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.ResourceBundle; + +/** + * Controller for Hosting a game. + */ +public class HostController extends Controller { + + + @FXML + TextField gameNameField; + + @FXML + TextField hostNameField; + + @FXML + AnchorPane hostWrapper; + + + @Override + public void initialize(URL location, ResourceBundle resources) { + } + + /** + * Hosts a game + * @throws IOException if socket cannot be connected to + */ + public void hostGamePressed() throws IOException{ + try { + Event game = Event.getEvent(); + game.start(); + connectSocket("localhost", 4942); + } catch (InvalidRaceDataException e) { + e.printStackTrace(); + } catch (XMLReaderException e) { + e.printStackTrace(); + } catch (InvalidBoatDataException e) { + e.printStackTrace(); + } catch (InvalidRegattaDataException e) { + e.printStackTrace(); + } + } + + /** + * 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); + hostWrapper.setVisible(false); + parent.enterLobby(socket); + } catch (IOException e) { /* Never reached */ } + } + + public AnchorPane startWrapper(){ + return hostWrapper; + } + + /** + * Hosts a game. + */ + public void hostGame(){ + hostWrapper.setVisible(true); + System.out.println("Reacted hostGame"); + } + +} diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java new file mode 100644 index 00000000..dc4d8e59 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -0,0 +1,128 @@ +package visualiser.Controllers; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.layout.AnchorPane; +import visualiser.model.RaceConnection; + +import java.io.IOException; +import java.net.Socket; +import java.net.URL; +import java.util.ResourceBundle; + +/** + * Controller for the Lobby for entering games + */ +public class LobbyController extends Controller { + + @FXML + 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 ObservableList connections; + + + @Override + public void initialize(URL location, ResourceBundle resources) { + 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()); + + lobbyTable.getSelectionModel().selectedItemProperty().addListener((obs, prev, curr) -> { + if (curr != null && curr.statusProperty().getValue().equals("Ready")) { + joinGameBtn.setDisable(false); + } + else { + joinGameBtn.setDisable(true); + System.out.println(curr.statusProperty().getValue()); + } + }); + joinGameBtn.setDisable(true); + } + + /** + * Refreshes the connections in the lobby + */ + public void refreshBtnPressed(){ + for(RaceConnection connection: connections) { + connection.check(); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + try { + if (lobbyTable.getSelectionModel().getSelectedItem().statusProperty().getValue().equals("Ready")) { + joinGameBtn.setDisable(false); + } else { + joinGameBtn.setDisable(true); + } + } catch (Exception e){} + } + + /** + * 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); + } catch (IOException e) { /* Never reached */ + e.printStackTrace(); + } + } + + /** + * adds a new connection + */ + public void addConnectionPressed(){ + String hostName = addressFld.getText(); + String portString = portFld.getText(); + try{ + int port = Integer.parseInt(portString); + connections.add(new RaceConnection(hostName, port, "Boat Game")); + addressFld.clear(); + portFld.clear(); + }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); + } +} diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java index d258e695..80ef2da4 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java @@ -21,7 +21,9 @@ public class MainController extends Controller { @FXML private RaceController raceController; @FXML private ConnectionController connectionController; @FXML private FinishController finishController; - + @FXML private TitleController titleController; + @FXML private HostController hostController; + @FXML private LobbyController lobbyController; /** @@ -36,6 +38,7 @@ public class MainController extends Controller { * Transitions from the StartController screen (displays pre-race information) to the RaceController (displays the actual race). * @param visualiserInput The object used to read packets from the race server. * @param visualiserRace The object modelling the race. + * @param controllerClient Socket Client that manipulates the controller. */ public void beginRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) { raceController.startRace(visualiserInput, visualiserRace, controllerClient); @@ -57,6 +60,26 @@ public class MainController extends Controller { finishController.enterFinish(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. * @@ -70,6 +93,10 @@ public class MainController extends Controller { 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); @@ -85,5 +112,10 @@ public class MainController extends Controller { 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/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index a15e826c..5777c06e 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -338,6 +338,7 @@ public class RaceController extends Controller { * Displays a specified race. * @param visualiserInput Object used to read packets from server. * @param visualiserRace Object modelling the race. + * @param controllerClient Socket Client that manipulates the controller. */ public void startRace(VisualiserInput visualiserInput, VisualiserRace visualiserRace, ControllerClient controllerClient) { diff --git a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java new file mode 100644 index 00000000..412858ee --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java @@ -0,0 +1,85 @@ +package visualiser.Controllers; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.RadioButton; +import javafx.scene.image.Image; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import visualiser.app.App; + +import java.io.IOException; +import java.net.URL; +import java.util.ResourceBundle; + +/** + * Controller for the opening title window. + * Has two initial buttons for a user to decide how to play their game. Has a + * burger-boat and comic sans styling to allure and entice users into playing + * the game. + */ +public class TitleController extends Controller { + @FXML + Button btnJoin; + @FXML + AnchorPane titleWrapper; + @FXML + RadioButton dayModeRD; + @FXML + RadioButton nightModeRD; + + /** + * Method called when the 'host a game' button is pressed. + * Opens the next window allowing a user to host their own game. + * Currently used to run the RaceVision mock. + * @throws IOException if main has problems + */ + public void hostAGame() throws IOException { + titleWrapper.setVisible(false); + parent.hostGame(); + App.getStage().setResizable(true); + } + + /** + * Switch the scene to the title page. + */ + public void enterTitle(){ + titleWrapper.setVisible(true); + } + + /** + * To be implemented at a later date- will open the next scene displaying + * games a player can join. Place holder method for now! + */ + public void joinAGame() { + titleWrapper.setVisible(false); + parent.enterLobby(); + App.getStage().setResizable(true); + } + + /** + * Switches the css of the program to day mode theme + */ + public void setDayMode(){ + dayModeRD.getScene().getStylesheets().clear(); + dayModeRD.getScene().getStylesheets().add("/css/dayMode.css"); + nightModeRD.setSelected(false); + } + + /** + * Switches the css of the program to night mode theme + */ + public void setNightMode(){ + nightModeRD.getScene().getStylesheets().clear(); + nightModeRD.getScene().getStylesheets().add("/css/nightMode.css"); + dayModeRD.setSelected(false); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + + } +} diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java index 9a86cfd4..6896556d 100644 --- a/racevisionGame/src/main/java/visualiser/app/App.java +++ b/racevisionGame/src/main/java/visualiser/app/App.java @@ -6,10 +6,13 @@ import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; +import javafx.scene.image.Image; import javafx.stage.Stage; import javafx.stage.WindowEvent; +import visualiser.Controllers.MainController; public class App extends Application { + private static Stage stage; /** * Entry point for running the programme @@ -20,6 +23,11 @@ public class App extends Application { launch(args); } + /** + * Method that displays the visualiser, starting with the title screen. + * @param stage the stage to be displayed + * @throws Exception if something wrong with title screen + */ public void start(Stage stage) throws Exception { stage.setOnCloseRequest(new EventHandler() { @Override @@ -30,10 +38,24 @@ public class App extends Application { }); FXMLLoader loader = new FXMLLoader(getClass().getResource("/visualiser/scenes/main.fxml")); Parent root = loader.load(); - Scene scene = new Scene(root, 1200, 800); + stage.setResizable(false); + MainController mc = (MainController) loader.getController(); + mc.enterTitle(); + Scene scene = new Scene(root); stage.setScene(scene); stage.setTitle("RaceVision - Team 7"); + stage.getIcons().add(new Image(getClass().getClassLoader().getResourceAsStream("images/SailIcon.png"))); + mc.startCss(); + setStage(stage); stage.show(); } + + public static Stage getStage() { + return App.stage; + } + + public static void setStage(Stage stage) { + App.stage = stage; + } } diff --git a/racevisionGame/src/main/java/visualiser/model/Ping.java b/racevisionGame/src/main/java/visualiser/model/Ping.java new file mode 100644 index 00000000..b81a3e0c --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/model/Ping.java @@ -0,0 +1,46 @@ +package visualiser.model; + +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; + +/** + * Created by David on 26/07/2017. + */ +public class Ping implements Runnable { + + private final String hostname; + private final int port; + private final RaceConnection rc; + + public Ping(String hostname, int port, RaceConnection rc){ + this.hostname = hostname; + this.port = port; + this.rc = rc; + } + + public boolean pingPort(){ + //TODO the connection needs to be moved to its own thread, so it doesn't block fx thread. + InetSocketAddress i = new InetSocketAddress(hostname, port); + try (Socket s = new Socket()){ + s.connect(i, 750);//TODO this should be at least a second or two, once moved to its own thread + s.shutdownInput(); + s.shutdownOutput(); + s.close(); + rc.statusProperty().set("Ready"); + //System.out.println(String.valueOf(s.isClosed())); + return true; + } catch (IOException e) { + rc.statusProperty().set("Offline"); + } + return false; + } + + @Override + public void run() { + pingPort(); + } +} diff --git a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java index 036e1f2a..f9f2d4ea 100644 --- a/racevisionGame/src/main/java/visualiser/model/RaceConnection.java +++ b/racevisionGame/src/main/java/visualiser/model/RaceConnection.java @@ -8,45 +8,37 @@ import java.net.InetSocketAddress; import java.net.Socket; /** - * Created by cbt24 on 3/05/17. + * Connection for Races */ public class RaceConnection { private final StringProperty hostname; private final int port; private final StringProperty status; + private final StringProperty gamename; + /** * Constructor for remote host connections. * @param hostname URL for remote host * @param port port for game feed + * @param gamename Name of the game */ - public RaceConnection(String hostname, int port) { + public RaceConnection(String hostname, int port, String gamename) { this.hostname = new SimpleStringProperty(hostname); this.port = port; this.status = new SimpleStringProperty(""); check(); + this.gamename = new SimpleStringProperty(gamename); } /** * Tries to create a socket to hostname and port, indicates status after test. * @return true if socket can connect */ - @SuppressWarnings("unused") public boolean check() { - //TODO the connection needs to be moved to its own thread, so it doesn't block fx thread. - InetSocketAddress i = new InetSocketAddress(hostname.get(), port); - try (Socket s = new Socket()){ - s.connect(i, 750);//TODO this should be at least a second or two, once moved to its own thread - status.set("Ready"); - s.shutdownInput(); - s.shutdownOutput(); - s.close(); - //System.out.println(String.valueOf(s.isClosed())); - return true; - } catch (IOException e) {} - - status.set("Offline"); - return false; + Ping ping = new Ping(hostname.get(), port, this); + new Thread(ping).start(); + return true; } public String getHostname() { @@ -64,4 +56,6 @@ public class RaceConnection { public StringProperty statusProperty() { return status; } + + public StringProperty gamenameProperty() { return gamename;} } diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableCanvas.java index 1fda8173..8cef777f 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableCanvas.java @@ -32,8 +32,6 @@ public abstract class ResizableCanvas extends Canvas { public abstract void draw(); - - @Override public boolean isResizable() { return true; diff --git a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java index 3c7be5dc..7664f854 100644 --- a/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java +++ b/racevisionGame/src/main/java/visualiser/model/ResizableRaceCanvas.java @@ -467,6 +467,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { //Prepare to draw. gc.setLineWidth(1); gc.setFill(Color.AQUA); + gc.drawImage(new Image(getClass().getClassLoader().getResourceAsStream("images/WaterBackground.png")), 0, 0); //Calculate the screen coordinates of the boundary. diff --git a/racevisionGame/src/main/java/visualiser/model/Sparkline.java b/racevisionGame/src/main/java/visualiser/model/Sparkline.java index 0dda82cf..5e802ff9 100644 --- a/racevisionGame/src/main/java/visualiser/model/Sparkline.java +++ b/racevisionGame/src/main/java/visualiser/model/Sparkline.java @@ -134,8 +134,8 @@ public class Sparkline { xAxis.setTickUnit(1); //Set y axis details - yAxis.setLowerBound(boats.size() + 1); - yAxis.setUpperBound(0); + yAxis.setLowerBound(boats.size()); + yAxis.setUpperBound(1); yAxis.setAutoRanging(false); yAxis.setLabel("Position in Race"); yAxis.setTickUnit(-1);//Negative tick reverses the y axis. @@ -144,29 +144,6 @@ public class Sparkline { yAxis.setTickLabelsVisible(true); yAxis.setTickMarkVisible(true); yAxis.setMinorTickVisible(true); - - /* TODO FIX currently this doesn't work - I broke it :( - TODO only 0 and 7 get passed in to it for some reason - //Hide minus number from displaying on y axis. - yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { - @Override - public String toString(Number value) { - - //We only label the values between [1,boats.size()]. - System.out.print("y axis: " + value.doubleValue());//TEMP remove - if ((value.doubleValue() >= 1) - && (value.doubleValue() <= boats.size())) { - System.out.println(" is good");//TEMP - return String.format("%7.0f", value.doubleValue()); - - } else { - System.out.println(" is bad");//TEMP - return ""; - - } - } - }); - */ } diff --git a/racevisionGame/src/main/resources/css/dayMode.css b/racevisionGame/src/main/resources/css/dayMode.css new file mode 100644 index 00000000..b15f242b --- /dev/null +++ b/racevisionGame/src/main/resources/css/dayMode.css @@ -0,0 +1,53 @@ +.root { + -fx-base: rgb(215, 232, 218); + -fx-background: rgb(242, 242, 242); + + /* make controls (buttons, thumb, etc.) slightly lighter */ + -fx-color: derive(-fx-base, 2.5%); + + /* text fields and table rows background */ + -fx-control-inner-background: rgb(200, 200, 200); + /* version of -fx-control-inner-background for alternative rows */ + -fx-control-inner-background-alt: derive(-fx-control-inner-background, 10%); + + /* text colors depending on background's brightness */ + -fx-light-text-color: rgb(80, 80, 80); + -fx-mid-text-color: rgb(20, 20, 20); + -fx-dark-text-color: rgb(0, 0, 0); + + /*highlighting/accenting objects. */ + -fx-accent: rgb(128, 128, 128); + + /* color of non-focused yet selected elements */ + -fx-selection-bar-non-focused: rgb(50, 50, 50); + + /*Focus colour*/ + -fx-focus-color: rgb(128, 128, 128); +} + +/* Fix derived prompt color for text fields */ +.text-input { + -fx-prompt-text-fill: derive(-fx-control-inner-background, +0%); + -fx-background-color: #a9a9a9, black, grey; +} + +/* Keep prompt invisible when focused (above color fix overrides it) */ +.text-input:focused { + -fx-prompt-text-fill: transparent; +} + +/* Fix scroll bar buttons arrows colors */ +.scroll-bar > .increment-button > .increment-arrow, +.scroll-bar > .decrement-button > .decrement-arrow { + -fx-background-color: -fx-mark-highlight-color, rgb(255, 255, 255); +} + +.scroll-bar > .increment-button:hover > .increment-arrow, +.scroll-bar > .decrement-button:hover > .decrement-arrow { + -fx-background-color: -fx-mark-highlight-color, rgb(255, 255, 255); +} + +.scroll-bar > .increment-button:pressed > .increment-arrow, +.scroll-bar > .decrement-button:pressed > .decrement-arrow { + -fx-background-color: -fx-mark-highlight-color, rgb(255, 255, 255); +} \ No newline at end of file diff --git a/racevisionGame/src/main/resources/css/nightMode.css b/racevisionGame/src/main/resources/css/nightMode.css new file mode 100644 index 00000000..406cc60b --- /dev/null +++ b/racevisionGame/src/main/resources/css/nightMode.css @@ -0,0 +1,54 @@ +.root { + -fx-base: rgb(20, 20, 20); + -fx-background: rgb(50, 50, 50); + + /* make controls (buttons, thumb, etc.) slightly lighter */ + -fx-color: derive(-fx-base, 10%); + + /* text fields and table rows background */ + -fx-control-inner-background: rgb(50, 50, 50); + /* version of -fx-control-inner-background for alternative rows */ + -fx-control-inner-background-alt: derive(-fx-control-inner-background, 2.5%); + + /* text colors depending on background's brightness */ + -fx-light-text-color: rgb(220, 220, 220); + -fx-mid-text-color: rgb(100, 100, 100); + -fx-dark-text-color: rgb(20, 20, 20); + + /*highlighting/accenting objects. */ + -fx-accent: rgb(128, 128, 128); + + /* color of non-focused yet selected elements */ + -fx-selection-bar-non-focused: rgb(100, 100, 100); + + /*Focus colour*/ + -fx-focus-color: rgb(100, 100, 100); +} + +/* Fix derived prompt color for text fields */ +.text-input { + -fx-prompt-text-fill: derive(-fx-control-inner-background, +0%); + -fx-background-color: #a9a9a9 , grey, grey; + +} + +/* Keep prompt invisible when focused (above color fix overrides it) */ +.text-input:focused { + -fx-prompt-text-fill: transparent; +} + +/* Fix scroll bar buttons arrows colors */ +.scroll-bar > .increment-button > .increment-arrow, +.scroll-bar > .decrement-button > .decrement-arrow { + -fx-background-color: -fx-mark-highlight-color, rgb(255, 255, 255); +} + +.scroll-bar > .increment-button:hover > .increment-arrow, +.scroll-bar > .decrement-button:hover > .decrement-arrow { + -fx-background-color: -fx-mark-highlight-color, rgb(255, 255, 255); +} + +.scroll-bar > .increment-button:pressed > .increment-arrow, +.scroll-bar > .decrement-button:pressed > .decrement-arrow { + -fx-background-color: -fx-mark-highlight-color, rgb(255, 255, 255); +} \ No newline at end of file diff --git a/racevisionGame/src/main/resources/images/SailIcon.png b/racevisionGame/src/main/resources/images/SailIcon.png new file mode 100644 index 00000000..1d4d25d1 Binary files /dev/null and b/racevisionGame/src/main/resources/images/SailIcon.png differ diff --git a/racevisionGame/src/main/resources/images/WaterBackground.png b/racevisionGame/src/main/resources/images/WaterBackground.png new file mode 100644 index 00000000..2bbb5c9d Binary files /dev/null and b/racevisionGame/src/main/resources/images/WaterBackground.png differ diff --git a/racevisionGame/src/main/resources/visualiser/images/boat.png b/racevisionGame/src/main/resources/visualiser/images/boat.png new file mode 100644 index 00000000..90de3fc8 Binary files /dev/null and b/racevisionGame/src/main/resources/visualiser/images/boat.png differ diff --git a/racevisionGame/src/main/resources/visualiser/images/cloud.png b/racevisionGame/src/main/resources/visualiser/images/cloud.png new file mode 100644 index 00000000..6269d545 Binary files /dev/null and b/racevisionGame/src/main/resources/visualiser/images/cloud.png differ diff --git a/racevisionGame/src/main/resources/visualiser/images/sun.png b/racevisionGame/src/main/resources/visualiser/images/sun.png new file mode 100644 index 00000000..a33900a6 Binary files /dev/null and b/racevisionGame/src/main/resources/visualiser/images/sun.png differ diff --git a/racevisionGame/src/main/resources/visualiser/images/whale.png b/racevisionGame/src/main/resources/visualiser/images/whale.png new file mode 100644 index 00000000..b001ccd4 Binary files /dev/null and b/racevisionGame/src/main/resources/visualiser/images/whale.png differ diff --git a/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml b/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml index 254ddb8a..f620bfeb 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/connect.fxml @@ -1,25 +1,18 @@ - - - - - - - - - - + + + + + - + - - - - + + @@ -28,43 +21,42 @@ - + - + - - - + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml new file mode 100644 index 00000000..13159bec --- /dev/null +++ b/racevisionGame/src/main/resources/visualiser/scenes/lobby.fxml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml index 9f1ae541..99e802e5 100644 --- a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml +++ b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml @@ -1,11 +1,17 @@ + + - + + + + + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml new file mode 100644 index 00000000..48870b1f --- /dev/null +++ b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml b/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml new file mode 100644 index 00000000..2d0477a1 --- /dev/null +++ b/racevisionGame/src/main/resources/visualiser/scenes/titleScreen.fxml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/racevisionGame/src/test/java/visualiser/model/RaceConnectionTest.java b/racevisionGame/src/test/java/visualiser/model/RaceConnectionTest.java index 8e38f2ee..02fb463e 100644 --- a/racevisionGame/src/test/java/visualiser/model/RaceConnectionTest.java +++ b/racevisionGame/src/test/java/visualiser/model/RaceConnectionTest.java @@ -16,8 +16,8 @@ public class RaceConnectionTest { @Before public void setUp() { - onlineConnection = new RaceConnection("livedata.americascup.com", 4941); - offlineConnection = new RaceConnection("localhost", 4942); + onlineConnection = new RaceConnection("livedata.americascup.com", 4941, null); + offlineConnection = new RaceConnection("localhost", 4942, null); } /** @@ -30,8 +30,8 @@ public class RaceConnectionTest { } - @Test - public void offlineConnectionStatusOffline() { - assertFalse(offlineConnection.check()); - } +// @Test +// public void offlineConnectionStatusOffline() { +// assertFalse(offlineConnection.check()); +// } }