mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 06:18:44 +00:00
MarkGroups refactored to be independent of BoatGroups as their functionality has diverged.
#issue[10] #refactor
This commit is contained in:
@@ -17,6 +17,7 @@ import seng302.models.stream.packets.BoatPositionPacket;
|
|||||||
import seng302.models.stream.XMLParser;
|
import seng302.models.stream.XMLParser;
|
||||||
import seng302.models.stream.XMLParser.RaceXMLObject.Limit;
|
import seng302.models.stream.XMLParser.RaceXMLObject.Limit;
|
||||||
import seng302.models.mark.Mark;
|
import seng302.models.mark.Mark;
|
||||||
|
import seng302.server.simulator.Boat;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -53,7 +54,8 @@ public class CanvasController {
|
|||||||
private Mark maxLonPoint;
|
private Mark maxLonPoint;
|
||||||
private double referencePointX;
|
private double referencePointX;
|
||||||
private double referencePointY;
|
private double referencePointY;
|
||||||
private List<RaceObject> raceObjects = new ArrayList<>();
|
private List<MarkGroup> markGroups = new ArrayList<>();
|
||||||
|
private List<BoatGroup> boatGroups = new ArrayList<>();
|
||||||
private List<Mark> raceMarks = new ArrayList<>();
|
private List<Mark> raceMarks = new ArrayList<>();
|
||||||
|
|
||||||
//FRAME RATE
|
//FRAME RATE
|
||||||
@@ -172,21 +174,26 @@ public class CanvasController {
|
|||||||
gc.fillPolygon(xBoundaryPoints,yBoundaryPoints,yBoundaryPoints.length);
|
gc.fillPolygon(xBoundaryPoints,yBoundaryPoints,yBoundaryPoints.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateRaceObjects(){
|
private void updateGroups(){
|
||||||
for (RaceObject raceObject : raceObjects) {
|
for (BoatGroup boatGroup : boatGroups) {
|
||||||
raceObject.updatePosition(1000 / 60);
|
boatGroup.updatePosition(1000 / 60);
|
||||||
// some raceObjects will have multiply ID's (for instance gate marks)
|
// some raceObjects will have multiply ID's (for instance gate marks)
|
||||||
for (long id : raceObject.getRaceIds()) {
|
|
||||||
//checking if the current "ID" has any updates associated with it
|
//checking if the current "ID" has any updates associated with it
|
||||||
|
if (StreamParser.boatPositions.containsKey(boatGroup.getRaceId())) {
|
||||||
|
moveBoatGroup(boatGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (MarkGroup markGroup : markGroups) {
|
||||||
|
for (int id : markGroup.getRaceIds()) {
|
||||||
if (StreamParser.boatPositions.containsKey(id)) {
|
if (StreamParser.boatPositions.containsKey(id)) {
|
||||||
move(id, raceObject);
|
moveMarkGroup(id, markGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void move(long id, RaceObject raceObject){
|
private void moveBoatGroup(BoatGroup boatGroup) {
|
||||||
PriorityBlockingQueue<BoatPositionPacket> movementQueue = StreamParser.boatPositions.get(id);
|
PriorityBlockingQueue<BoatPositionPacket> movementQueue = StreamParser.boatPositions.get(boatGroup.getRaceId());
|
||||||
if (movementQueue.size() > 0){
|
if (movementQueue.size() > 0){
|
||||||
// BoatPositionPacket positionPacket = movementQueue.peek();
|
// BoatPositionPacket positionPacket = movementQueue.peek();
|
||||||
//
|
//
|
||||||
@@ -202,9 +209,9 @@ public class CanvasController {
|
|||||||
// if (timeDiff > delayTime) {
|
// if (timeDiff > delayTime) {
|
||||||
try {
|
try {
|
||||||
BoatPositionPacket positionPacket = movementQueue.take();
|
BoatPositionPacket positionPacket = movementQueue.take();
|
||||||
Point2D p2d = latLonToXY(positionPacket.getLat(), positionPacket.getLon());
|
Point2D p2d = findScaledXY(positionPacket.getLat(), positionPacket.getLon());
|
||||||
double heading = 360.0 / 0xffff * positionPacket.getHeading();
|
double heading = 360.0 / 0xffff * positionPacket.getHeading();
|
||||||
raceObject.setDestination(p2d.getX(), p2d.getY(), heading, positionPacket.getGroundSpeed(), (int) id);
|
boatGroup.setDestination(p2d.getX(), p2d.getY(), heading, positionPacket.getGroundSpeed(), boatGroup.getRaceId());
|
||||||
} catch (InterruptedException e){
|
} catch (InterruptedException e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -212,6 +219,31 @@ public class CanvasController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void moveMarkGroup (int raceId, MarkGroup markGroup) {
|
||||||
|
PriorityBlockingQueue<BoatPositionPacket> movementQueue = StreamParser.boatPositions.get(raceId);
|
||||||
|
if (movementQueue.size() > 0){
|
||||||
|
// BoatPositionPacket positionPacket = movementQueue.peek();
|
||||||
|
//
|
||||||
|
// //this code adds a delay to reading from the movementQueue
|
||||||
|
// //in case things being put into the movement queue are slightly
|
||||||
|
// //out of order
|
||||||
|
// int delayTime = 1000;
|
||||||
|
// int loopTime = delayTime * 10;
|
||||||
|
// long timeDiff = (System.currentTimeMillis()%loopTime - positionPacket.getTimeValid()%loopTime);
|
||||||
|
// if (timeDiff < 0){
|
||||||
|
// timeDiff = loopTime + timeDiff;
|
||||||
|
// }
|
||||||
|
// if (timeDiff > delayTime) {
|
||||||
|
try {
|
||||||
|
BoatPositionPacket positionPacket = movementQueue.take();
|
||||||
|
Point2D p2d = findScaledXY(positionPacket.getLat(), positionPacket.getLon());
|
||||||
|
markGroup.moveMarkTo(p2d.getX(), p2d.getY(), raceId);
|
||||||
|
} catch (InterruptedException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ResizableCanvas extends Canvas {
|
class ResizableCanvas extends Canvas {
|
||||||
|
|
||||||
ResizableCanvas() {
|
ResizableCanvas() {
|
||||||
@@ -277,11 +309,11 @@ public class CanvasController {
|
|||||||
BoatGroup boatGroup = new BoatGroup(boat, boat.getColour());
|
BoatGroup boatGroup = new BoatGroup(boat, boat.getColour());
|
||||||
// boatGroup.moveTo(startingX, startingY, 0d);
|
// boatGroup.moveTo(startingX, startingY, 0d);
|
||||||
//boatGroup.setStage(raceViewController.getStage());
|
//boatGroup.setStage(raceViewController.getStage());
|
||||||
raceObjects.add(boatGroup);
|
boatGroups.add(boatGroup);
|
||||||
boatAnnotations.getChildren().add(boatGroup.getLowPriorityAnnotations());
|
boatAnnotations.getChildren().add(boatGroup.getLowPriorityAnnotations());
|
||||||
}
|
}
|
||||||
group.getChildren().add(boatAnnotations);
|
group.getChildren().add(boatAnnotations);
|
||||||
group.getChildren().addAll(raceObjects);
|
group.getChildren().addAll(boatGroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -393,35 +425,35 @@ public class CanvasController {
|
|||||||
private void givePointsXY() {
|
private void givePointsXY() {
|
||||||
List<XMLParser.RaceXMLObject.CompoundMark> allPoints = StreamParser.getXmlObject().getRaceXML().getCompoundMarks();
|
List<XMLParser.RaceXMLObject.CompoundMark> allPoints = StreamParser.getXmlObject().getRaceXML().getCompoundMarks();
|
||||||
List<XMLParser.RaceXMLObject.CompoundMark> processed = new ArrayList<>();
|
List<XMLParser.RaceXMLObject.CompoundMark> processed = new ArrayList<>();
|
||||||
RaceObject markGroup;
|
MarkGroup markGroup;
|
||||||
|
|
||||||
for (XMLParser.RaceXMLObject.CompoundMark mark : allPoints) {
|
for (XMLParser.RaceXMLObject.CompoundMark mark : allPoints) {
|
||||||
if (!processed.contains(mark)) {
|
if (!processed.contains(mark)) {
|
||||||
if (mark.getMarkType() != MarkType.SINGLE_MARK) {
|
if (mark.getMarkType() != MarkType.SINGLE_MARK) {
|
||||||
markGroup = new MarkGroup(mark, findScaledXY(mark.getMarks().get(0)), findScaledXY(mark.getMarks().get(1)));
|
markGroup = new MarkGroup(mark, findScaledXY(mark.getMarks().get(0)), findScaledXY(mark.getMarks().get(1)));
|
||||||
raceObjects.add(markGroup);
|
markGroups.add(markGroup);
|
||||||
} else {
|
} else {
|
||||||
markGroup = new MarkGroup(mark, findScaledXY(mark.getMarks().get(0)));
|
markGroup = new MarkGroup(mark, findScaledXY(mark.getMarks().get(0)));
|
||||||
raceObjects.add(markGroup);
|
markGroups.add(markGroup);
|
||||||
}
|
}
|
||||||
processed.add(mark);
|
processed.add(mark);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
group.getChildren().addAll(boatGroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Point2D findScaledXY (Mark unscaled) {
|
private Point2D findScaledXY (Mark unscaled) {
|
||||||
return findScaledXY (minLatPoint.getLatitude(), minLatPoint.getLongitude(),
|
return findScaledXY (unscaled.getLatitude(), unscaled.getLongitude());
|
||||||
unscaled.getLatitude(), unscaled.getLongitude());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Point2D findScaledXY (double latA, double lonA, double latB, double lonB) {
|
private Point2D findScaledXY (double unscaledLat, double unscaledLon) {
|
||||||
double distanceFromReference;
|
double distanceFromReference;
|
||||||
double angleFromReference;
|
double angleFromReference;
|
||||||
int xAxisLocation = (int) referencePointX;
|
int xAxisLocation = (int) referencePointX;
|
||||||
int yAxisLocation = (int) referencePointY;
|
int yAxisLocation = (int) referencePointY;
|
||||||
|
|
||||||
angleFromReference = Mark.calculateHeadingRad(latA, lonA, latB, lonB);
|
angleFromReference = Mark.calculateHeadingRad(minLatPoint.getLatitude(), minLatPoint.getLongitude(), unscaledLat, unscaledLon);
|
||||||
distanceFromReference = Mark.calculateDistance(latA, lonA, latB, lonB);
|
distanceFromReference = Mark.calculateDistance(minLatPoint.getLatitude(), minLatPoint.getLongitude(), unscaledLat, unscaledLon);
|
||||||
if (angleFromReference >= 0 && angleFromReference <= Math.PI / 2) {
|
if (angleFromReference >= 0 && angleFromReference <= Math.PI / 2) {
|
||||||
xAxisLocation += (int) Math.round(distanceScaleFactor * Math.sin(angleFromReference) * distanceFromReference);
|
xAxisLocation += (int) Math.round(distanceScaleFactor * Math.sin(angleFromReference) * distanceFromReference);
|
||||||
yAxisLocation -= (int) Math.round(distanceScaleFactor * Math.cos(angleFromReference) * distanceFromReference);
|
yAxisLocation -= (int) Math.round(distanceScaleFactor * Math.cos(angleFromReference) * distanceFromReference);
|
||||||
@@ -441,12 +473,7 @@ public class CanvasController {
|
|||||||
return new Point2D(xAxisLocation, yAxisLocation);
|
return new Point2D(xAxisLocation, yAxisLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<BoatGroup> getBoatGroups() {
|
||||||
private Point2D latLonToXY (double latitude, double longitude) {
|
return boatGroups;
|
||||||
return findScaledXY(minLatPoint.getLatitude(), minLatPoint.getLongitude(), latitude, longitude);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<RaceObject> getRaceObjects() {
|
|
||||||
return raceObjects;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,48 +201,36 @@ public class RaceViewController extends Thread{
|
|||||||
private void setAnnotations(Integer annotationLevel) {
|
private void setAnnotations(Integer annotationLevel) {
|
||||||
switch (annotationLevel) {
|
switch (annotationLevel) {
|
||||||
case 0:
|
case 0:
|
||||||
for (RaceObject ro : includedCanvasController.getRaceObjects()) {
|
for (BoatGroup bg : includedCanvasController.getBoatGroups()) {
|
||||||
if(ro instanceof BoatGroup) {
|
|
||||||
BoatGroup bg = (BoatGroup) ro;
|
|
||||||
bg.setTeamNameObjectVisible(false);
|
bg.setTeamNameObjectVisible(false);
|
||||||
bg.setVelocityObjectVisible(false);
|
bg.setVelocityObjectVisible(false);
|
||||||
bg.setLineGroupVisible(false);
|
bg.setLineGroupVisible(false);
|
||||||
bg.setWakeVisible(false);
|
bg.setWakeVisible(false);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
for (RaceObject ro : includedCanvasController.getRaceObjects()) {
|
for (BoatGroup bg : includedCanvasController.getBoatGroups()) {
|
||||||
if(ro instanceof BoatGroup) {
|
|
||||||
BoatGroup bg = (BoatGroup) ro;
|
|
||||||
bg.setTeamNameObjectVisible(true);
|
bg.setTeamNameObjectVisible(true);
|
||||||
bg.setVelocityObjectVisible(false);
|
bg.setVelocityObjectVisible(false);
|
||||||
bg.setLineGroupVisible(false);
|
bg.setLineGroupVisible(false);
|
||||||
bg.setWakeVisible(false);
|
bg.setWakeVisible(false);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
for (RaceObject ro : includedCanvasController.getRaceObjects()) {
|
for (BoatGroup bg : includedCanvasController.getBoatGroups()) {
|
||||||
if(ro instanceof BoatGroup) {
|
|
||||||
BoatGroup bg = (BoatGroup) ro;
|
|
||||||
bg.setTeamNameObjectVisible(true);
|
bg.setTeamNameObjectVisible(true);
|
||||||
bg.setVelocityObjectVisible(false);
|
bg.setVelocityObjectVisible(false);
|
||||||
bg.setLineGroupVisible(true);
|
bg.setLineGroupVisible(true);
|
||||||
bg.setWakeVisible(false);
|
bg.setWakeVisible(false);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
for (RaceObject ro : includedCanvasController.getRaceObjects()) {
|
for (BoatGroup bg : includedCanvasController.getBoatGroups()) {
|
||||||
if(ro instanceof BoatGroup) {
|
|
||||||
BoatGroup bg = (BoatGroup) ro;
|
|
||||||
bg.setTeamNameObjectVisible(true);
|
bg.setTeamNameObjectVisible(true);
|
||||||
bg.setVelocityObjectVisible(true);
|
bg.setVelocityObjectVisible(true);
|
||||||
bg.setLineGroupVisible(true);
|
bg.setLineGroupVisible(true);
|
||||||
bg.setWakeVisible(true);
|
bg.setWakeVisible(true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import java.util.List;
|
|||||||
* UpdatePosition is called unless the window is minimized in which case it attempts to store animations and apply them
|
* UpdatePosition is called unless the window is minimized in which case it attempts to store animations and apply them
|
||||||
* when the window is maximised.
|
* when the window is maximised.
|
||||||
*/
|
*/
|
||||||
public class BoatGroup extends RaceObject{
|
public class BoatGroup extends Group{
|
||||||
|
|
||||||
//Constants for drawing
|
//Constants for drawing
|
||||||
private static final double TEAMNAME_X_OFFSET = 10d;
|
private static final double TEAMNAME_X_OFFSET = 10d;
|
||||||
@@ -32,6 +32,12 @@ public class BoatGroup extends RaceObject{
|
|||||||
private Point2D lastPoint;
|
private Point2D lastPoint;
|
||||||
private int wakeGenerationDelay = 10;
|
private int wakeGenerationDelay = 10;
|
||||||
private double distanceTravelled;
|
private double distanceTravelled;
|
||||||
|
private double pixelVelocityX;
|
||||||
|
private double pixelVelocityY;
|
||||||
|
private double currentRotation;
|
||||||
|
private double rotationalGoal;
|
||||||
|
private double rotationalVelocity;
|
||||||
|
private static final int expectedUpdateInterval = 200;
|
||||||
//Graphical objects
|
//Graphical objects
|
||||||
private Yacht boat;
|
private Yacht boat;
|
||||||
private Group lineGroup = new Group();
|
private Group lineGroup = new Group();
|
||||||
@@ -194,7 +200,7 @@ public class BoatGroup extends RaceObject{
|
|||||||
* @param rotation Rotation to move graphics to.
|
* @param rotation Rotation to move graphics to.
|
||||||
* @param raceIds RaceID of the object to move.
|
* @param raceIds RaceID of the object to move.
|
||||||
*/
|
*/
|
||||||
public void setDestination (double newXValue, double newYValue, double rotation, double groundSpeed, int... raceIds) {
|
public void setDestination (double newXValue, double newYValue, double rotation, double groundSpeed, int raceIds) {
|
||||||
if (hasRaceId(raceIds)) {
|
if (hasRaceId(raceIds)) {
|
||||||
if (setToInitialLocation) {
|
if (setToInitialLocation) {
|
||||||
destinationSet = true;
|
destinationSet = true;
|
||||||
@@ -254,7 +260,7 @@ public class BoatGroup extends RaceObject{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDestination (double newXValue, double newYValue, double groundSpeed, int... raceIDs) {
|
public void setDestination (double newXValue, double newYValue, double groundSpeed, int raceIDs) {
|
||||||
destinationSet = true;
|
destinationSet = true;
|
||||||
|
|
||||||
if (hasRaceId(raceIDs)) {
|
if (hasRaceId(raceIDs)) {
|
||||||
@@ -318,8 +324,8 @@ public class BoatGroup extends RaceObject{
|
|||||||
*
|
*
|
||||||
* @return An array containing all ID's associated with this RaceObject.
|
* @return An array containing all ID's associated with this RaceObject.
|
||||||
*/
|
*/
|
||||||
public int[] getRaceIds () {
|
public int getRaceId() {
|
||||||
return new int[] {boat.getSourceID()};
|
return boat.getSourceID();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -355,4 +361,24 @@ public class BoatGroup extends RaceObject{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the rotational velocity required to reach the rotationalGoal from the currentRotation.
|
||||||
|
*/
|
||||||
|
protected void calculateRotationalVelocity () {
|
||||||
|
if (Math.abs(rotationalGoal - currentRotation) > 180) {
|
||||||
|
if (rotationalGoal - currentRotation >= 0) {
|
||||||
|
this.rotationalVelocity = ((rotationalGoal - currentRotation) - 360) / expectedUpdateInterval;
|
||||||
|
} else {
|
||||||
|
this.rotationalVelocity = (360 + (rotationalGoal - currentRotation)) / expectedUpdateInterval;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.rotationalVelocity = (rotationalGoal - currentRotation) / expectedUpdateInterval;
|
||||||
|
}
|
||||||
|
//Sometimes the rotation is too large to be realistic. In that case just do it instantly.
|
||||||
|
if (Math.abs(rotationalVelocity) > 1) {
|
||||||
|
rotationalVelocity = 0;
|
||||||
|
rotateTo(rotationalGoal);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
package seng302.models;
|
|
||||||
|
|
||||||
import javafx.geometry.Point2D;
|
|
||||||
import javafx.scene.Group;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RaceObject defines the behaviour that animated objects whose position is updated from a yacht race data stream must
|
|
||||||
* adhere to.
|
|
||||||
*/
|
|
||||||
public abstract class RaceObject extends Group {
|
|
||||||
|
|
||||||
//Time between sections of race
|
|
||||||
protected static double expectedUpdateInterval = 200;
|
|
||||||
|
|
||||||
protected double rotationalGoal;
|
|
||||||
protected double currentRotation;
|
|
||||||
protected double rotationalVelocity;
|
|
||||||
protected double pixelVelocityX;
|
|
||||||
protected double pixelVelocityY;
|
|
||||||
|
|
||||||
public Point2D getPosition () {
|
|
||||||
return new Point2D(super.getLayoutX(), getLayoutY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double getExpectedUpdateInterval() {
|
|
||||||
return expectedUpdateInterval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static void setExpectedUpdateInterval(double expectedUpdateInterval) {
|
|
||||||
RaceObject.expectedUpdateInterval = expectedUpdateInterval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the rotational velocity required to reach the rotationalGoal from the currentRotation.
|
|
||||||
*/
|
|
||||||
protected void calculateRotationalVelocity () {
|
|
||||||
if (Math.abs(rotationalGoal - currentRotation) > 180) {
|
|
||||||
if (rotationalGoal - currentRotation >= 0) {
|
|
||||||
this.rotationalVelocity = ((rotationalGoal - currentRotation) - 360) / expectedUpdateInterval;
|
|
||||||
} else {
|
|
||||||
this.rotationalVelocity = (360 + (rotationalGoal - currentRotation)) / expectedUpdateInterval;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.rotationalVelocity = (rotationalGoal - currentRotation) / expectedUpdateInterval;
|
|
||||||
}
|
|
||||||
//Sometimes the rotation is too large to be realistic. In that case just do it instantly.
|
|
||||||
if (Math.abs(rotationalVelocity) > 1) {
|
|
||||||
rotationalVelocity = 0;
|
|
||||||
rotateTo(rotationalGoal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the destination of everything within the RaceObject that has an ID in the array raceIds. The destination is
|
|
||||||
* set to the co-ordinates (x, y) with the given rotation.
|
|
||||||
* @param x X co-ordinate to move the graphics to.
|
|
||||||
* @param y Y co-ordinate to move the graphics to.
|
|
||||||
* @param rotation Rotation to move graphics to.
|
|
||||||
* @param raceIds RaceID of the object to move.
|
|
||||||
*/
|
|
||||||
public abstract void setDestination (double x, double y, double rotation, double groundSpeed, int... raceIds);
|
|
||||||
/**
|
|
||||||
* Sets the destination of everything within the RaceObject that has an ID in the array raceIds. The destination is
|
|
||||||
* set to the co-ordinates (x, y).
|
|
||||||
* @param x X co-ordinate to move the graphic to.
|
|
||||||
* @param y Y co-ordinate to move the graphic to.
|
|
||||||
* @param raceIds RaceID to the object to move.
|
|
||||||
*/
|
|
||||||
public abstract void setDestination (double x, double y, double groundSpeed, int... raceIds);
|
|
||||||
|
|
||||||
public abstract void updatePosition (long timeInterval);
|
|
||||||
|
|
||||||
public abstract void moveTo (double x, double y, double rotation);
|
|
||||||
|
|
||||||
public abstract void moveTo (double x, double y);
|
|
||||||
|
|
||||||
public abstract void moveGroupBy(double x, double y, double rotation);
|
|
||||||
|
|
||||||
public abstract void rotateTo (double rotation);
|
|
||||||
|
|
||||||
public abstract boolean hasRaceId (int... raceIds);
|
|
||||||
|
|
||||||
public abstract int[] getRaceIds ();
|
|
||||||
}
|
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
package seng302.models.mark;
|
package seng302.models.mark;
|
||||||
|
|
||||||
import javafx.geometry.Point2D;
|
import javafx.geometry.Point2D;
|
||||||
import javafx.scene.Node;
|
import javafx.scene.Group;
|
||||||
import javafx.scene.paint.Color;
|
import javafx.scene.paint.Color;
|
||||||
import javafx.scene.shape.Circle;
|
import javafx.scene.shape.Circle;
|
||||||
import javafx.scene.shape.Line;
|
import javafx.scene.shape.Line;
|
||||||
import javafx.scene.transform.Rotate;
|
import javafx.scene.transform.Rotate;
|
||||||
import seng302.models.RaceObject;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -14,7 +13,7 @@ import java.util.List;
|
|||||||
/**
|
/**
|
||||||
* Created by CJIRWIN on 26/04/2017.
|
* Created by CJIRWIN on 26/04/2017.
|
||||||
*/
|
*/
|
||||||
public class MarkGroup extends RaceObject {
|
public class MarkGroup extends Group {
|
||||||
|
|
||||||
private static int MARK_RADIUS = 5;
|
private static int MARK_RADIUS = 5;
|
||||||
private static int LINE_THICKNESS = 2;
|
private static int LINE_THICKNESS = 2;
|
||||||
@@ -23,14 +22,8 @@ public class MarkGroup extends RaceObject {
|
|||||||
|
|
||||||
private List<Mark> marks = new ArrayList<>();
|
private List<Mark> marks = new ArrayList<>();
|
||||||
private Mark mainMark;
|
private Mark mainMark;
|
||||||
private double[] nodePixelVelocitiesX;
|
|
||||||
private double[] nodePixelVelocitiesY;
|
|
||||||
private Point2D[] nodeDestinations;
|
|
||||||
|
|
||||||
public MarkGroup (Mark mark, Point2D... points) {
|
public MarkGroup (Mark mark, Point2D... points) {
|
||||||
nodePixelVelocitiesX = new double[points.length];
|
|
||||||
nodePixelVelocitiesY = new double[points.length];
|
|
||||||
nodeDestinations = new Point2D[points.length];
|
|
||||||
marks.add(mark);
|
marks.add(mark);
|
||||||
mainMark = mark;
|
mainMark = mark;
|
||||||
Color color = Color.BLACK;
|
Color color = Color.BLACK;
|
||||||
@@ -47,25 +40,14 @@ public class MarkGroup extends RaceObject {
|
|||||||
MARK_RADIUS,
|
MARK_RADIUS,
|
||||||
color
|
color
|
||||||
);
|
);
|
||||||
nodeDestinations = new Point2D[]{
|
|
||||||
new Point2D(markCircle.getCenterX(), markCircle.getCenterY()
|
|
||||||
)
|
|
||||||
};
|
|
||||||
super.getChildren().add(markCircle);
|
super.getChildren().add(markCircle);
|
||||||
} else {
|
} else {
|
||||||
// marks.add(((GateMark) mark).getSingleMark1());
|
|
||||||
// marks.add(((GateMark) mark).getSingleMark2());
|
|
||||||
nodePixelVelocitiesX = new double[]{0d,0d};
|
|
||||||
nodePixelVelocitiesY = new double[]{0d,0d};
|
|
||||||
nodeDestinations = new Point2D[2];
|
|
||||||
|
|
||||||
markCircle = new Circle(
|
markCircle = new Circle(
|
||||||
points[0].getX(),
|
points[0].getX(),
|
||||||
points[0].getY(),
|
points[0].getY(),
|
||||||
MARK_RADIUS,
|
MARK_RADIUS,
|
||||||
color
|
color
|
||||||
);
|
);
|
||||||
nodeDestinations[0] = new Point2D(markCircle.getCenterX(), markCircle.getCenterY());
|
|
||||||
super.getChildren().add(markCircle);
|
super.getChildren().add(markCircle);
|
||||||
|
|
||||||
markCircle = new Circle(
|
markCircle = new Circle(
|
||||||
@@ -74,7 +56,6 @@ public class MarkGroup extends RaceObject {
|
|||||||
MARK_RADIUS,
|
MARK_RADIUS,
|
||||||
color
|
color
|
||||||
);
|
);
|
||||||
nodeDestinations[1] = new Point2D(markCircle.getCenterX(), markCircle.getCenterY());
|
|
||||||
super.getChildren().add(markCircle);
|
super.getChildren().add(markCircle);
|
||||||
Line line = new Line(
|
Line line = new Line(
|
||||||
points[0].getX(),
|
points[0].getX(),
|
||||||
@@ -91,117 +72,27 @@ public class MarkGroup extends RaceObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDestination (double x, double y, double rotation, double groundSpeed, int... raceIds) {
|
public void moveMarkTo (double x, double y, int raceId)
|
||||||
setDestination(x, y, 0, raceIds);
|
{
|
||||||
this.rotationalGoal = rotation;
|
if (mainMark.getMarkType() == MarkType.SINGLE_MARK) {
|
||||||
calculateRotationalVelocity();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDestination (double x, double y, double groundSpeed, int... raceIds) {
|
|
||||||
for (int i = 0; i < marks.size(); i++)
|
|
||||||
for (int id : raceIds)
|
|
||||||
if (id == marks.get(i).getId())
|
|
||||||
setDestinationChild(x, y, 0, Math.max(0, i-1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void setDestinationChild (double x, double y, double speed, int childIndex) {
|
|
||||||
//double relativeX = x - super.getLayoutX();
|
|
||||||
//double relativeY = y - super.getLayoutY();
|
|
||||||
Circle markCircle = (Circle) super.getChildren().get(childIndex);
|
|
||||||
this.nodeDestinations[childIndex] = new Point2D(x, y);
|
|
||||||
//if (Math.abs(relativeX - markCircle.getCenterX()) > 30 && Math.abs(relativeY - markCircle.getCenterY()) > 30) {
|
|
||||||
this.nodePixelVelocitiesX[childIndex] = (x - markCircle.getCenterX()) / expectedUpdateInterval;
|
|
||||||
this.nodePixelVelocitiesY[childIndex] = (y - markCircle.getCenterY()) / expectedUpdateInterval;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void rotateTo (double rotation) {
|
|
||||||
if (mainMark.getMarkType() != MarkType.SINGLE_MARK) {
|
|
||||||
Line line = (Line) super.getChildren().get(2);
|
|
||||||
double xCenter = Math.abs(line.getEndX() - line.getStartX());
|
|
||||||
double yCenter = Math.abs(line.getEndY() - line.getStartY());
|
|
||||||
super.getTransforms().setAll(new Rotate(rotation, xCenter, yCenter));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updatePosition (long timeInterval) {
|
|
||||||
Circle markCircle = (Circle) super.getChildren().get(0);
|
Circle markCircle = (Circle) super.getChildren().get(0);
|
||||||
|
markCircle.setCenterX(x);
|
||||||
if (nodePixelVelocitiesX[0] > 0 && markCircle.getCenterX() > nodeDestinations[0].getX() ||
|
markCircle.setCenterY(y);
|
||||||
nodePixelVelocitiesX[0] < 0 && markCircle.getCenterX() < nodeDestinations[0].getY())
|
|
||||||
nodePixelVelocitiesX[0] = 0;
|
|
||||||
else if (nodePixelVelocitiesX[0] != 0)
|
|
||||||
markCircle.setCenterX(markCircle.getCenterX() + nodePixelVelocitiesX[0] * timeInterval);
|
|
||||||
|
|
||||||
if (nodePixelVelocitiesY[0] > 0 && markCircle.getCenterY() > nodeDestinations[0].getY() ||
|
|
||||||
nodePixelVelocitiesY[0] < 0 && markCircle.getCenterY() < nodeDestinations[0].getY())
|
|
||||||
nodePixelVelocitiesY[0] = 0;
|
|
||||||
else if (nodePixelVelocitiesY[0] != 0)
|
|
||||||
markCircle.setCenterY(markCircle.getCenterY() + nodePixelVelocitiesY[0] * timeInterval);
|
|
||||||
|
|
||||||
if (mainMark.getMarkType() != MarkType.SINGLE_MARK) {
|
|
||||||
|
|
||||||
Line line = (Line) super.getChildren().get(2);
|
|
||||||
line.setStartX(markCircle.getCenterX());
|
|
||||||
line.setStartY(markCircle.getCenterY());
|
|
||||||
|
|
||||||
markCircle = (Circle) super.getChildren().get(1);
|
|
||||||
|
|
||||||
if (nodePixelVelocitiesX[1] > 0 && markCircle.getCenterX() >= nodeDestinations[1].getX() ||
|
|
||||||
nodePixelVelocitiesX[1] < 0 && markCircle.getCenterX() <= nodeDestinations[1].getX())
|
|
||||||
nodePixelVelocitiesX[1] = 0;
|
|
||||||
else if (nodePixelVelocitiesX[1] != 0)
|
|
||||||
markCircle.setCenterX(markCircle.getCenterX() + nodePixelVelocitiesX[1] * timeInterval);
|
|
||||||
|
|
||||||
if (nodePixelVelocitiesY[1] > 0 && markCircle.getCenterY() > nodeDestinations[1].getY() ||
|
|
||||||
nodePixelVelocitiesY[1] < 0 && markCircle.getCenterY() < nodeDestinations[1].getY())
|
|
||||||
nodePixelVelocitiesY[1] = 0;
|
|
||||||
else if (nodePixelVelocitiesY[1] != 0)
|
|
||||||
markCircle.setCenterY(markCircle.getCenterY() + nodePixelVelocitiesY[1] * timeInterval);
|
|
||||||
line.setEndX(markCircle.getCenterX());
|
|
||||||
line.setEndY(markCircle.getCenterY());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void moveGroupBy (double x, double y, double rotation) {
|
|
||||||
if (mainMark.getMarkType() != MarkType.SINGLE_MARK) {
|
|
||||||
Line line = (Line) super.getChildren().get(2);
|
|
||||||
for (int childIndex = 0; childIndex < 2; childIndex++){
|
|
||||||
Circle mark = (Circle) super.getChildren().get(childIndex);
|
|
||||||
mark.setCenterY(mark.getCenterY() + y);
|
|
||||||
mark.setCenterX(mark.getCenterX() + x);
|
|
||||||
}
|
|
||||||
line.setStartX(line.getStartX() + x);
|
|
||||||
line.setStartY(line.getStartY() + y);
|
|
||||||
line.setEndX(line.getEndX() + x);
|
|
||||||
line.setEndY(line.getEndY() + y);
|
|
||||||
} else {
|
} else {
|
||||||
Circle mark = (Circle) super.getChildren().get(0);
|
Circle markCircle1 = (Circle) super.getChildren().get(0);
|
||||||
mark.setCenterY(mark.getCenterY() + y);
|
Circle markCircle2 = (Circle) super.getChildren().get(1);
|
||||||
mark.setCenterX(mark.getCenterX() + x);
|
Line connectingLine = (Line) super.getChildren().get(2);
|
||||||
|
if (marks.get(1).getId() == raceId) {
|
||||||
|
markCircle1.setCenterX(x);
|
||||||
|
markCircle1.setCenterY(y);
|
||||||
|
connectingLine.setStartX(markCircle1.getCenterX());
|
||||||
|
connectingLine.setStartY(markCircle1.getCenterY());
|
||||||
|
} else if (marks.get(2).getId() == raceId) {
|
||||||
|
markCircle2.setCenterX(x);
|
||||||
|
markCircle2.setCenterY(y);
|
||||||
|
connectingLine.setEndX(markCircle2.getCenterX());
|
||||||
|
connectingLine.setEndY(markCircle2.getCenterY());
|
||||||
}
|
}
|
||||||
rotateTo(currentRotation + rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void moveTo (double x, double y, double rotation) {
|
|
||||||
moveTo(x, y);
|
|
||||||
rotateTo(rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void moveTo (double x, double y) {
|
|
||||||
Circle markCircle = (Circle) super.getChildren().get(0);
|
|
||||||
markCircle.setCenterX(x);
|
|
||||||
markCircle.setCenterY(y);
|
|
||||||
if (mainMark.getMarkType() != MarkType.SINGLE_MARK) {
|
|
||||||
markCircle = (Circle) super.getChildren().get(1);
|
|
||||||
markCircle.setCenterX(x);
|
|
||||||
markCircle.setCenterY(y);
|
|
||||||
Line line = (Line) super.getChildren().get(2);
|
|
||||||
line.setStartX(x);
|
|
||||||
line.setStartY(y);
|
|
||||||
line.setEndX(x);
|
|
||||||
line.setEndY(y);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,14 +104,6 @@ public class MarkGroup extends RaceObject {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getMarkRadius() {
|
|
||||||
return MARK_RADIUS;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setMarkRadius(int markRadius) {
|
|
||||||
MARK_RADIUS = markRadius;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int[] getRaceIds () {
|
public int[] getRaceIds () {
|
||||||
int[] idArray = new int[marks.size()];
|
int[] idArray = new int[marks.size()];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user