From 02aabc316291bd42b71630d68104e45f8c89bff7 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Thu, 28 Sep 2017 14:35:40 +1300 Subject: [PATCH 1/2] Removing dead code in race view controller and fixed mark rounding bug --- .../java/seng302/visualiser/GameClient.java | 4 +- .../java/seng302/visualiser/GameView3D.java | 23 +- .../FinishScreenViewController.java | 2 +- .../controllers/RaceViewController.java | 369 +----------------- src/main/resources/maps/loop.xml | 11 +- 5 files changed, 32 insertions(+), 377 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 4d09e60f..e8d92892 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -382,8 +382,8 @@ public class GameClient { if (raceFinished) { raceViewController.showFinishDialog(finishedBoats); Sounds.playFinishSound(); - close(); - ViewManager.getInstance().getGameClient().stopGame(); +// close(); +// ViewManager.getInstance().getGameClient().stopGame(); //loadFinishScreenView(); } raceState.setRaceFinished(); diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 4e6b421d..e5454dc1 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -350,18 +350,19 @@ public class GameView3D extends GameView{ for (ObservableValue o : Arrays .asList(playerBoat.layoutXProperty(), playerBoat.layoutXProperty())) { o.addListener((obs, oldVal, newVal) -> { + if (playerYacht.getLegNumber() < course.size()) { + List marks = course.get(playerYacht.getLegNumber()).getMarks(); + Point2D midPoint = new Point2D(0, 0); + if (marks.size() == 1) { + midPoint = scaledPoint.findScaledXY(marks.get(0)); + } else if (marks.size() == 2) { + midPoint = (scaledPoint.findScaledXY(marks.get(0))) + .midpoint(scaledPoint.findScaledXY(marks.get(1))); + } - List marks = course.get(playerYacht.getLegNumber()).getMarks(); - Point2D midPoint = new Point2D(0, 0); - if (marks.size() == 1) { - midPoint = scaledPoint.findScaledXY(marks.get(0)); - } else if (marks.size() == 2) { - midPoint = (scaledPoint.findScaledXY(marks.get(0))) - .midpoint(scaledPoint.findScaledXY(marks.get(1))); - } - - if (midPoint != null) { - playerBoat.updateMarkIndicator(midPoint); + if (midPoint != null) { + playerBoat.updateMarkIndicator(midPoint); + } } }); diff --git a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java index 86e39ead..edd805e1 100644 --- a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java +++ b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java @@ -88,7 +88,7 @@ public class FinishScreenViewController implements Initializable { public void switchToStartScreenView() { Sounds.playButtonClick(); - setContentPane("/views/StartScreenView.fxml"); + ViewManager.getInstance().goToStartView(); } public void playButtonHoverSound(MouseEvent mouseEvent) { diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index ea778aa9..45d8d405 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -4,62 +4,34 @@ import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialog; import java.io.IOException; import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; -import java.util.concurrent.TimeUnit; import javafx.animation.RotateTransition; -import javafx.animation.Timeline; import javafx.application.Platform; import javafx.beans.property.ReadOnlyBooleanProperty; -import javafx.collections.FXCollections; -import javafx.collections.ListChangeListener; -import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; -import javafx.geometry.Point2D; -import javafx.scene.Scene; import javafx.scene.SubScene; -import javafx.scene.chart.LineChart; -import javafx.scene.chart.NumberAxis; -import javafx.scene.chart.XYChart.Series; -import javafx.scene.control.Button; -import javafx.scene.control.CheckBox; -import javafx.scene.control.ComboBox; import javafx.scene.control.Label; -import javafx.scene.control.Slider; import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; -import javafx.scene.layout.VBox; -import javafx.scene.paint.Color; import javafx.scene.paint.Paint; -import javafx.scene.shape.Line; -import javafx.scene.shape.Polyline; -import javafx.scene.text.Text; -import javafx.stage.Stage; -import javafx.stage.StageStyle; import javafx.util.Duration; import seng302.model.ClientYacht; import seng302.model.RaceState; -import seng302.model.mark.CompoundMark; -import seng302.model.mark.Mark; import seng302.model.stream.xml.parser.RaceXMLData; import seng302.model.token.TokenType; import seng302.utilities.Sounds; import seng302.visualiser.GameView3D; -import seng302.visualiser.controllers.annotations.ImportantAnnotationController; import seng302.visualiser.controllers.annotations.ImportantAnnotationDelegate; import seng302.visualiser.controllers.annotations.ImportantAnnotationsState; import seng302.visualiser.controllers.dialogs.FinishDialogController; import seng302.visualiser.fxObjects.ChatHistory; -import seng302.visualiser.fxObjects.assets_2D.WindArrow; -import seng302.visualiser.fxObjects.assets_3D.BoatObject; /** * Controller class that manages the display of a race @@ -74,8 +46,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel private AnchorPane loadingScreenPane; @FXML private ImageView loadingScreen; - @FXML - private Pane basePane; + @FXML private JFXButton chatSend; @FXML @@ -83,31 +54,11 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel @FXML private TextField chatInput; @FXML - private LineChart raceSparkLine; - @FXML - private NumberAxis sparklineYAxis; - @FXML - private VBox positionVbox; - @FXML - private CheckBox toggleFps; - @FXML private Label timerLabel; @FXML private StackPane contentStackPane; - private GridPane contentGridPane; - @FXML - private AnchorPane rvAnchorPane; - @FXML - private AnchorPane windArrowHolder; - @FXML - private Slider annotationSlider; - @FXML - private Button selectAnnotationBtn; - @FXML - private ComboBox yachtSelectionComboBox; - @FXML - private Text fpsDisplay; + @FXML private ImageView windImageView; @FXML @@ -119,21 +70,12 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel @FXML private ImageView velocityIcon, handlingIcon, windWalkerIcon, bumperIcon, badRandomIcon; - //Race Data - private Map participants; - private Map markers; - private RaceXMLData courseData; private GameView3D gameView; private RaceState raceState; private ChatHistory chatHistory; - private Timeline timerTimeline; private Timer timer = new Timer(); - private List> sparkLineData = new ArrayList<>(); - private ImportantAnnotationsState importantAnnotations; - private Polyline windArrow = new WindArrow(Color.LIGHTGRAY); - private ObservableList selectionComboBoxList = FXCollections.observableArrayList(); private ClientYacht player; private JFXDialog finishScreenDialog; private FinishDialogController finishDialogController; @@ -149,11 +91,11 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel Image loadingImage = new Image("PP.png"); loadingScreen.setImage(loadingImage); //Centers the Image within the image view - double w = 0; - double h = 0; + double w; + double h; double ratioX = loadingScreen.getFitWidth() / loadingImage.getWidth(); double ratioY = loadingScreen.getFitHeight() / loadingImage.getHeight(); - double reduceRatio = 0; + double reduceRatio; if(ratioX >= ratioY) { reduceRatio = ratioY; } else { @@ -180,9 +122,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel chatHistoryHolder.heightProperty() ); - contentStackPane.setOnMouseClicked(event -> { - contentStackPane.requestFocus(); - }); + contentStackPane.setOnMouseClicked(event -> contentStackPane.requestFocus()); Platform.runLater(contentStackPane::requestFocus); //Makes the chat history non transparent when clicked on chatInput.focusedProperty().addListener((observable, oldValue, newValue) -> { @@ -205,12 +145,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel loadingScreenPane.setVisible(false); contentStackPane.setVisible(true); - Platform.runLater(new Runnable() { - @Override - public void run() { - contentStackPane.requestFocus(); - } - }); + Platform.runLater(() -> contentStackPane.requestFocus()); } /** @@ -238,24 +173,13 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel Map participants, RaceXMLData raceData, RaceState raceState, ClientYacht player) { - this.participants = participants; - this.courseData = raceData; - this.markers = raceData.getCompoundMarks(); this.raceState = raceState; this.player = player; - raceState.getPlayerPositions().addListener((ListChangeListener) c -> { - while (c.next()) { - if (c.wasPermutated()) { - updateOrder(raceState.getPlayerPositions()); - } - } - }); player.addPowerUpListener(this::displayPowerUpIcon); player.addPowerDownListener(this::removeIcon); - updateOrder(raceState.getPlayerPositions()); gameView = new GameView3D(); Platform.runLater(() -> { contentStackPane.getChildren().add(0, gameView.getAssets()); @@ -342,7 +266,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } } - public void removeIcon(ClientYacht yacht) { + private void removeIcon(ClientYacht yacht) { if (yacht == player) { blinkingTimer.cancel(); iconToDisplay.setVisible(false); @@ -357,37 +281,10 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel * @param importantAnnotationsState The current state of the selected annotations */ public void importantAnnotationsChanged(ImportantAnnotationsState importantAnnotationsState) { - this.importantAnnotations = importantAnnotationsState; - setAnnotations((int) annotationSlider.getValue()); // Refresh the displayed annotations +// setAnnotations((int) annotationSlider.getValue()); // Refresh the displayed annotations } - /** - * Loads the "select annotations" view in a new window - */ - private void loadSelectAnnotationView() { - try { - FXMLLoader fxmlLoader = new FXMLLoader(); - Stage stage = new Stage(); - // Set controller - ImportantAnnotationController controller = new ImportantAnnotationController( - this, stage - ); - fxmlLoader.setController(controller); - // Load FXML and set CSS - fxmlLoader.setLocation( - getClass().getResource("/views/importantAnnotationSelectView.fxml") - ); - Scene scene = new Scene(fxmlLoader.load(), 469, 298); - scene.getStylesheets().add(getClass().getResource("/css/master.css").toString()); - stage.initStyle(StageStyle.UNDECORATED); - stage.setScene(scene); - stage.show(); - controller.loadState(importantAnnotations); - } catch (IOException e) { - e.printStackTrace(); - } - } /** * Initialises a timer which updates elements of the RaceView such as wind direction, yacht @@ -406,34 +303,6 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel }, 0, 1000); } - /** - * Iterates over all corners until ones SeqID matches with the yachts current leg number. - * Then it gets the compoundMarkID of that corner and uses it to fetch the appropriate mark - * Returns null if no next mark found. - * @param bg The BoatGroup to find the next mark of - * @return The next Mark or null if none found - */ - private Mark getNextMark(BoatObject bg) { - // TODO: 1/08/17 Move to GameView -// -// Integer legNumber = bg.getClientYacht().getLegNumber(); -// List markSequence = courseData.getMarkSequence(); -// -// if (legNumber == 0) { -// return null; -// } else if (legNumber == markSequence.size() - 1) { -// return null; -// } -// -// for (Corner corner : markSequence) { -// if (legNumber + 2 == corner.getSeqID()) { -// return courseData.getCompoundMarks().get(corner.getCompoundMarkID()); -// } -// } -// return null; - return null; - } - /** * Updates the wind direction arrow and text as from info from the StreamParser @@ -516,226 +385,6 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel boatHeadingLabel.setText(String.format("Boat Heading:\n%.1f°", player.getHeading())); } - /** - * Updates the order of the yachts as from the StreamParser and sets them in the yacht order - * section - */ - private void updateOrder(ObservableList yachts) { -// List vboxEntries = new ArrayList<>(); -// -// for (int i = 0; i < yachts.size(); i++) { -//// System.out.println("yacht == null " + String.valueOf(yacht == null)); -// if (yachts.get(i).getBoatStatus() == BoatStatus.FINISHED -// .getCode()) { // 3 is finish status -// Text textToAdd = new Text(i + 1 + ". " + -// yachts.get(i).getShortName() + " (Finished)"); -// textToAdd.setFill(Paint.valueOf("#d3d3d3")); -// vboxEntries.add(textToAdd); -// -// } else { -// Text textToAdd = new Text(i + 1 + ". " + -// yachts.get(i).getShortName() + " "); -// textToAdd.setFill(Paint.valueOf("#d3d3d3")); -// textToAdd.setStyle(""); -// vboxEntries.add(textToAdd); -// } -// } -// Platform.runLater(() -> -// positionVbox.getChildren().setAll(vboxEntries) -// ); - } - - - private void updateLaylines(BoatObject bg) { - // TODO: 1/08/17 move to GameView -// -// Mark nextMark = getNextMark(bg); -// Boolean isUpwind = null; -// // Can only calc leg direction if there is a next mark and it is a gate mark -// if (nextMark != null) { -// if (nextMark instanceof GateMark) { -// if (bg.isUpwindLeg(gameViewController, nextMark)) { -// isUpwind = true; -// } else { -// isUpwind = false; -// } -// -// for(MarkObject mg : gameViewController.getMarkGroups()) { -// -// mg.removeLaylines(); -// -// if (mg.getMainMark().getId() == nextMark.getId()) { -// -// SingleMark singleMark1 = ((GateMark) nextMark).getSingleMark1(); -// SingleMark singleMark2 = ((GateMark) nextMark).getSingleMark2(); -// Point2D markPoint1 = gameViewController -// .findScaledXY(singleMark1.getLatitude(), singleMark1.getLongitude()); -// Point2D markPoint2 = gameViewController -// .findScaledXY(singleMark2.getLatitude(), singleMark2.getLongitude()); -// HashMap angleAndSpeed; -// if (isUpwind) { -// angleAndSpeed = PolarTable.getOptimalUpwindVMG(StreamParser.getWindSpeed()); -// } else { -// angleAndSpeed = PolarTable.getOptimalDownwindVMG(StreamParser.getWindSpeed()); -// } -// -// Double resultingAngle = angleAndSpeed.keySet().iterator().next(); -// -// -// Point2D yachtCurrentPos = new Point2D(bg.getBoatLayoutX(), bg.getBoatLayoutY()); -// Point2D gateMidPoint = markPoint1.midpoint(markPoint2); -// Integer lineFuncResult = GeoUtility.lineFunction(yachtCurrentPos, gateMidPoint, markPoint2); -// Line rightLayline = new Line(); -// Line leftLayline = new Line(); -// if (lineFuncResult == 1) { -// rightLayline = makeRightLayline(markPoint2, 180 - resultingAngle, StreamParser.getWindDirection()); -// leftLayline = makeLeftLayline(markPoint1, 180 - resultingAngle, StreamParser.getWindDirection()); -// } else if (lineFuncResult == -1) { -// rightLayline = makeRightLayline(markPoint1, 180 - resultingAngle, StreamParser.getWindDirection()); -// leftLayline = makeLeftLayline(markPoint2, 180 - resultingAngle, StreamParser.getWindDirection()); -// } -// -// leftLayline.setStrokeWidth(0.5); -// leftLayline.setStroke(bg.getBoat().getColour()); -// -// rightLayline.setStrokeWidth(0.5); -// rightLayline.setStroke(bg.getBoat().getColour()); -// -// bg.setLaylines(leftLayline, rightLayline); -// mg.addLaylines(leftLayline, rightLayline); -// -// } -// } -// } -// } - } - - - private Point2D getPointRotation(Point2D ref, Double distance, Double angle) { - Double newX = ref.getX() + (ref.getX() + distance - ref.getX()) * Math.cos(angle) - - (ref.getY() + distance - ref.getY()) * Math.sin(angle); - Double newY = ref.getY() + (ref.getX() + distance - ref.getX()) * Math.sin(angle) - + (ref.getY() + distance - ref.getY()) * Math.cos(angle); - - return new Point2D(newX, newY); - } - - - public Line makeLeftLayline(Point2D startPoint, Double layLineAngle, Double baseAngle) { - Point2D ep = getPointRotation(startPoint, 50.0, baseAngle + layLineAngle); - Line line = new Line(startPoint.getX(), startPoint.getY(), ep.getX(), ep.getY()); - return line; - - } - - - public Line makeRightLayline(Point2D startPoint, Double layLineAngle, Double baseAngle) { - - Point2D ep = getPointRotation(startPoint, 50.0, baseAngle - layLineAngle); - Line line = new Line(startPoint.getX(), startPoint.getY(), ep.getX(), ep.getY()); - return line; - - } - - - /** - * Initialised the combo box with any yachts currently in the race and adds the required listener - * for the combobox to take action upon selection - */ - private void initialiseBoatSelectionComboBox() { -// yachtSelectionComboBox.setItems( -// FXCollections.observableArrayList(participants.values()) -// ); -// //Null check is if the listener is fired but nothing selected -// yachtSelectionComboBox.valueProperty().addListener((obs, lastSelection, selectedBoat) -> { -// if (selectedBoat != null) { -// gameView.selectBoat(selectedBoat); -// } -// }); - - //TODO uncomment out -// selectionComboBoxList.setAll(participants.values()); -// yachtSelectionComboBox.setItems(selectionComboBoxList); -// yachtSelectionComboBox.valueProperty().addListener((obs, lastSelection, selectedBoat) -> { -// if (selectedBoat != null) { -// gameView.selectBoat(selectedBoat); -// } -// }); - } - - /** - * Display the list of yachts in the order they finished the race - */ - private void loadRaceResultView() { - FXMLLoader loader = new FXMLLoader(getClass().getResource("/views/FinishView.fxml")); - - try { - contentGridPane.getChildren().removeAll(); - contentGridPane.getChildren().clear(); - contentGridPane.getChildren().addAll((Pane) loader.load()); - - } catch (javafx.fxml.LoadException e) { - System.err.println(e.getCause().toString()); - } catch (IOException e) { - System.err.println(e.toString()); - } - } - - private String getMillisToFormattedTime(long milliseconds) { - return String.format("%02d:%02d:%02d", - TimeUnit.MILLISECONDS.toHours(milliseconds), - TimeUnit.MILLISECONDS.toMinutes(milliseconds) % 60, //Modulus 60 minutes per hour - TimeUnit.MILLISECONDS.toSeconds(milliseconds) % 60 //Modulus 60 seconds per minute - ); - } - - private void setAnnotations(Integer annotationLevel) { -// switch (annotationLevel) { -// // No Annotations -// case 0: -// gameView.setAnnotationVisibilities( -// false, false, false, false, false, false -// ); -// break; -// // Important Annotations -// case 1: -// gameView.setAnnotationVisibilities( -// importantAnnotations.getAnnotationState(Annotation.NAME), -// importantAnnotations.getAnnotationState(Annotation.SPEED), -// importantAnnotations.getAnnotationState(Annotation.ESTTIMETONEXTMARK), -// importantAnnotations.getAnnotationState(Annotation.LEGTIME), -// importantAnnotations.getAnnotationState(Annotation.TRACK), -// importantAnnotations.getAnnotationState(Annotation.WAKE) -// ); -// break; -// // All Annotations -// case 2: -// gameView.setAnnotationVisibilities( -// true, true, true, true, true, true -// ); -// break; -// } - } - - - /** - * Sets all the annotations of the selected yacht to be visible and all others to be hidden - * - * @param yacht The yacht for which we want to view all annotations - */ - private void setSelectedBoat(ClientYacht yacht) { -// for (BoatObject bg : gameViewController.getBoatGroups()) { -// //We need to iterate over all race groups to get the matching yacht group belonging to this yacht if we -// //are to toggle its annotations, there is no other backwards knowledge of a yacht to its yachtgroup. -// if (bg.getBoat().getHullID().equals(yacht.getHullID())) { -//// updateLaylines(bg); -// bg.setIsSelected(true); -//// selectedBoat = yacht; -// } else { -// bg.setIsSelected(false); -// } -// } - } public void updateTokens(RaceXMLData raceData) { gameView.updateTokens(raceData.getTokens()); diff --git a/src/main/resources/maps/loop.xml b/src/main/resources/maps/loop.xml index aa72204a..008a58ce 100644 --- a/src/main/resources/maps/loop.xml +++ b/src/main/resources/maps/loop.xml @@ -15,7 +15,6 @@ - @@ -29,21 +28,27 @@ + + + + - + + + - + From 21ce34dda26a5e554dbb752f4ff33faa751ede87 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Thu, 28 Sep 2017 15:08:34 +1300 Subject: [PATCH 2/2] Fixed finish screen and cleaned up dead code --- .../visualiser/ClientToServerThread.java | 2 +- .../java/seng302/visualiser/GameClient.java | 63 +++--------- .../FinishScreenViewController.java | 97 ------------------- .../visualiser/controllers/ViewManager.java | 2 +- .../dialogs/ServerCreationController.java | 2 +- .../resources/views/FinishScreenView.fxml | 53 ---------- .../views/importantAnnotationSelectView.fxml | 32 ------ 7 files changed, 18 insertions(+), 233 deletions(-) delete mode 100644 src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java delete mode 100644 src/main/resources/views/FinishScreenView.fxml delete mode 100644 src/main/resources/views/importantAnnotationSelectView.fxml diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index d8d52fff..c7f23280 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -182,7 +182,7 @@ public class ClientToServerThread implements Runnable { Platform.runLater(() -> { ViewManager.getInstance().showErrorSnackBar("Server rejected connection."); - ViewManager.getInstance().goToStartView(); +// ViewManager.getInstance().goToStartView(); }); } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index e8d92892..77b383c4 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -5,9 +5,7 @@ import java.text.SimpleDateFormat; import java.time.ZoneId; import java.time.ZoneOffset; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.List; import java.util.Map; import java.util.TimeZone; import java.util.Timer; @@ -17,7 +15,6 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; -import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.util.Pair; import seng302.gameServer.GameStages; @@ -49,19 +46,12 @@ import seng302.visualiser.controllers.RaceViewController; import seng302.visualiser.controllers.ViewManager; import seng302.visualiser.controllers.dialogs.PopupDialogController; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.util.*; - /** * This class is a client side instance of a yacht racing game in JavaFX. The game is instantiated * with a JavaFX Pane to insert itself into. */ public class GameClient { - private Pane holderPane; private ClientToServerThread socketThread; private MainServerThread server; @@ -83,10 +73,8 @@ public class GameClient { /** * Create an instance of the game client. Does not do anything until run with runAsClient() * runAsHost(). - * @param holder The JavaFX Pane that the visual elements for the race will be inserted into. */ - public GameClient(Pane holder) { - this.holderPane = holder; + public GameClient() { this.gameKeyBind = GameKeyBind.getInstance(); } @@ -117,10 +105,7 @@ public class GameClient { ViewManager.getInstance().setProperty("serverName", regattaData.getRegattaName()); ViewManager.getInstance().setProperty("mapName", regattaData.getCourseName()); - getServerThread().setConnectionErrorListener((eMessage) -> { - ViewManager.getInstance().showErrorSnackBar(eMessage); - //destroyClientToServerThread(); - }); + getServerThread().setConnectionErrorListener((eMessage) -> ViewManager.getInstance().showErrorSnackBar(eMessage)); this.lobbyController = ViewManager.getInstance().goToLobby(true); @@ -129,18 +114,11 @@ public class GameClient { } } - private void destroyClientToServerThread() { - socketThread.closeSocket(); - socketThread = null; - } - /** * Connect to a game as the host at the given address and starts the visualiser. - * @param ipAddress IP to connect to. - * @param portNumber Port to connect to. */ public ServerDescription runAsHost( - String ipAddress, Integer portNumber, String serverName, Integer maxPlayers, String race, + String serverName, Integer maxPlayers, String race, Integer numLegs, Boolean tokensEnabled ) { XMLGenerator.setDefaultRaceName(serverName); @@ -156,7 +134,7 @@ public class GameClient { } try { - startClientToServerThread(ipAddress, 4942); + startClientToServerThread("localhost", 4942); } catch (IOException e) { showConnectionError("Cannot connect to server as host"); } @@ -191,7 +169,8 @@ public class GameClient { this.lobbyController = ViewManager.getInstance().goToLobby(false); ViewManager.getInstance().setPlayerList(clientLobbyList); - return new ServerDescription(serverName, regattaData.getCourseName(), GameState.getNumberOfPlayers(), GameState.getCapacity(), ipAddress, 4942); + return new ServerDescription(serverName, regattaData.getCourseName(), GameState.getNumberOfPlayers(), GameState.getCapacity(), + "localhost", 4942); } private void tearDownConnection() { @@ -294,10 +273,12 @@ public class GameClient { case CHATTER_TEXT: Pair playerIdMessagePair = StreamParser .extractChatterText(packet); - raceView.updateChatHistory( - allBoatsMap.get(playerIdMessagePair.getKey()).getColour(), - playerIdMessagePair.getValue() - ); + if (playerIdMessagePair != null) { + raceView.updateChatHistory( + allBoatsMap.get(playerIdMessagePair.getKey()).getColour(), + playerIdMessagePair.getValue() + ); + } } } } @@ -333,8 +314,6 @@ public class GameClient { positionData.getLon(), positionData.getHeading(), positionData.getGroundSpeed()); } - } else if (positionData.getType() == DeviceType.MARK_TYPE) { - //CompoundMark mark = courseData.getCompoundMarks().get(positionData.getDeviceId()); } } @@ -372,21 +351,17 @@ public class GameClient { ClientYacht clientYacht = allBoatsMap.get((int) boatData[0]); clientYacht.setEstimateTimeTillNextMark(raceState.getRaceTime() - boatData[1]); clientYacht.setEstimateTimeAtFinish(boatData[2]); -// int legNumber = (int) boatData[3]; clientYacht.setBoatStatus((int) boatData[4]); -// if (legNumber != clientYacht.getLegNumber()) { -// clientYacht.setLegNumber(legNumber); -// } } - if (raceFinished) { - raceViewController.showFinishDialog(finishedBoats); + if (raceFinished && !raceState.getRaceFinished()) { + raceState.setRaceFinished(); Sounds.playFinishSound(); + raceViewController.showFinishDialog(finishedBoats); // close(); // ViewManager.getInstance().getGameClient().stopGame(); //loadFinishScreenView(); } - raceState.setRaceFinished(); } } @@ -397,10 +372,6 @@ public class GameClient { } } - private void close() { - socketThread.setSocketToClose(); - } - /** * Handle the key-pressed event from the text field. * @param e The key event triggering this call @@ -527,10 +498,6 @@ public class GameClient { return socketThread; } - public List getPlayerNames(){ - return Collections.unmodifiableList(clientLobbyList.sorted()); - } - public void stopGame() { GameState.setCurrentStage(GameStages.CANCELLED); if (server != null) server.terminate(); diff --git a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java deleted file mode 100644 index edd805e1..00000000 --- a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java +++ /dev/null @@ -1,97 +0,0 @@ -package seng302.visualiser.controllers; - -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.ResourceBundle; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.fxml.Initializable; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; -import javafx.scene.control.cell.PropertyValueFactory; -import javafx.scene.input.MouseEvent; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.Pane; -import seng302.model.ClientYacht; -import seng302.utilities.Sounds; - -public class FinishScreenViewController implements Initializable { - - @FXML - private GridPane finishScreenGridPane; - @FXML - private TableView finishOrderTable; - @FXML - private TableColumn posCol; - @FXML - private TableColumn boatNameCol; - @FXML - private TableColumn shortNameCol; - @FXML - private TableColumn countryCol; - - ObservableList data = FXCollections.observableArrayList(); - - @Override - public void initialize(URL location, ResourceBundle resources) { - finishScreenGridPane.getStylesheets() - .add(getClass().getResource("/css/Master.css").toString()); - finishOrderTable.getStylesheets().add(getClass().getResource("/css/Master.css").toString()); - - // set up data for table - finishOrderTable.setItems(data); - - // setting table col data - posCol.setCellValueFactory( - new PropertyValueFactory<>("position") - ); - boatNameCol.setCellValueFactory( - new PropertyValueFactory<>("boatName") - ); - shortNameCol.setCellValueFactory( - new PropertyValueFactory<>("shortName") - ); - countryCol.setCellValueFactory( - new PropertyValueFactory<>("country") - ); - finishOrderTable.refresh(); - } - - public void setFinishers(Collection participants) { - List sorted = new ArrayList<>(participants); - sorted.sort(Comparator.comparingInt(ClientYacht::getPlacing)); - finishOrderTable.getItems().setAll(sorted); - } - - private void setContentPane(String jfxUrl) { - try { - // get the main controller anchor pane (FinishView -> MainView) - AnchorPane contentPane = (AnchorPane) finishScreenGridPane.getParent(); - contentPane.getChildren().removeAll(); - contentPane.getChildren().clear(); - contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString()); - contentPane.getChildren() - .addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl))); - } catch (javafx.fxml.LoadException e) { - System.out.println("[Controller] FXML load exception"); - } catch (IOException e) { - System.out.println("[Controller] IO exception"); - } - } - - public void switchToStartScreenView() { - Sounds.playButtonClick(); - ViewManager.getInstance().goToStartView(); - } - - public void playButtonHoverSound(MouseEvent mouseEvent) { - Sounds.playHoverSound(); - } -} diff --git a/src/main/java/seng302/visualiser/controllers/ViewManager.java b/src/main/java/seng302/visualiser/controllers/ViewManager.java index 1e3ab4ce..28a9f1b2 100644 --- a/src/main/java/seng302/visualiser/controllers/ViewManager.java +++ b/src/main/java/seng302/visualiser/controllers/ViewManager.java @@ -79,7 +79,7 @@ public class ViewManager { decorator.applyCss(); decorator.getStylesheets() .add(getClass().getResource("/css/Master.css").toExternalForm()); - gameClient = new GameClient(decorator); + gameClient = new GameClient(); setDecorator(decorator); stage.getIcons().add(new Image(getClass().getResourceAsStream("/PP.png"))); diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/ServerCreationController.java b/src/main/java/seng302/visualiser/controllers/dialogs/ServerCreationController.java index fcd33e0d..3cf9fc5e 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/ServerCreationController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/ServerCreationController.java @@ -115,7 +115,7 @@ public class ServerCreationController implements Initializable { */ private void createServer() { ServerDescription serverDescription = ViewManager.getInstance().getGameClient() - .runAsHost("localhost", 4941, serverName.getText(), (int) maxPlayersSlider + .runAsHost(serverName.getText(), (int) maxPlayersSlider .getValue(), mapMaker.getCurrentRacePath(), (int) legsSlider.getValue(), pickupsCheckBox.isSelected()); if (serverDescription == null){ diff --git a/src/main/resources/views/FinishScreenView.fxml b/src/main/resources/views/FinishScreenView.fxml deleted file mode 100644 index 0ebdf261..00000000 --- a/src/main/resources/views/FinishScreenView.fxml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -