mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Merge branch 'master' of https://eng-git.canterbury.ac.nz/seng302-2017/team-13
This commit is contained in:
@@ -39,7 +39,7 @@ public class BoatPositionController {
|
||||
positionVbox.getChildren().removeAll();
|
||||
|
||||
for (Boat boat: boatOrder){
|
||||
positionVbox.getChildren().add(new Text(boat.getTeamName() + " " + boat.getVelocity()));
|
||||
positionVbox.getChildren().add(new Text(boat.getTeamName() + " " + boat.getSpeedInKnots() + " Knots"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,13 @@ package seng302.controllers;
|
||||
import javafx.animation.*;
|
||||
import javafx.beans.property.DoubleProperty;
|
||||
import javafx.beans.property.SimpleDoubleProperty;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
import javafx.beans.value.ObservableValue;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.control.CheckBox;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.paint.Color;
|
||||
@@ -36,6 +39,16 @@ import java.util.List;
|
||||
public class CanvasController {
|
||||
@FXML
|
||||
private Canvas canvas;
|
||||
@FXML
|
||||
private AnchorPane contentAnchorPane;
|
||||
@FXML
|
||||
private Text windArrowText, windDirectionText;
|
||||
@FXML
|
||||
private Pane raceTimer;
|
||||
@FXML
|
||||
private BoatPositionController teamPositionsController;
|
||||
@FXML
|
||||
private CheckBox toggleAnnotation;
|
||||
|
||||
private Race race;
|
||||
private GraphicsContext gc;
|
||||
@@ -46,87 +59,11 @@ public class CanvasController {
|
||||
private final double ORIGIN_LAT = 32.320504;
|
||||
private final double ORIGIN_LON = -64.857063;
|
||||
|
||||
@FXML
|
||||
private AnchorPane contentAnchorPane;
|
||||
|
||||
@FXML
|
||||
private Text windArrowText, windDirectionText;
|
||||
|
||||
@FXML Pane raceTimer;
|
||||
|
||||
@FXML
|
||||
BoatPositionController teamPositionsController;
|
||||
|
||||
private Animation.Status raceStatus = Animation.Status.PAUSED;
|
||||
|
||||
private final int SCALE = 16000;
|
||||
|
||||
/**
|
||||
* Display the list of boats in the order they finished the race
|
||||
*/
|
||||
private void loadRaceResultView() {
|
||||
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FinishView.fxml"));
|
||||
loader.setController(new RaceResultController(race));
|
||||
|
||||
try {
|
||||
contentAnchorPane.getChildren().removeAll();
|
||||
contentAnchorPane.getChildren().clear();
|
||||
contentAnchorPane.getChildren().addAll((Pane) loader.load());
|
||||
|
||||
} catch (javafx.fxml.LoadException e) {
|
||||
System.err.println(e.getCause());
|
||||
} catch (IOException e) {
|
||||
System.err.println(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the race timer
|
||||
*/
|
||||
private void loadTimerView(){
|
||||
FXMLLoader loader = new FXMLLoader(getClass().getResource("/raceTimer.fxml"));
|
||||
loader.setController(new RaceTimerController(race));
|
||||
|
||||
try{
|
||||
raceTimer.getChildren().clear();
|
||||
raceTimer.getChildren().removeAll();
|
||||
raceTimer.getChildren().addAll((Pane) loader.load());
|
||||
}
|
||||
catch(javafx.fxml.LoadException e){
|
||||
System.out.println(e);
|
||||
}
|
||||
catch(IOException e){
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Play each boats timeline
|
||||
*/
|
||||
private void playTimelines(){
|
||||
for (TimelineInfo timelineInfo : timelineInfos.values()){
|
||||
Timeline timeline = timelineInfo.getTimeline();
|
||||
|
||||
if (timeline.getStatus() == Animation.Status.PAUSED){
|
||||
timeline.play();
|
||||
}
|
||||
}
|
||||
raceStatus = Animation.Status.RUNNING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pause each boats timeline
|
||||
*/
|
||||
private void pauseTimelines(){
|
||||
for (TimelineInfo timelineInfo : timelineInfos.values()){
|
||||
Timeline timeline = timelineInfo.getTimeline();
|
||||
|
||||
if (timeline.getStatus() == Animation.Status.RUNNING){
|
||||
timeline.pause();
|
||||
}
|
||||
}
|
||||
raceStatus = Animation.Status.PAUSED;
|
||||
}
|
||||
private boolean annotationCheck = true;
|
||||
|
||||
/**
|
||||
* Initialize the controller
|
||||
@@ -196,12 +133,86 @@ public class CanvasController {
|
||||
loadRaceResultView();
|
||||
});
|
||||
|
||||
toggleAnnotation.selectedProperty().addListener(new ChangeListener<Boolean>() {
|
||||
@Override
|
||||
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
|
||||
annotationCheck = !annotationCheck;
|
||||
}
|
||||
});
|
||||
|
||||
//set wind direction!!!!!!! can't find another place to put my code --haoming
|
||||
double windDirection = new ConfigParser("doc/examples/config.xml").getWindDirection();
|
||||
double windDirection = new ConfigParser("/config.xml").getWindDirection();
|
||||
windDirectionText.setText(String.format("%.1f°", windDirection));
|
||||
windArrowText.setRotate(windDirection);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the list of boats in the order they finished the race
|
||||
*/
|
||||
private void loadRaceResultView() {
|
||||
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FinishView.fxml"));
|
||||
loader.setController(new RaceResultController(race));
|
||||
|
||||
try {
|
||||
contentAnchorPane.getChildren().removeAll();
|
||||
contentAnchorPane.getChildren().clear();
|
||||
contentAnchorPane.getChildren().addAll((Pane) loader.load());
|
||||
|
||||
} catch (javafx.fxml.LoadException e) {
|
||||
System.err.println(e.getCause());
|
||||
} catch (IOException e) {
|
||||
System.err.println(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the race timer
|
||||
*/
|
||||
private void loadTimerView(){
|
||||
FXMLLoader loader = new FXMLLoader(getClass().getResource("/raceTimer.fxml"));
|
||||
loader.setController(new RaceTimerController(race));
|
||||
|
||||
try{
|
||||
raceTimer.getChildren().clear();
|
||||
raceTimer.getChildren().removeAll();
|
||||
raceTimer.getChildren().addAll((Pane) loader.load());
|
||||
}
|
||||
catch(javafx.fxml.LoadException e){
|
||||
System.out.println(e);
|
||||
}
|
||||
catch(IOException e){
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Play each boats timeline
|
||||
*/
|
||||
private void playTimelines(){
|
||||
for (TimelineInfo timelineInfo : timelineInfos.values()){
|
||||
Timeline timeline = timelineInfo.getTimeline();
|
||||
|
||||
if (timeline.getStatus() == Animation.Status.PAUSED){
|
||||
timeline.play();
|
||||
}
|
||||
}
|
||||
raceStatus = Animation.Status.RUNNING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pause each boats timeline
|
||||
*/
|
||||
private void pauseTimelines(){
|
||||
for (TimelineInfo timelineInfo : timelineInfos.values()){
|
||||
Timeline timeline = timelineInfo.getTimeline();
|
||||
|
||||
if (timeline.getStatus() == Animation.Status.RUNNING){
|
||||
timeline.pause();
|
||||
}
|
||||
}
|
||||
raceStatus = Animation.Status.PAUSED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates time line for each boat, and stores time time into timelineInfos hash map
|
||||
*/
|
||||
@@ -285,6 +296,8 @@ public class CanvasController {
|
||||
* @param lat
|
||||
* @param lon
|
||||
* @param color
|
||||
* @param name
|
||||
* @param speed
|
||||
*/
|
||||
private void drawBoat(double lat, double lon, Color color, String name, double speed, double heading) {
|
||||
// Latitude
|
||||
@@ -293,12 +306,15 @@ public class CanvasController {
|
||||
|
||||
double diameter = 9;
|
||||
|
||||
// Set boat text
|
||||
gc.setFont(new Font(14));
|
||||
gc.setFill(color);
|
||||
gc.setLineWidth(3);
|
||||
gc.setFontSmoothingType(FontSmoothingType.GRAY);
|
||||
gc.fillText(name + ", " + speed + " knots",x+15,y+15);
|
||||
|
||||
if (annotationCheck) {
|
||||
// Set boat text
|
||||
gc.setFont(new Font(14));
|
||||
gc.setLineWidth(3);
|
||||
gc.setFontSmoothingType(FontSmoothingType.GRAY);
|
||||
gc.fillText(name + ", " + speed + " knots", x + 15, y + 15);
|
||||
}
|
||||
|
||||
gc.fillOval(x, y, diameter, diameter);
|
||||
drawWake(gc, x, y, speed, color, heading);
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
package seng302.controllers;
|
||||
|
||||
import seng302.models.Boat;
|
||||
import seng302.models.OldFileParser;
|
||||
import seng302.models.Race;
|
||||
import seng302.models.parsers.ConfigParser;
|
||||
import seng302.models.parsers.CourseParser;
|
||||
import seng302.models.parsers.TeamsParser;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
@@ -21,11 +20,11 @@ public class RaceController {
|
||||
Race race = null;
|
||||
|
||||
public void initializeRace() {
|
||||
String raceConfigFile;
|
||||
raceConfigFile = "doc/examples/config.json";
|
||||
String raceConfigFile = "/config.xml";
|
||||
String teamsConfigFile = "/teams.xml";
|
||||
|
||||
try {
|
||||
race = createRace(raceConfigFile);
|
||||
race = createRace(raceConfigFile, teamsConfigFile);
|
||||
} catch (Exception e) {
|
||||
System.out.println("There was an error creating the race.");
|
||||
}
|
||||
@@ -37,36 +36,28 @@ public class RaceController {
|
||||
}
|
||||
}
|
||||
|
||||
public Race createRace(String configFile) throws Exception {
|
||||
public Race createRace(String configFile, String teamsConfigFile) throws Exception {
|
||||
Race race = new Race();
|
||||
OldFileParser fp;
|
||||
|
||||
// Read team names from file
|
||||
try{
|
||||
fp = new OldFileParser(configFile);
|
||||
}
|
||||
catch (FileNotFoundException e){
|
||||
System.out.println("Config file does not exist");
|
||||
return null;
|
||||
}
|
||||
TeamsParser tp = new TeamsParser(teamsConfigFile);
|
||||
|
||||
// Read course from file
|
||||
ConfigParser config = new ConfigParser(configFile);
|
||||
|
||||
ArrayList<String> boatNames = new ArrayList<>();
|
||||
ArrayList<Map<String, Object>> teams = fp.getTeams();
|
||||
ArrayList<Boat> teams = tp.getBoats();
|
||||
|
||||
//get race size
|
||||
int numberOfBoats = (int) fp.getRaceSize();
|
||||
int boatsAdded = 0;
|
||||
int numberOfBoats = teams.size();
|
||||
|
||||
//get time scale
|
||||
double timeScale = fp.getTimeScale();
|
||||
double timeScale = config.getTimeScale();
|
||||
race.setTimeScale(timeScale);
|
||||
|
||||
for (Map<String, Object> team : teams) {
|
||||
if (boatsAdded < numberOfBoats){
|
||||
boatNames.add((String) team.get("team-name"));
|
||||
race.addBoat(new Boat(team.get("team-name").toString(), (Double) (team.get("velocity"))));
|
||||
}
|
||||
boatsAdded++;
|
||||
for (Boat boat : teams) {
|
||||
boatNames.add(boat.getTeamName());
|
||||
race.addBoat(boat);
|
||||
}
|
||||
|
||||
// Shuffle team names
|
||||
@@ -77,8 +68,8 @@ public class RaceController {
|
||||
return null;
|
||||
}
|
||||
|
||||
CourseParser cp = new CourseParser("doc/examples/course.xml");
|
||||
race.addCourse(cp.getCourse());
|
||||
CourseParser course = new CourseParser("/course.xml");
|
||||
race.addCourse(course.getCourse());
|
||||
|
||||
return race;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user