mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 06:18:44 +00:00
Merge remote-tracking branch 'origin/develop' into develop
This commit is contained in:
@@ -6,8 +6,12 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
import seng302.gameServer.server.messages.BoatAction;
|
import seng302.gameServer.server.messages.BoatAction;
|
||||||
import seng302.gameServer.server.messages.BoatStatus;
|
import seng302.gameServer.server.messages.BoatStatus;
|
||||||
import seng302.gameServer.server.messages.MarkRoundingMessage;
|
import seng302.gameServer.server.messages.MarkRoundingMessage;
|
||||||
@@ -16,6 +20,7 @@ import seng302.gameServer.server.messages.Message;
|
|||||||
import seng302.gameServer.server.messages.RoundingBoatStatus;
|
import seng302.gameServer.server.messages.RoundingBoatStatus;
|
||||||
import seng302.gameServer.server.messages.YachtEventCodeMessage;
|
import seng302.gameServer.server.messages.YachtEventCodeMessage;
|
||||||
import seng302.model.GeoPoint;
|
import seng302.model.GeoPoint;
|
||||||
|
import seng302.model.Limit;
|
||||||
import seng302.model.Player;
|
import seng302.model.Player;
|
||||||
import seng302.model.PolarTable;
|
import seng302.model.PolarTable;
|
||||||
import seng302.model.ServerYacht;
|
import seng302.model.ServerYacht;
|
||||||
@@ -23,6 +28,7 @@ import seng302.model.mark.CompoundMark;
|
|||||||
import seng302.model.mark.Mark;
|
import seng302.model.mark.Mark;
|
||||||
import seng302.model.mark.MarkOrder;
|
import seng302.model.mark.MarkOrder;
|
||||||
import seng302.utilities.GeoUtility;
|
import seng302.utilities.GeoUtility;
|
||||||
|
import seng302.utilities.XMLParser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Static class to hold information about the current state of the game (model)
|
* A Static class to hold information about the current state of the game (model)
|
||||||
@@ -33,6 +39,7 @@ public class GameState implements Runnable {
|
|||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
interface NewMessageListener {
|
interface NewMessageListener {
|
||||||
|
|
||||||
void notify(Message message);
|
void notify(Message message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,6 +66,7 @@ public class GameState implements Runnable {
|
|||||||
private static MarkOrder markOrder;
|
private static MarkOrder markOrder;
|
||||||
private static long startTime;
|
private static long startTime;
|
||||||
private static Set<Mark> marks;
|
private static Set<Mark> marks;
|
||||||
|
private static List<Limit> courseLimit;
|
||||||
|
|
||||||
private static List<NewMessageListener> markListeners;
|
private static List<NewMessageListener> markListeners;
|
||||||
|
|
||||||
@@ -81,7 +89,7 @@ public class GameState implements Runnable {
|
|||||||
yachts = new HashMap<>();
|
yachts = new HashMap<>();
|
||||||
players = new ArrayList<>();
|
players = new ArrayList<>();
|
||||||
GameState.hostIpAddress = hostIpAddress;
|
GameState.hostIpAddress = hostIpAddress;
|
||||||
;
|
|
||||||
currentStage = GameStages.LOBBYING;
|
currentStage = GameStages.LOBBYING;
|
||||||
isRaceStarted = false;
|
isRaceStarted = false;
|
||||||
//set this when game stage changes to prerace
|
//set this when game stage changes to prerace
|
||||||
@@ -94,13 +102,29 @@ public class GameState implements Runnable {
|
|||||||
new Thread(this, "GameState").start(); //Run the auto updates on the game state
|
new Thread(this, "GameState").start(); //Run the auto updates on the game state
|
||||||
|
|
||||||
marks = new MarkOrder().getAllMarks();
|
marks = new MarkOrder().getAllMarks();
|
||||||
|
setCourseLimit("/server_config/race.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCourseLimit(String url) {
|
||||||
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||||
|
documentBuilderFactory.setNamespaceAware(true);
|
||||||
|
DocumentBuilder documentBuilder;
|
||||||
|
Document document = null;
|
||||||
|
try {
|
||||||
|
documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||||
|
document = documentBuilder.parse(new InputSource(getClass().getResourceAsStream(url)));
|
||||||
|
} catch (Exception e) {
|
||||||
|
// sorry, we have to catch general one, otherwise we have to catch five different exceptions.
|
||||||
|
logger.trace("Failed to load course limit for boundary collision detection.", e);
|
||||||
|
}
|
||||||
|
courseLimit = XMLParser.parseRace(document).getCourseLimit();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getHostIpAddress() {
|
public static String getHostIpAddress() {
|
||||||
return hostIpAddress;
|
return hostIpAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Set<Mark> getMarks(){
|
public static Set<Mark> getMarks() {
|
||||||
return Collections.unmodifiableSet(marks);
|
return Collections.unmodifiableSet(marks);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +168,7 @@ public class GameState implements Runnable {
|
|||||||
return markOrder;
|
return markOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getStartTime(){
|
public static long getStartTime() {
|
||||||
return startTime;
|
return startTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,7 +267,7 @@ public class GameState implements Runnable {
|
|||||||
yacht.runAutoPilot();
|
yacht.runAutoPilot();
|
||||||
yacht.updateLocation(timeInterval);
|
yacht.updateLocation(timeInterval);
|
||||||
if (yacht.getBoatStatus() != BoatStatus.FINISHED) {
|
if (yacht.getBoatStatus() != BoatStatus.FINISHED) {
|
||||||
checkForCollision(yacht);
|
checkCollision(yacht);
|
||||||
checkForLegProgression(yacht);
|
checkForLegProgression(yacht);
|
||||||
raceFinished = false;
|
raceFinished = false;
|
||||||
}
|
}
|
||||||
@@ -254,9 +278,28 @@ public class GameState implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the yacht has crossed the course limit
|
||||||
|
*
|
||||||
|
* @param yacht the yacht to be tested
|
||||||
|
* @return a boolean value of if there is a boundary collision
|
||||||
|
*/
|
||||||
|
private static Boolean checkBoundaryCollision(ServerYacht yacht) {
|
||||||
|
for (int i = 0; i < courseLimit.size() - 1; i++) {
|
||||||
|
if (GeoUtility.checkCrossedLine(courseLimit.get(i), courseLimit.get(i + 1),
|
||||||
|
yacht.getLastLocation(), yacht.getLocation()) != 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (GeoUtility.checkCrossedLine(courseLimit.get(courseLimit.size() - 1), courseLimit.get(0),
|
||||||
|
yacht.getLastLocation(), yacht.getLocation()) != 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public static void checkForCollision(ServerYacht serverYacht) {
|
public static void checkCollision(ServerYacht serverYacht) {
|
||||||
ServerYacht collidedYacht = checkCollision(serverYacht);
|
ServerYacht collidedYacht = checkYachtCollision(serverYacht);
|
||||||
if (collidedYacht != null) {
|
if (collidedYacht != null) {
|
||||||
GeoPoint originalLocation = serverYacht.getLocation();
|
GeoPoint originalLocation = serverYacht.getLocation();
|
||||||
serverYacht.setLocation(
|
serverYacht.setLocation(
|
||||||
@@ -275,7 +318,7 @@ public class GameState implements Runnable {
|
|||||||
new YachtEventCodeMessage(serverYacht.getSourceId())
|
new YachtEventCodeMessage(serverYacht.getSourceId())
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
Mark collidedMark = markCollidedWith(serverYacht);
|
Mark collidedMark = checkMarkCollision(serverYacht);
|
||||||
if (collidedMark != null) {
|
if (collidedMark != null) {
|
||||||
serverYacht.setLocation(
|
serverYacht.setLocation(
|
||||||
calculateBounceBack(serverYacht, collidedMark, BOUNCE_DISTANCE_MARK)
|
calculateBounceBack(serverYacht, collidedMark, BOUNCE_DISTANCE_MARK)
|
||||||
@@ -286,6 +329,17 @@ public class GameState implements Runnable {
|
|||||||
notifyMessageListeners(
|
notifyMessageListeners(
|
||||||
new YachtEventCodeMessage(serverYacht.getSourceId())
|
new YachtEventCodeMessage(serverYacht.getSourceId())
|
||||||
);
|
);
|
||||||
|
} else if (checkBoundaryCollision(serverYacht)) {
|
||||||
|
serverYacht.setLocation(
|
||||||
|
calculateBounceBack(serverYacht, serverYacht.getLocation(),
|
||||||
|
BOUNCE_DISTANCE_YACHT)
|
||||||
|
);
|
||||||
|
serverYacht.setCurrentVelocity(
|
||||||
|
serverYacht.getCurrentVelocity() * COLLISION_VELOCITY_PENALTY
|
||||||
|
);
|
||||||
|
notifyMessageListeners(
|
||||||
|
new YachtEventCodeMessage(serverYacht.getSourceId())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -310,7 +364,7 @@ public class GameState implements Runnable {
|
|||||||
yacht.changeVelocity(-velocity / 200);
|
yacht.changeVelocity(-velocity / 200);
|
||||||
} else if (velocity > 100) {
|
} else if (velocity > 100) {
|
||||||
yacht.changeVelocity(-velocity / 50);
|
yacht.changeVelocity(-velocity / 50);
|
||||||
} else if (velocity <= 100){
|
} else if (velocity <= 100) {
|
||||||
yacht.setCurrentVelocity(0d);
|
yacht.setCurrentVelocity(0d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -352,6 +406,7 @@ public class GameState implements Runnable {
|
|||||||
/**
|
/**
|
||||||
* 4 Different cases of progression in the race 1 - Passing the start line 2 - Passing any
|
* 4 Different cases of progression in the race 1 - Passing the start line 2 - Passing any
|
||||||
* in-race Gate 3 - Passing any in-race Mark 4 - Passing the finish line
|
* in-race Gate 3 - Passing any in-race Mark 4 - Passing the finish line
|
||||||
|
*
|
||||||
* @param yacht the current yacht to check for progression
|
* @param yacht the current yacht to check for progression
|
||||||
*/
|
*/
|
||||||
private void checkForLegProgression(ServerYacht yacht) {
|
private void checkForLegProgression(ServerYacht yacht) {
|
||||||
@@ -515,7 +570,7 @@ public class GameState implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Mark markCollidedWith(ServerYacht yacht) {
|
private static Mark checkMarkCollision(ServerYacht yacht) {
|
||||||
Set<Mark> marksInRace = GameState.getMarks();
|
Set<Mark> marksInRace = GameState.getMarks();
|
||||||
for (Mark mark : marksInRace) {
|
for (Mark mark : marksInRace) {
|
||||||
if (GeoUtility.getDistance(yacht.getLocation(), mark)
|
if (GeoUtility.getDistance(yacht.getLocation(), mark)
|
||||||
@@ -531,12 +586,14 @@ public class GameState implements Runnable {
|
|||||||
*
|
*
|
||||||
* @return The boats new position
|
* @return The boats new position
|
||||||
*/
|
*/
|
||||||
private static GeoPoint calculateBounceBack(ServerYacht yacht, GeoPoint collidedWith, Double bounceDistance) {
|
private static GeoPoint calculateBounceBack(ServerYacht yacht, GeoPoint collidedWith,
|
||||||
Double heading = GeoUtility.getBearing(yacht.getLocation(), collidedWith);
|
Double bounceDistance) {
|
||||||
|
Double heading = GeoUtility.getBearing(yacht.getLastLocation(), collidedWith);
|
||||||
// Invert heading
|
// Invert heading
|
||||||
heading -= 180;
|
heading -= 180;
|
||||||
Integer newHeading = Math.floorMod(heading.intValue(), 360);
|
Integer newHeading = Math.floorMod(heading.intValue(), 360);
|
||||||
return GeoUtility.getGeoCoordinate(yacht.getLocation(), newHeading.doubleValue(), bounceDistance);
|
return GeoUtility
|
||||||
|
.getGeoCoordinate(yacht.getLocation(), newHeading.doubleValue(), bounceDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -545,11 +602,12 @@ public class GameState implements Runnable {
|
|||||||
*
|
*
|
||||||
* @return yacht to compare to all other yachts.
|
* @return yacht to compare to all other yachts.
|
||||||
*/
|
*/
|
||||||
private static ServerYacht checkCollision(ServerYacht yacht) {
|
private static ServerYacht checkYachtCollision(ServerYacht yacht) {
|
||||||
|
|
||||||
for (ServerYacht otherYacht : GameState.getYachts().values()) {
|
for (ServerYacht otherYacht : GameState.getYachts().values()) {
|
||||||
if (otherYacht != yacht) {
|
if (otherYacht != yacht) {
|
||||||
Double distance = GeoUtility.getDistance(otherYacht.getLocation(), yacht.getLocation());
|
Double distance = GeoUtility
|
||||||
|
.getDistance(otherYacht.getLocation(), yacht.getLocation());
|
||||||
if (distance < YACHT_COLLISION_DISTANCE) {
|
if (distance < YACHT_COLLISION_DISTANCE) {
|
||||||
return otherYacht;
|
return otherYacht;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public class ClientYacht extends Observable {
|
|||||||
private String country;
|
private String country;
|
||||||
|
|
||||||
private Long estimateTimeAtFinish;
|
private Long estimateTimeAtFinish;
|
||||||
private Boolean sailIn = false;
|
private Boolean sailIn = true;
|
||||||
private Integer currentMarkSeqID = 0;
|
private Integer currentMarkSeqID = 0;
|
||||||
private Long markRoundTime;
|
private Long markRoundTime;
|
||||||
private Long timeTillNext;
|
private Long timeTillNext;
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public class ServerYacht extends Observable {
|
|||||||
this.country = country;
|
this.country = country;
|
||||||
this.sailIn = false;
|
this.sailIn = false;
|
||||||
this.isAuto = false;
|
this.isAuto = false;
|
||||||
this.location = new GeoPoint(57.670341, 11.826856);
|
this.location = new GeoPoint(57.67046, 11.83751);
|
||||||
this.lastLocation = location;
|
this.lastLocation = location;
|
||||||
this.heading = 120.0; //In degrees
|
this.heading = 120.0; //In degrees
|
||||||
this.currentVelocity = 0d; //in mms-1
|
this.currentVelocity = 0d; //in mms-1
|
||||||
|
|||||||
@@ -365,14 +365,15 @@ public class GameClient {
|
|||||||
socketThread.sendBoatAction(BoatAction.TACK_GYBE); break;
|
socketThread.sendBoatAction(BoatAction.TACK_GYBE); break;
|
||||||
//TODO Allow a zoom in and zoom out methods
|
//TODO Allow a zoom in and zoom out methods
|
||||||
case Z: // zoom in
|
case Z: // zoom in
|
||||||
System.out.println("Zoom in");
|
raceView.getGameView().zoomIn();
|
||||||
break;
|
break;
|
||||||
case X: // zoom out
|
case X: // zoom out
|
||||||
System.out.println("Zoom out");
|
raceView.getGameView().zoomOut();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void keyReleased(KeyEvent e) {
|
private void keyReleased(KeyEvent e) {
|
||||||
switch (e.getCode()) {
|
switch (e.getCode()) {
|
||||||
//TODO 12/07/17 Determine the sail state and send the appropriate packet (eg. if sails are in, send a sail out packet)
|
//TODO 12/07/17 Determine the sail state and send the appropriate packet (eg. if sails are in, send a sail out packet)
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ public class GameView extends Pane {
|
|||||||
private Map<ClientYacht, BoatObject> boatObjects = new HashMap<>();
|
private Map<ClientYacht, BoatObject> boatObjects = new HashMap<>();
|
||||||
private Map<ClientYacht, AnnotationBox> annotations = new HashMap<>();
|
private Map<ClientYacht, AnnotationBox> annotations = new HashMap<>();
|
||||||
private ObservableList<Node> gameObjects;
|
private ObservableList<Node> gameObjects;
|
||||||
|
private BoatObject selectedBoat = null;
|
||||||
private Group annotationsGroup = new Group();
|
private Group annotationsGroup = new Group();
|
||||||
private Group wakesGroup = new Group();
|
private Group wakesGroup = new Group();
|
||||||
private Group boatObjectGroup = new Group();
|
private Group boatObjectGroup = new Group();
|
||||||
@@ -93,18 +94,18 @@ public class GameView extends Pane {
|
|||||||
double scaleFactor = 1;
|
double scaleFactor = 1;
|
||||||
|
|
||||||
public void zoomOut() {
|
public void zoomOut() {
|
||||||
scaleFactor = 0.95;
|
scaleFactor = 0.1;
|
||||||
for (Node child : getChildren()) {
|
if (this.getScaleX() > 0.5) {
|
||||||
child.setScaleX(child.getScaleX() * scaleFactor);
|
this.setScaleX(this.getScaleX() - scaleFactor);
|
||||||
child.setScaleY(child.getScaleY() * scaleFactor);
|
this.setScaleY(this.getScaleY() - scaleFactor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void zoomIn() {
|
public void zoomIn() {
|
||||||
scaleFactor = 1.05;
|
scaleFactor = 0.10;
|
||||||
for (Node child : getChildren()) {
|
if (this.getScaleX() < 2.5) {
|
||||||
child.setScaleX(child.getScaleX() * scaleFactor);
|
this.setScaleX(this.getScaleX() + scaleFactor);
|
||||||
child.setScaleY(child.getScaleY() * scaleFactor);
|
this.setScaleY(this.getScaleY() + scaleFactor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,14 +114,25 @@ public class GameView extends Pane {
|
|||||||
VERTICAL
|
VERTICAL
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameView() {
|
|
||||||
|
private void trackBoat() {
|
||||||
|
if (selectedBoat != null) {
|
||||||
|
double x = selectedBoat.getBoatLayoutX();
|
||||||
|
double y = selectedBoat.getBoatLayoutY();
|
||||||
|
double displacementX = this.getWidth();
|
||||||
|
double displacementY = this.getHeight();
|
||||||
|
this.setLayoutX((-x + (displacementX / 2.0)) * this.getScaleX());
|
||||||
|
this.setLayoutY((-y + (displacementY / 2.0)) * this.getScaleY());
|
||||||
|
} else {
|
||||||
|
this.setLayoutX(0);
|
||||||
|
this.setLayoutY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public GameView () {
|
||||||
gameObjects = this.getChildren();
|
gameObjects = this.getChildren();
|
||||||
// create image view for map, bind panel size to image
|
// create image view for map, bind panel size to image
|
||||||
gameObjects.add(mapImage);
|
gameObjects.add(mapImage);
|
||||||
fpsDisplay.setLayoutX(5);
|
|
||||||
fpsDisplay.setLayoutY(20);
|
|
||||||
fpsDisplay.setStrokeWidth(2);
|
|
||||||
gameObjects.add(fpsDisplay);
|
|
||||||
gameObjects.add(raceBorder);
|
gameObjects.add(raceBorder);
|
||||||
gameObjects.add(markers);
|
gameObjects.add(markers);
|
||||||
initializeTimer();
|
initializeTimer();
|
||||||
@@ -138,6 +150,7 @@ public class GameView extends Pane {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle(long now) {
|
public void handle(long now) {
|
||||||
|
trackBoat();
|
||||||
if (lastTime == 0) {
|
if (lastTime == 0) {
|
||||||
lastTime = now;
|
lastTime = now;
|
||||||
} else {
|
} else {
|
||||||
@@ -161,9 +174,7 @@ public class GameView extends Pane {
|
|||||||
lastTime = now;
|
lastTime = now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Platform.runLater(() ->
|
boatObjects.forEach((boat, boatObject) -> boatObject.updateLocation());
|
||||||
boatObjects.forEach((boat, boatObject) -> boatObject.updateLocation());
|
|
||||||
// );
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -343,6 +354,22 @@ public class GameView extends Pane {
|
|||||||
// drawGoogleMap();
|
// drawGoogleMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setSelectedBoat(BoatObject bo, Boolean isSelected) {
|
||||||
|
if (this.selectedBoat == bo && !isSelected) {
|
||||||
|
this.selectedBoat = null;
|
||||||
|
boatObjects.forEach((boat, group) ->
|
||||||
|
group.setIsSelected(false)
|
||||||
|
);
|
||||||
|
} else if (isSelected) {
|
||||||
|
this.selectedBoat = bo;
|
||||||
|
for (BoatObject group : boatObjects.values()) {
|
||||||
|
if (group != bo) {
|
||||||
|
group.setIsSelected(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws all the boats.
|
* Draws all the boats.
|
||||||
* @param clientYachts The yachts to set in the race
|
* @param clientYachts The yachts to set in the race
|
||||||
@@ -353,6 +380,7 @@ public class GameView extends Pane {
|
|||||||
for (ClientYacht clientYacht : clientYachts) {
|
for (ClientYacht clientYacht : clientYachts) {
|
||||||
Paint colour = Colors.getColor();
|
Paint colour = Colors.getColor();
|
||||||
newBoat = new BoatObject();
|
newBoat = new BoatObject();
|
||||||
|
newBoat.addSelectedBoatListener(this::setSelectedBoat);
|
||||||
newBoat.setFill(colour);
|
newBoat.setFill(colour);
|
||||||
boatObjects.put(clientYacht, newBoat);
|
boatObjects.put(clientYacht, newBoat);
|
||||||
createAndBindAnnotationBox(clientYacht, colour);
|
createAndBindAnnotationBox(clientYacht, colour);
|
||||||
@@ -365,9 +393,6 @@ public class GameView extends Pane {
|
|||||||
BoatObject bo = boatObjects.get(boat);
|
BoatObject bo = boatObjects.get(boat);
|
||||||
Point2D p2d = findScaledXY(lat, lon);
|
Point2D p2d = findScaledXY(lat, lon);
|
||||||
bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir);
|
bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir);
|
||||||
// annotations.get(boat).setLayoutX(p2d.getX());
|
|
||||||
// annotations.get(boat).setLayoutY(p2d.getY());
|
|
||||||
// annotations.get(boat).setLocation(100d, 100d);
|
|
||||||
annotations.get(boat).setLocation(p2d.getX(), p2d.getY());
|
annotations.get(boat).setLocation(p2d.getX(), p2d.getY());
|
||||||
bo.setTrajectory(
|
bo.setTrajectory(
|
||||||
heading,
|
heading,
|
||||||
@@ -630,6 +655,7 @@ public class GameView extends Pane {
|
|||||||
|
|
||||||
public void setBoatAsPlayer (ClientYacht playerYacht) {
|
public void setBoatAsPlayer (ClientYacht playerYacht) {
|
||||||
this.playerYacht = playerYacht;
|
this.playerYacht = playerYacht;
|
||||||
|
playerYacht.toggleSail();
|
||||||
boatObjects.get(playerYacht).setAsPlayer();
|
boatObjects.get(playerYacht).setAsPlayer();
|
||||||
annotations.get(playerYacht).addAnnotation(
|
annotations.get(playerYacht).addAnnotation(
|
||||||
"velocity",
|
"velocity",
|
||||||
@@ -679,4 +705,9 @@ public class GameView extends Pane {
|
|||||||
timeline.setOnFinished(event -> gameObjects.remove(circle));
|
timeline.setOnFinished(event -> gameObjects.remove(circle));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFrameRateFXText(Text fpsDisplay) {
|
||||||
|
this.fpsDisplay = null;
|
||||||
|
this.fpsDisplay = fpsDisplay;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
private Button selectAnnotationBtn;
|
private Button selectAnnotationBtn;
|
||||||
@FXML
|
@FXML
|
||||||
private ComboBox<ClientYacht> yachtSelectionComboBox;
|
private ComboBox<ClientYacht> yachtSelectionComboBox;
|
||||||
|
@FXML
|
||||||
|
private Text fpsDisplay;
|
||||||
//Race Data
|
//Race Data
|
||||||
private Map<Integer, ClientYacht> participants;
|
private Map<Integer, ClientYacht> participants;
|
||||||
private Map<Integer, CompoundMark> markers;
|
private Map<Integer, CompoundMark> markers;
|
||||||
@@ -115,11 +116,12 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
|||||||
initialiseSparkLine();
|
initialiseSparkLine();
|
||||||
|
|
||||||
gameView = new GameView();
|
gameView = new GameView();
|
||||||
Platform.runLater(() -> contentAnchorPane.getChildren().add(gameView));
|
gameView.setFrameRateFXText(fpsDisplay);
|
||||||
gameView.setBoats(new ArrayList<>(participants.values()));
|
Platform.runLater(() -> contentAnchorPane.getChildren().add(0, gameView));
|
||||||
gameView.updateBorder(raceData.getCourseLimit());
|
gameView.setBoats(new ArrayList<>(participants.values()));
|
||||||
gameView.updateCourse(
|
gameView.updateBorder(raceData.getCourseLimit());
|
||||||
new ArrayList<>(raceData.getCompoundMarks().values()), raceData.getMarkSequence()
|
gameView.updateCourse(
|
||||||
|
new ArrayList<>(raceData.getCompoundMarks().values()), raceData.getMarkSequence()
|
||||||
);
|
);
|
||||||
gameView.setBoatAsPlayer(player);
|
gameView.setBoatAsPlayer(player);
|
||||||
gameView.startRace();
|
gameView.startRace();
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ public class AnnotationBox extends Group {
|
|||||||
background.setStroke(theme);
|
background.setStroke(theme);
|
||||||
background.setStrokeWidth(2);
|
background.setStrokeWidth(2);
|
||||||
background.setCache(true);
|
background.setCache(true);
|
||||||
background.setCacheHint(CacheHint.SPEED);
|
background.setCacheHint(CacheHint.SCALE);
|
||||||
this.getChildren().add(background);
|
this.getChildren().add(background);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,7 +213,7 @@ public class AnnotationBox extends Group {
|
|||||||
Text text = new Text();
|
Text text = new Text();
|
||||||
text.setFill(theme);
|
text.setFill(theme);
|
||||||
text.setStrokeWidth(2);
|
text.setStrokeWidth(2);
|
||||||
text.setCacheHint(CacheHint.SPEED);
|
// text.setCacheHint(CacheHint.QUALITY);
|
||||||
text.setCache(true);
|
text.setCache(true);
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package seng302.visualiser.fxObjects;
|
package seng302.visualiser.fxObjects;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.geometry.Point2D;
|
import javafx.geometry.Point2D;
|
||||||
import javafx.scene.CacheHint;
|
|
||||||
import javafx.scene.Group;
|
import javafx.scene.Group;
|
||||||
import javafx.scene.Node;
|
import javafx.scene.Node;
|
||||||
import javafx.scene.paint.Color;
|
import javafx.scene.paint.Color;
|
||||||
@@ -23,6 +23,12 @@ import javafx.scene.transform.Rotate;
|
|||||||
*/
|
*/
|
||||||
public class BoatObject extends Group {
|
public class BoatObject extends Group {
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface SelectedBoatListener {
|
||||||
|
|
||||||
|
void notifySelected(BoatObject boatObject, Boolean isSelected);
|
||||||
|
}
|
||||||
|
|
||||||
//Constants for drawing
|
//Constants for drawing
|
||||||
private static final double BOAT_HEIGHT = 15d;
|
private static final double BOAT_HEIGHT = 15d;
|
||||||
private static final double BOAT_WIDTH = 10d;
|
private static final double BOAT_WIDTH = 10d;
|
||||||
@@ -41,9 +47,11 @@ public class BoatObject extends Group {
|
|||||||
private double distanceTravelled, lastRotation;
|
private double distanceTravelled, lastRotation;
|
||||||
private Point2D lastPoint;
|
private Point2D lastPoint;
|
||||||
private Paint colour = Color.BLACK;
|
private Paint colour = Color.BLACK;
|
||||||
private Boolean isSelected, destinationSet; //All boats are initialised as selected
|
private Boolean isSelected = false, destinationSet; //All boats are initialised as selected
|
||||||
private boolean isPlayer = false;
|
private boolean isPlayer = false;
|
||||||
|
|
||||||
|
private List<SelectedBoatListener> selectedBoatListenerListeners = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a BoatGroup with the default triangular boat polygon.
|
* Creates a BoatGroup with the default triangular boat polygon.
|
||||||
*/
|
*/
|
||||||
@@ -85,7 +93,7 @@ public class BoatObject extends Group {
|
|||||||
});
|
});
|
||||||
boatPoly.setOnMouseClicked(event -> setIsSelected(!isSelected));
|
boatPoly.setOnMouseClicked(event -> setIsSelected(!isSelected));
|
||||||
boatPoly.setCache(true);
|
boatPoly.setCache(true);
|
||||||
boatPoly.setCacheHint(CacheHint.SPEED);
|
// boatPoly.setCacheHint(CacheHint.SPEED);
|
||||||
|
|
||||||
// annotationBox = new AnnotationBox();
|
// annotationBox = new AnnotationBox();
|
||||||
// annotationBox.setFill(colour);
|
// annotationBox.setFill(colour);
|
||||||
@@ -287,6 +295,7 @@ public class BoatObject extends Group {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
public void setIsSelected(Boolean isSelected) {
|
public void setIsSelected(Boolean isSelected) {
|
||||||
|
updateListener(isSelected);
|
||||||
this.isSelected = isSelected;
|
this.isSelected = isSelected;
|
||||||
setLineGroupVisible(isSelected);
|
setLineGroupVisible(isSelected);
|
||||||
setWakeVisible(isSelected);
|
setWakeVisible(isSelected);
|
||||||
@@ -365,6 +374,10 @@ public class BoatObject extends Group {
|
|||||||
lastHeading = heading;
|
lastHeading = heading;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getSelected() {
|
||||||
|
return isSelected;
|
||||||
|
}
|
||||||
|
|
||||||
public void setTrajectory(double heading, double velocity, double scaleFactorX, double scaleFactorY) {
|
public void setTrajectory(double heading, double velocity, double scaleFactorX, double scaleFactorY) {
|
||||||
// wake.setRotation(lastHeading - heading, velocity);
|
// wake.setRotation(lastHeading - heading, velocity);
|
||||||
// rotateTo(heading);
|
// rotateTo(heading);
|
||||||
@@ -372,4 +385,14 @@ public class BoatObject extends Group {
|
|||||||
// yVelocity = Math.sin(Math.toRadians(heading)) * velocity * scaleFactorY;
|
// yVelocity = Math.sin(Math.toRadians(heading)) * velocity * scaleFactorY;
|
||||||
lastHeading = heading;
|
lastHeading = heading;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateListener(Boolean isSelected) {
|
||||||
|
for (SelectedBoatListener sbl : selectedBoatListenerListeners) {
|
||||||
|
sbl.notifySelected(this, isSelected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSelectedBoatListener(SelectedBoatListener sbl) {
|
||||||
|
selectedBoatListenerListeners.add(sbl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<?import java.lang.*?>
|
||||||
|
<?import javafx.scene.chart.*?>
|
||||||
|
<?import javafx.scene.control.*?>
|
||||||
|
<?import javafx.scene.layout.*?>
|
||||||
|
<?import javafx.scene.shape.*?>
|
||||||
|
<?import javafx.scene.text.*?>
|
||||||
<?import javafx.scene.chart.CategoryAxis?>
|
<?import javafx.scene.chart.CategoryAxis?>
|
||||||
<?import javafx.scene.chart.LineChart?>
|
<?import javafx.scene.chart.LineChart?>
|
||||||
<?import javafx.scene.chart.NumberAxis?>
|
<?import javafx.scene.chart.NumberAxis?>
|
||||||
@@ -17,40 +23,60 @@
|
|||||||
<?import javafx.scene.shape.Circle?>
|
<?import javafx.scene.shape.Circle?>
|
||||||
<?import javafx.scene.text.Font?>
|
<?import javafx.scene.text.Font?>
|
||||||
<?import javafx.scene.text.Text?>
|
<?import javafx.scene.text.Text?>
|
||||||
<GridPane prefHeight="960.0" prefWidth="1530.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.visualiser.controllers.RaceViewController">
|
|
||||||
<columnConstraints>
|
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="998.0" prefWidth="1530.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.visualiser.controllers.RaceViewController">
|
||||||
<ColumnConstraints maxWidth="246.0" minWidth="246.0" prefWidth="246.0" />
|
<children>
|
||||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="1034.0" />
|
<AnchorPane layoutX="322.0" layoutY="130.0" prefHeight="998.0" prefWidth="1281.0"
|
||||||
</columnConstraints>
|
style="-fx-background-color: skyblue;" AnchorPane.bottomAnchor="0.0"
|
||||||
<rowConstraints>
|
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
<RowConstraints minHeight="500.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
<children>
|
||||||
<RowConstraints />
|
<GridPane prefHeight="998.0" prefWidth="1281.0" AnchorPane.bottomAnchor="0.0"
|
||||||
<RowConstraints />
|
AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
|
||||||
</rowConstraints>
|
AnchorPane.topAnchor="0.0">
|
||||||
<children>
|
<columnConstraints>
|
||||||
<AnchorPane prefHeight="960.0" prefWidth="250.0" style="-fx-background-color: #2C2c36;" GridPane.rowSpan="3">
|
<ColumnConstraints hgrow="SOMETIMES" maxWidth="630.0" minWidth="10.0"
|
||||||
<children>
|
prefWidth="68.0"/>
|
||||||
<Label layoutX="11.0" layoutY="283.0" text="Team Position" textFill="WHITE" />
|
<ColumnConstraints hgrow="SOMETIMES" maxWidth="1213.0" minWidth="10.0"
|
||||||
<Label layoutX="13.0" layoutY="432.0" text="Settings" textFill="WHITE" />
|
prefWidth="1213.0"/>
|
||||||
<Label layoutX="11.0" layoutY="41.0" text="Timer" textFill="WHITE" />
|
</columnConstraints>
|
||||||
<Label layoutX="11.0" layoutY="112.0" text="Wind direction" textFill="WHITE" />
|
<rowConstraints>
|
||||||
<Circle fx:id="windBackgroundCircle" blendMode="DARKEN" fill="#3dcdc8" layoutX="110.0" layoutY="190.0" radius="35.0" stroke="#d7d7d7" strokeType="INSIDE" strokeWidth="3.0" />
|
<RowConstraints maxHeight="489.0" minHeight="1.0" prefHeight="24.0"
|
||||||
<Text fx:id="windArrowText" fill="#a8a8a8" layoutX="86.0" layoutY="210.0" strokeType="OUTSIDE" strokeWidth="0.0" text="↓">
|
vgrow="SOMETIMES"/>
|
||||||
<font>
|
<RowConstraints maxHeight="997.0" minHeight="10.0" prefHeight="974.0"
|
||||||
<Font name="AdobeArabic-Regular" size="55.0" />
|
vgrow="SOMETIMES"/>
|
||||||
</font>
|
</rowConstraints>
|
||||||
</Text>
|
<children>
|
||||||
<Text fx:id="windDirectionText" fill="#d3d3d3" layoutX="171.0" layoutY="238.0" strokeType="OUTSIDE" strokeWidth="0.0" text="0.0°" textAlignment="RIGHT">
|
<AnchorPane fx:id="contentAnchorPane" prefHeight="200.0" prefWidth="200.0"
|
||||||
<font>
|
GridPane.columnSpan="2" GridPane.rowSpan="2"/>
|
||||||
<Font name="System Bold" size="13.0" />
|
<Text fx:id="fpsDisplay" strokeType="OUTSIDE" strokeWidth="0.0" text="60 FPS"
|
||||||
</font>
|
GridPane.halignment="CENTER" GridPane.valignment="CENTER"/>
|
||||||
</Text>
|
</children>
|
||||||
|
</GridPane>
|
||||||
|
</children>
|
||||||
|
</AnchorPane>
|
||||||
|
<AnchorPane prefHeight="960.0" prefWidth="250.0" style="-fx-background-color: #2C2c36;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
|
<children>
|
||||||
|
<Label layoutX="11.0" layoutY="283.0" text="Team Position" textFill="WHITE" />
|
||||||
|
<Label layoutX="13.0" layoutY="432.0" text="Settings" textFill="WHITE" />
|
||||||
|
<Label layoutX="11.0" layoutY="41.0" text="Timer" textFill="WHITE" />
|
||||||
|
<Label layoutX="11.0" layoutY="112.0" text="Wind direction" textFill="WHITE" />
|
||||||
|
<Circle fx:id="windBackgroundCircle" blendMode="DARKEN" fill="#3dcdc8" layoutX="110.0" layoutY="190.0" radius="35.0" stroke="#d7d7d7" strokeType="INSIDE" strokeWidth="3.0" />
|
||||||
|
<Text fx:id="windArrowText" fill="#a8a8a8" layoutX="86.0" layoutY="210.0" strokeType="OUTSIDE" strokeWidth="0.0" text="↓">
|
||||||
|
<font>
|
||||||
|
<Font name="AdobeArabic-Regular" size="55.0" />
|
||||||
|
</font>
|
||||||
|
</Text>
|
||||||
|
<Text fx:id="windDirectionText" fill="#d3d3d3" layoutX="171.0" layoutY="238.0" strokeType="OUTSIDE" strokeWidth="0.0" text="0.0°" textAlignment="RIGHT">
|
||||||
|
<font>
|
||||||
|
<Font name="System Bold" size="13.0" />
|
||||||
|
</font>
|
||||||
|
</Text>
|
||||||
<Text fx:id="windSpeedText" fill="#d3d3d3" layoutX="12.0" layoutY="237.0" strokeType="OUTSIDE" strokeWidth="0.0" text="0.0 Knot" textAlignment="RIGHT">
|
<Text fx:id="windSpeedText" fill="#d3d3d3" layoutX="12.0" layoutY="237.0" strokeType="OUTSIDE" strokeWidth="0.0" text="0.0 Knot" textAlignment="RIGHT">
|
||||||
<font>
|
<font>
|
||||||
<Font name="System Bold" size="13.0" />
|
<Font name="System Bold" size="13.0" />
|
||||||
</font>
|
</font>
|
||||||
</Text>
|
</Text>
|
||||||
<CheckBox fx:id="toggleFps" focusTraversable="false" graphicTextGap="0.0" layoutX="21.0" layoutY="453.0" mnemonicParsing="false" prefHeight="18.0" prefWidth="143.0" selected="true" styleClass="ui-checkbox" text="Show FPS" textFill="WHITE" />
|
<CheckBox fx:id="toggleFps" focusTraversable="false" graphicTextGap="0.0" layoutX="21.0" layoutY="453.0" mnemonicParsing="false" prefHeight="18.0" prefWidth="143.0" selected="true" styleClass="ui-checkbox" text="Show FPS" textFill="WHITE" />
|
||||||
<VBox fx:id="positionVbox" layoutX="12.0" layoutY="304.0" prefHeight="116.0" prefWidth="200.0" styleClass="text-white" />
|
<VBox fx:id="positionVbox" layoutX="12.0" layoutY="304.0" prefHeight="116.0" prefWidth="200.0" styleClass="text-white" />
|
||||||
<Pane layoutX="11.0" layoutY="39.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="51.0" prefWidth="193.0">
|
<Pane layoutX="11.0" layoutY="39.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="51.0" prefWidth="193.0">
|
||||||
<children>
|
<children>
|
||||||
@@ -67,17 +93,14 @@
|
|||||||
<Text fill="WHITE" layoutX="11.0" layoutY="649.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Boat Selection" />
|
<Text fill="WHITE" layoutX="11.0" layoutY="649.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Boat Selection" />
|
||||||
<ComboBox fx:id="yachtSelectionComboBox" focusTraversable="false" layoutX="37.0" layoutY="664.0" prefHeight="25.0" prefWidth="170.0" promptText="Select Yacht" styleClass="combo-box-base" />
|
<ComboBox fx:id="yachtSelectionComboBox" focusTraversable="false" layoutX="37.0" layoutY="664.0" prefHeight="25.0" prefWidth="170.0" promptText="Select Yacht" styleClass="combo-box-base" />
|
||||||
<LineChart fx:id="raceSparkLine" layoutX="-1.0" layoutY="719.0" legendVisible="false" prefHeight="277.0" prefWidth="246.0" title="Boat Positions">
|
<LineChart fx:id="raceSparkLine" layoutX="-1.0" layoutY="719.0" legendVisible="false" prefHeight="277.0" prefWidth="246.0" title="Boat Positions">
|
||||||
<xAxis>
|
<xAxis>
|
||||||
<CategoryAxis label="Leg Number" side="BOTTOM" styleClass="spark-line-xaxis" />
|
<CategoryAxis label="Leg Number" side="BOTTOM" styleClass="spark-line-xaxis" />
|
||||||
</xAxis>
|
</xAxis>
|
||||||
<yAxis>
|
<yAxis>
|
||||||
<NumberAxis fx:id="sparklineYAxis" minorTickCount="1" minorTickLength="1.0" side="LEFT" styleClass="spark-line-yaxis" tickLabelGap="1.0" tickUnit="1.0" upperBound="7.0" />
|
<NumberAxis fx:id="sparklineYAxis" minorTickCount="1" minorTickLength="1.0" side="LEFT" styleClass="spark-line-yaxis" tickLabelGap="1.0" tickUnit="1.0" upperBound="7.0" />
|
||||||
</yAxis>
|
</yAxis>
|
||||||
</LineChart>
|
</LineChart>
|
||||||
</children>
|
</children>
|
||||||
</AnchorPane>
|
</AnchorPane>
|
||||||
<AnchorPane fx:id="contentAnchorPane" style="-fx-background-color: skyblue;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" GridPane.columnIndex="1" GridPane.halignment="LEFT" GridPane.rowSpan="2147483647" GridPane.valignment="TOP">
|
</children>
|
||||||
|
</AnchorPane>
|
||||||
</AnchorPane>
|
|
||||||
</children>
|
|
||||||
</GridPane>
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import org.junit.Test;
|
|||||||
import seng302.gameServer.GameState;
|
import seng302.gameServer.GameState;
|
||||||
import seng302.utilities.GeoUtility;
|
import seng302.utilities.GeoUtility;
|
||||||
|
|
||||||
|
import static seng302.gameServer.GameState.checkCollision;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test update function in Yacht.java to make sure yacht will not be collide each other within 25.0
|
* Test update function in Yacht.java to make sure yacht will not be collide each other within 25.0
|
||||||
* meters.
|
* meters.
|
||||||
@@ -37,7 +39,7 @@ public class UpdateYachtTest {
|
|||||||
if (!yacht1.getSailIn()) {
|
if (!yacht1.getSailIn()) {
|
||||||
yacht1.toggleSailIn();
|
yacht1.toggleSailIn();
|
||||||
}
|
}
|
||||||
GameState.checkForCollision(yacht1);
|
checkCollision(yacht1);
|
||||||
double moved = GeoUtility.getDistance(yacht1.getLocation(), geoPoint1);
|
double moved = GeoUtility.getDistance(yacht1.getLocation(), geoPoint1);
|
||||||
Assert.assertEquals(GameState.BOUNCE_DISTANCE_YACHT, moved, 0.1);
|
Assert.assertEquals(GameState.BOUNCE_DISTANCE_YACHT, moved, 0.1);
|
||||||
}
|
}
|
||||||
@@ -54,14 +56,14 @@ public class UpdateYachtTest {
|
|||||||
if (!yacht1.getSailIn()) {
|
if (!yacht1.getSailIn()) {
|
||||||
yacht1.toggleSailIn();
|
yacht1.toggleSailIn();
|
||||||
}
|
}
|
||||||
GameState.checkForCollision(yacht1);
|
checkCollision(yacht1);
|
||||||
Assert.assertTrue(
|
Assert.assertTrue(
|
||||||
GameState.YACHT_COLLISION_DISTANCE < GeoUtility.getDistance(geoPoint1, geoPoint2
|
GameState.YACHT_COLLISION_DISTANCE < GeoUtility.getDistance(geoPoint1, geoPoint2
|
||||||
)
|
)
|
||||||
); //Check that yachts are actually far enough apart for no collision.
|
); //Check that yachts are actually far enough apart for no collision.
|
||||||
Assert.assertEquals(geoPoint1.getLat(), yacht1.getLocation().getLat(), 0.001);
|
Assert.assertEquals(geoPoint1.getLat(), yacht1.getLocation().getLat(), 1.001);
|
||||||
Assert.assertEquals(geoPoint1.getLng(), yacht1.getLocation().getLng(), 0.001);
|
Assert.assertEquals(geoPoint1.getLng(), yacht1.getLocation().getLng(), 1.001);
|
||||||
Assert.assertEquals(geoPoint2.getLat(), yacht1.getLocation().getLat(), 0.001);
|
Assert.assertEquals(geoPoint2.getLat(), yacht1.getLocation().getLat(), 1.001);
|
||||||
Assert.assertEquals(geoPoint2.getLng(), yacht1.getLocation().getLng(), 0.001);
|
Assert.assertEquals(geoPoint2.getLng(), yacht1.getLocation().getLng(), 1.001);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ public class BoatSailAnimationToggleTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void sailToggleTest() throws Exception {
|
public void sailToggleTest() throws Exception {
|
||||||
assertFalse(yacht.getSailIn());
|
|
||||||
yacht.toggleSail();
|
|
||||||
assertTrue(yacht.getSailIn());
|
assertTrue(yacht.getSailIn());
|
||||||
|
yacht.toggleSail();
|
||||||
|
assertFalse(yacht.getSailIn());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user