From f4cb1a3ac4fdb4397750793400cfa807b462c74f Mon Sep 17 00:00:00 2001 From: Joseph Date: Tue, 5 Sep 2017 12:40:34 +1200 Subject: [PATCH 01/13] Made ObserverCommands and made racestate an observable. ObserverCommands observes the race passes in the params. #story[1196] --- .../src/main/java/mock/model/MockRace.java | 6 ++++++ .../src/main/java/mock/model/RaceLogic.java | 4 ++++ .../mock/model/commandFactory/Command.java | 2 ++ .../model/commandFactory/ObserverCommand.java | 20 +++++++++++++++++++ .../model/commandFactory/SailsCommand.java | 14 ++++++++----- .../model/commandFactory/TackGybeCommand.java | 13 +++++++----- .../mock/model/commandFactory/VMGCommand.java | 14 ++++++++----- .../model/commandFactory/WindCommand.java | 14 ++++++++----- .../src/main/java/shared/model/RaceState.java | 3 ++- 9 files changed, 69 insertions(+), 21 deletions(-) create mode 100644 racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index f606c29d..e69db01e 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -743,4 +743,10 @@ public class MockRace extends RaceState { } + /** + * Made public, so race logic can control it + */ + public void setChanged() { + super.setChanged(); + } } diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index d1ef39e0..977bd8d6 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -185,6 +185,10 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { previousFrameTime = currentTime; } + // Notify Observers + race.setChanged(); + race.notifyObservers(); + waitForFramePeriod(previousFrameTime, currentTime, 50); previousFrameTime = currentTime; } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/Command.java b/racevisionGame/src/main/java/mock/model/commandFactory/Command.java index e0486114..421d5b32 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/Command.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/Command.java @@ -3,6 +3,8 @@ package mock.model.commandFactory; import mock.model.MockBoat; import mock.model.MockRace; +import java.util.Observer; + /** * Allows RaceLogic to control MockRace state according to the Command pattern */ diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java new file mode 100644 index 00000000..a9ca9209 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java @@ -0,0 +1,20 @@ +package mock.model.commandFactory; + +import mock.model.MockBoat; +import mock.model.MockRace; + +import java.util.Observer; + +/** + * Command that can observe the race + */ +public abstract class ObserverCommand implements Command, Observer { + MockRace race; + MockBoat boat; + + public ObserverCommand(MockRace race, MockBoat boat) { + this.race = race; + this.boat = boat; + race.addObserver(this); + } +} diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java index 7d620a42..bfb752ea 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java @@ -3,14 +3,13 @@ package mock.model.commandFactory; import mock.model.MockBoat; import mock.model.MockRace; -public class SailsCommand implements Command { - private MockRace race; - private MockBoat boat; +import java.util.Observable; + +public class SailsCommand extends ObserverCommand { private boolean sailsOut; public SailsCommand(MockRace race, MockBoat boat, Boolean sailsOut) { - this.race = race; - this.boat = boat; + super(race, boat); this.sailsOut = sailsOut; } @@ -18,4 +17,9 @@ public class SailsCommand implements Command { public void execute() { this.boat.setSailsOut(this.sailsOut); } + + @Override + public void update(Observable o, Object arg) { + + } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java index d0b0584b..28ace831 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java @@ -4,12 +4,12 @@ import mock.model.MockBoat; import mock.model.MockRace; import shared.model.Bearing; +import java.util.Observable; + /** * Command class for tacking and gybing */ -public class TackGybeCommand implements Command { - private MockRace race; - private MockBoat boat; +public class TackGybeCommand extends ObserverCommand { /** * Constructor for class @@ -17,8 +17,7 @@ public class TackGybeCommand implements Command { * @param boat mock boat to update */ public TackGybeCommand(MockRace race, MockBoat boat) { - this.race = race; - this.boat = boat; + super(race, boat); } @Override @@ -49,5 +48,9 @@ public class TackGybeCommand implements Command { return phi > 180 ? 360 - phi : phi; } + @Override + public void update(Observable o, Object arg) { + + } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java index 39469cf8..45f666ec 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java @@ -3,12 +3,12 @@ package mock.model.commandFactory; import mock.model.MockBoat; import mock.model.MockRace; +import java.util.Observable; + /** * Command class for autoVMG */ -public class VMGCommand implements Command { - private MockRace race; - private MockBoat boat; +public class VMGCommand extends ObserverCommand { /** * Constructor for class @@ -16,8 +16,7 @@ public class VMGCommand implements Command { * @param boat mock boat to update */ public VMGCommand(MockRace race, MockBoat boat) { - this.race = race; - this.boat = boat; + super(race, boat); } @Override @@ -28,4 +27,9 @@ public class VMGCommand implements Command { boat.setAutoVMG(true); } } + + @Override + public void update(Observable o, Object arg) { + + } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java index 530bf5bc..138ccff0 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java @@ -4,17 +4,16 @@ import mock.model.MockBoat; import mock.model.MockRace; import shared.model.Bearing; +import java.util.Observable; + /** * Created by connortaylorbrown on 4/08/17. */ -public class WindCommand implements Command { - private MockRace race; - private MockBoat boat; +public class WindCommand extends ObserverCommand { private int direction; public WindCommand(MockRace race, MockBoat boat, boolean upwind) { - this.race = race; - this.boat = boat; + super(race, boat); this.direction = upwind? -1 : 1; } @@ -34,4 +33,9 @@ public class WindCommand implements Command { boat.setBearing(Bearing.fromDegrees(heading + offset)); } + + @Override + public void update(Observable o, Object arg) { + + } } diff --git a/racevisionGame/src/main/java/shared/model/RaceState.java b/racevisionGame/src/main/java/shared/model/RaceState.java index 48361da2..e755ba80 100644 --- a/racevisionGame/src/main/java/shared/model/RaceState.java +++ b/racevisionGame/src/main/java/shared/model/RaceState.java @@ -13,6 +13,7 @@ import shared.dataInput.RegattaDataSource; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Observable; /** @@ -20,7 +21,7 @@ import java.util.List; * This is a base class inherited by {@link mock.model.MockRace} and {@link visualiser.model.VisualiserRaceState}. * Has a course, state, wind, boundaries, etc.... Boats are added by inheriting classes (see {@link Boat}, {@link mock.model.MockBoat}, {@link visualiser.model.VisualiserBoat}. */ -public abstract class RaceState { +public abstract class RaceState extends Observable{ From 00cedf4d4d30a3763480f120a48b4580b250771a Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Wed, 6 Sep 2017 15:19:30 +1200 Subject: [PATCH 02/13] TackGybeCommand now smooths the rotation of the boat. #story[1196] --- .../src/main/java/mock/model/RaceLogic.java | 10 +++--- .../model/commandFactory/TackGybeCommand.java | 35 ++++++++++++++----- .../src/main/java/shared/model/Constants.java | 4 ++- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index 977bd8d6..308c4b46 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -145,9 +145,13 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { //Get the current time. long currentTime = System.currentTimeMillis(); - //Execute commands from clients. + // Execute commands from clients. commands.execute(); + // Notify Observers + race.setChanged(); + race.notifyObservers(); + //Update race time. race.updateRaceTime(currentTime); @@ -185,10 +189,6 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { previousFrameTime = currentTime; } - // Notify Observers - race.setChanged(); - race.notifyObservers(); - waitForFramePeriod(previousFrameTime, currentTime, 50); previousFrameTime = currentTime; } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java index 28ace831..0fa17279 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java @@ -10,6 +10,10 @@ import java.util.Observable; * Command class for tacking and gybing */ public class TackGybeCommand extends ObserverCommand { + private double goalRotation; + private double totalRotation = 0; + private int direction; // -1 for anticlockwise, 1 for clockwise + private double goalAngle; /** * Constructor for class @@ -22,18 +26,26 @@ public class TackGybeCommand extends ObserverCommand { @Override public void execute() { - - boat.setAutoVMG(false); - double boatAngle = boat.getBearing().degrees(); - double windAngle =race.getWindDirection().degrees(); + double windAngle = race.getWindDirection().degrees(); double differenceAngle = calcDistance(boatAngle, windAngle); double angleA = windAngle + differenceAngle; double angleB = windAngle - differenceAngle; - if(angleA % 360 == boatAngle){ - boat.setBearing(Bearing.fromDegrees(angleB)); + if (angleA % 360 == boatAngle) { + goalAngle = angleB % 360; } else { - boat.setBearing(Bearing.fromDegrees(angleA)); + goalAngle = angleA % 360; + } + + goalRotation = goalAngle - boatAngle; + if (goalRotation < 0) { + goalRotation += 360; + } + if (goalRotation > 180) { + goalRotation = 360 - goalRotation; + direction = -1; + } else { + direction = 1; } } @@ -50,7 +62,14 @@ public class TackGybeCommand extends ObserverCommand { @Override public void update(Observable o, Object arg) { - + double offset = 3.0; + if (totalRotation < goalRotation) { + boat.setBearing(Bearing.fromDegrees(boat.getBearing().degrees() + offset * direction)); + totalRotation += offset; + } else { + System.out.println(goalAngle + " " + boat.getBearing().degrees()); + race.deleteObserver(this); + } } } diff --git a/racevisionGame/src/main/java/shared/model/Constants.java b/racevisionGame/src/main/java/shared/model/Constants.java index bb7ec598..a415ece2 100644 --- a/racevisionGame/src/main/java/shared/model/Constants.java +++ b/racevisionGame/src/main/java/shared/model/Constants.java @@ -38,7 +38,9 @@ public class Constants { /** * The race pre-start time, in milliseconds. 3 minutes. */ - public static final long RacePreStartTime = 3 * 60 * 1000; + // + // TODO: CHANGE BACK TO 3 MINUTES BEFORE MERGING TO MASTER + public static final long RacePreStartTime = 30000; //3 * 60 * 1000; /** From 844b48a81a3718526b9b32fbca586726a5b85217 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Thu, 7 Sep 2017 13:23:56 +1200 Subject: [PATCH 03/13] Resolved issue #42 - "putting sails out changes boat bearing to face target gate" #story[1196] --- racevisionGame/src/main/java/mock/model/MockRace.java | 5 ----- .../main/java/mock/model/commandFactory/SailsCommand.java | 4 +++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index e69db01e..e574ae5a 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -356,11 +356,6 @@ public class MockRace extends RaceState { checkPosition(boat, totalElapsedMilliseconds); - if (boat.getCurrentSpeed() == 0) { - newOptimalVMG(boat); - boat.setBearing(boat.calculateBearingToNextMarker()); - } - setBoatSpeed(boat); //Calculates the distance travelled, in meters, in the current timeslice. diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java index bfb752ea..60ebb584 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java @@ -7,8 +7,9 @@ import java.util.Observable; public class SailsCommand extends ObserverCommand { private boolean sailsOut; + private double goalVelocity; - public SailsCommand(MockRace race, MockBoat boat, Boolean sailsOut) { + public SailsCommand(MockRace race, MockBoat boat, boolean sailsOut) { super(race, boat); this.sailsOut = sailsOut; } @@ -16,6 +17,7 @@ public class SailsCommand extends ObserverCommand { @Override public void execute() { this.boat.setSailsOut(this.sailsOut); + } @Override From eba70ab2d4d00e60510bc3e38b7e5f2b4fdc2bef Mon Sep 17 00:00:00 2001 From: cbt24 Date: Thu, 7 Sep 2017 14:27:20 +1200 Subject: [PATCH 04/13] Sails command now listens to race to check if goal velocity is met #story[1196] --- .../src/main/java/mock/model/MockRace.java | 26 +------------------ .../model/commandFactory/SailsCommand.java | 22 ++++++++++++++-- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index a338cd5d..60ed2498 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -362,11 +362,7 @@ public class MockRace extends RaceState { setBoatSpeed(boat); //Calculates the distance travelled, in meters, in the current timeslice. - double distanceTravelledMeters = boat.calculateMetersTravelled(updatePeriodMilliseconds); - - //Scale it. - distanceTravelledMeters = distanceTravelledMeters * this.scaleFactor; - + double distanceTravelledMeters = boat.calculateMetersTravelled(updatePeriodMilliseconds) * this.scaleFactor; //Move the boat forwards that many meters, and advances its time counters by enough milliseconds. boat.moveForwards(distanceTravelledMeters); @@ -388,32 +384,12 @@ public class MockRace extends RaceState { private void newOptimalVMG(MockBoat boat) { long tackPeriod = 1000; if (boat.getTimeSinceTackChange() > tackPeriod) { - //System.out.println("optim called"); - //Calculate the new VMG. -// VMG newVMG = boat.getPolars().calculateVMG( -// this.getWindDirection(), -// this.getWindSpeed(), -// boat.calculateBearingToNextMarker(), -// Bearing.fromDegrees(0d), -// Bearing.fromDegrees(359.99999d)); - VMG newVMG = NewPolars.setBestVMG(this.getWindDirection(), this.getWindSpeed(), boat.getBearing()); - //System.out.println(newVMG); - //If the new vmg improves velocity, use it. - /*if (improvesVelocity(boat, newVMG)) { - }*/ boat.setVMG(newVMG); } } private void setBoatSpeed(MockBoat boat) { -// VMG vmg = boat.getPolars().calculateVMG( -// this.getWindDirection(), -// this.getWindSpeed(), -// boat.getBearing(), -// Bearing.fromDegrees(boat.getBearing().degrees() - 1), -// Bearing.fromDegrees(boat.getBearing().degrees() + 1)); - //VMG vmg = boat.getPolars().setBestVMG(this.getWindDirection(), this.getWindSpeed(), boat.getBearing()); VMG vmg = new VMG(NewPolars.calculateSpeed( this.getWindDirection(), this.getWindSpeed(), diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java index 60ebb584..efddc8df 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java @@ -2,12 +2,15 @@ package mock.model.commandFactory; import mock.model.MockBoat; import mock.model.MockRace; +import mock.model.NewPolars; +import mock.model.VMG; import java.util.Observable; public class SailsCommand extends ObserverCommand { private boolean sailsOut; private double goalVelocity; + private double acceleration = 1; public SailsCommand(MockRace race, MockBoat boat, boolean sailsOut) { super(race, boat); @@ -17,11 +20,26 @@ public class SailsCommand extends ObserverCommand { @Override public void execute() { this.boat.setSailsOut(this.sailsOut); - + if(sailsOut) { + // Accelerate to VMG speed + double polarSpeed = NewPolars.calculateSpeed(race.getWindDirection(), race.getWindSpeed(), boat.getBearing()); + VMG vmg = new VMG(polarSpeed, boat.getBearing()); + goalVelocity = vmg.getSpeed(); + } else { + // Decelerate to 0 + goalVelocity = 0; + } } @Override public void update(Observable o, Object arg) { - + if(sailsOut && boat.getCurrentSpeed() < goalVelocity) { + // Apply acceleration + } else if (!sailsOut && boat.getCurrentSpeed() > goalVelocity) { + // Apply deceleration + } else { + System.out.println(goalVelocity + " " + boat.getCurrentSpeed()); + race.deleteObserver(this); + } } } From 9cba3934ea51f76c627e01c69b8b84a8b39a32bf Mon Sep 17 00:00:00 2001 From: cbt24 Date: Thu, 7 Sep 2017 14:50:53 +1200 Subject: [PATCH 05/13] Sails command now applies acceleration to boat - Race only has control over speed while Sails command is not in action - This is governed by a default velocity property on the boat - Sails command returns control when sails are out and boat is up to speed - Speed never falls below 0 - Speed never goes above VMG velocity to prevent exploitation #story[1196] --- .../src/main/java/mock/model/MockBoat.java | 13 ++++++++++++- .../src/main/java/mock/model/MockRace.java | 6 ++---- .../mock/model/commandFactory/SailsCommand.java | 13 ++++++++++--- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockBoat.java b/racevisionGame/src/main/java/mock/model/MockBoat.java index b6cd7a24..a5dc98fe 100644 --- a/racevisionGame/src/main/java/mock/model/MockBoat.java +++ b/racevisionGame/src/main/java/mock/model/MockBoat.java @@ -34,7 +34,10 @@ public class MockBoat extends Boat { */ private boolean autoVMG = false; - + /** + * Indicates whether boat velocity is determined by wind + */ + private boolean velocityDefault = true; /** * Constructs a boat object with a given sourceID, name, country/team abbreviation, and polars table. @@ -300,4 +303,12 @@ public class MockBoat extends Boat { public void setAutoVMG(boolean autoVMG) { this.autoVMG = autoVMG; } + + public boolean isVelocityDefault() { + return velocityDefault; + } + + public void setVelocityDefault(boolean velocityDefault) { + this.velocityDefault = velocityDefault; + } } diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 60ed2498..2b689276 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -355,11 +355,11 @@ public class MockRace extends RaceState { //Checks if the current boat has finished the race or not. boolean finish = this.isLastLeg(boat.getCurrentLeg()); - if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds && boat.isSailsOut()) { + if (!finish && totalElapsedMilliseconds >= updatePeriodMilliseconds) { checkPosition(boat, totalElapsedMilliseconds); - setBoatSpeed(boat); + if(boat.isVelocityDefault()) setBoatSpeed(boat); //Calculates the distance travelled, in meters, in the current timeslice. double distanceTravelledMeters = boat.calculateMetersTravelled(updatePeriodMilliseconds) * this.scaleFactor; @@ -373,8 +373,6 @@ public class MockRace extends RaceState { boat.setAutoVMG(false); } - } else { - boat.setCurrentSpeed(0); } this.updateEstimatedTime(boat); diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java index efddc8df..e4a0bf4b 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java @@ -10,7 +10,6 @@ import java.util.Observable; public class SailsCommand extends ObserverCommand { private boolean sailsOut; private double goalVelocity; - private double acceleration = 1; public SailsCommand(MockRace race, MockBoat boat, boolean sailsOut) { super(race, boat); @@ -20,6 +19,8 @@ public class SailsCommand extends ObserverCommand { @Override public void execute() { this.boat.setSailsOut(this.sailsOut); + boat.setVelocityDefault(false); + if(sailsOut) { // Accelerate to VMG speed double polarSpeed = NewPolars.calculateSpeed(race.getWindDirection(), race.getWindSpeed(), boat.getBearing()); @@ -33,12 +34,18 @@ public class SailsCommand extends ObserverCommand { @Override public void update(Observable o, Object arg) { + double acceleration = 0.5; + if(sailsOut && boat.getCurrentSpeed() < goalVelocity) { - // Apply acceleration + boat.setCurrentSpeed(Math.min(goalVelocity, boat.getCurrentSpeed() + acceleration)); } else if (!sailsOut && boat.getCurrentSpeed() > goalVelocity) { - // Apply deceleration + // Apply deceleration to strictly 0 speed + boat.setCurrentSpeed(Math.max(0, boat.getCurrentSpeed() - acceleration)); } else { System.out.println(goalVelocity + " " + boat.getCurrentSpeed()); + + // Release boat from SailsCommand control + if(sailsOut) boat.setVelocityDefault(true); race.deleteObserver(this); } } From a6db06a82c448ce1b9b8f4a66567ef261d7b2075 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Thu, 7 Sep 2017 16:57:07 +1200 Subject: [PATCH 06/13] Boats now reverse smoothly when colliding - Collision objects specify which boat is colliding - RaceLogic sets up an observable CollisionCommand when collision bubbles up - Boats now selectively identify observers of collision #story[1196] --- .../src/main/java/mock/model/RaceLogic.java | 11 +++--- .../java/mock/model/collider/Collider.java | 11 ++---- .../mock/model/collider/ColliderRegistry.java | 5 ++- .../java/mock/model/collider/Collision.java | 13 ++++++- .../commandFactory/CollisionCommand.java | 39 +++++++++++++++++++ .../src/main/java/shared/model/Boat.java | 10 ++--- .../src/main/java/shared/model/Mark.java | 5 ++- 7 files changed, 69 insertions(+), 25 deletions(-) create mode 100644 racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index 308c4b46..3b74d5c8 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -2,6 +2,7 @@ package mock.model; import javafx.animation.AnimationTimer; import mock.model.collider.Collision; +import mock.model.commandFactory.CollisionCommand; import mock.model.commandFactory.Command; import mock.model.commandFactory.CompositeCommand; import mock.model.commandFactory.CommandFactory; @@ -222,11 +223,9 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { @Override public void update(Observable o, Object arg) { - Collision e = (Collision)arg; - -// if(e.getBearing().degrees() == 0) System.out.println("Ahead"); -// else if(e.getBearing().degrees() < 90) System.out.println("Starboard"); -// else if(e.getBearing().degrees() > 270) System.out.println("Port"); -// else System.out.println("Behind"); + if(arg instanceof Collision) { + Collision collision = (Collision)arg; + commands.addCommand(new CollisionCommand(race, (MockBoat)collision.getBoat())); + } } } diff --git a/racevisionGame/src/main/java/mock/model/collider/Collider.java b/racevisionGame/src/main/java/mock/model/collider/Collider.java index 029fee57..28c01f9f 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collider.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collider.java @@ -25,13 +25,9 @@ public abstract class Collider extends Observable implements Locatable { Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); if(actualDistance <= distance) { - Collision collision = new Collision(relative, distance); + Collision collision = new Collision(boat, relative, distance); // Notify object of collision - onCollisionEnter(boat, collision); - // Notify observers of collision - notifyObservers(collision); - this.setChanged(); - + onCollisionEnter(collision); return true; } else return false; } @@ -45,8 +41,7 @@ public abstract class Collider extends Observable implements Locatable { /** * Handle a collision event - * @param collider Boat that is colliding * @param e details of collision */ - public abstract void onCollisionEnter(Boat collider, Collision e); + public abstract void onCollisionEnter(Collision e); } diff --git a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java index 69eac91a..6f82daeb 100644 --- a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java +++ b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java @@ -1,5 +1,6 @@ package mock.model.collider; +import mock.model.MockBoat; import shared.model.Boat; import shared.model.GPSCoordinate; @@ -39,7 +40,7 @@ public class ColliderRegistry extends Collider implements Observer { } @Override - public void onCollisionEnter(Boat collider, Collision e) {} + public void onCollisionEnter(Collision e) {} @Override public GPSCoordinate getPosition() { @@ -60,7 +61,7 @@ public class ColliderRegistry extends Collider implements Observer { public void update(Observable o, Object arg) { Collision collision = (Collision)arg; - notifyObservers(collision); this.setChanged(); + notifyObservers(collision); } } diff --git a/racevisionGame/src/main/java/mock/model/collider/Collision.java b/racevisionGame/src/main/java/mock/model/collider/Collision.java index 5a987bde..225cf342 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collision.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collision.java @@ -1,6 +1,7 @@ package mock.model.collider; import shared.model.Bearing; +import shared.model.Boat; /** * Data structure for holding collision details for ray casting and event handling. @@ -14,13 +15,19 @@ public class Collision { * Distance from boat centre to target centre */ private double distance; + /** + * Boat involved in the collision + */ + private Boat boat; /** * Constructor for Collision structure + * @param boat involved in collision * @param bearing from boat heading to target * @param distance from boat centre to target centre */ - public Collision(Bearing bearing, double distance) { + public Collision(Boat boat, Bearing bearing, double distance) { + this.boat = boat; this.bearing = bearing; this.distance = distance; } @@ -32,4 +39,8 @@ public class Collision { public double getDistance() { return distance; } + + public Boat getBoat() { + return boat; + } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java new file mode 100644 index 00000000..3314c402 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java @@ -0,0 +1,39 @@ +package mock.model.commandFactory; + +import mock.model.MockBoat; +import mock.model.MockRace; +import shared.model.Azimuth; +import shared.model.GPSCoordinate; + +import java.util.Observable; + +/** + * Created by cbt24 on 7/09/17. + */ +public class CollisionCommand extends ObserverCommand { + private GPSCoordinate startingPosition; + private Azimuth azimuth; + private double distance; + + public CollisionCommand(MockRace race, MockBoat boat) { + super(race, boat); + } + + @Override + public void execute() { + this.azimuth = Azimuth.fromDegrees(boat.getBearing().degrees() - 180d); + this.startingPosition = boat.getPosition(); + this.distance = 30; + boat.setVelocityDefault(false); + } + + @Override + public void update(Observable o, Object arg) { + if(GPSCoordinate.calculateDistanceMeters(boat.getPosition(), startingPosition) < distance) { + boat.setPosition(GPSCoordinate.calculateNewPosition(boat.getPosition(), 2, azimuth)); + } else { + race.deleteObserver(this); + boat.setVelocityDefault(true); + } + } +} diff --git a/racevisionGame/src/main/java/shared/model/Boat.java b/racevisionGame/src/main/java/shared/model/Boat.java index 31ce7ad4..bd3eea5e 100644 --- a/racevisionGame/src/main/java/shared/model/Boat.java +++ b/racevisionGame/src/main/java/shared/model/Boat.java @@ -403,10 +403,6 @@ public class Boat extends Collider { public boolean isSailsOut() { return sailsOut; } - public void bounce(double repulsionRadius) { - Azimuth reverseAzimuth = Azimuth.fromDegrees(getBearing().degrees() - 180d); - setPosition(GPSCoordinate.calculateNewPosition(getPosition(), 2 * repulsionRadius, reverseAzimuth)); - } @Override public boolean rayCast(Boat boat) { @@ -416,9 +412,11 @@ public class Boat extends Collider { } @Override - public void onCollisionEnter(Boat collider, Collision e) { + public void onCollisionEnter(Collision e) { if(e.getBearing().degrees() > 270 || e.getBearing().degrees() < 90) { - collider.bounce(100); + // Notify observers of collision + this.setChanged(); + notifyObservers(e); } } } diff --git a/racevisionGame/src/main/java/shared/model/Mark.java b/racevisionGame/src/main/java/shared/model/Mark.java index d236d076..23778cff 100644 --- a/racevisionGame/src/main/java/shared/model/Mark.java +++ b/racevisionGame/src/main/java/shared/model/Mark.java @@ -101,7 +101,8 @@ public class Mark extends Collider{ } @Override - public void onCollisionEnter(Boat collider, Collision e) { - collider.bounce(repulsionRadius); + public void onCollisionEnter(Collision e) { + this.setChanged(); + notifyObservers(e); } } From 8c7345a30def05616b90c4f5ba6823eff15c8a49 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Thu, 7 Sep 2017 17:01:47 +1200 Subject: [PATCH 07/13] Documented command classes #story[1196] --- .../java/mock/model/commandFactory/CollisionCommand.java | 7 ++++++- .../main/java/mock/model/commandFactory/WindCommand.java | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java index 3314c402..b2fed2ac 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/CollisionCommand.java @@ -8,13 +8,18 @@ import shared.model.GPSCoordinate; import java.util.Observable; /** - * Created by cbt24 on 7/09/17. + * Command class for collisions */ public class CollisionCommand extends ObserverCommand { private GPSCoordinate startingPosition; private Azimuth azimuth; private double distance; + /** + * Constructor for class + * @param race race context + * @param boat boat controlled by command + */ public CollisionCommand(MockRace race, MockBoat boat) { super(race, boat); } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java index 138ccff0..a429b8c4 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java @@ -7,11 +7,17 @@ import shared.model.Bearing; import java.util.Observable; /** - * Created by connortaylorbrown on 4/08/17. + * Command class for upwind and downwind controls */ public class WindCommand extends ObserverCommand { private int direction; + /** + * Constructor for class + * @param race race context + * @param boat boat controlled by command + * @param upwind if true, downwind if false + */ public WindCommand(MockRace race, MockBoat boat, boolean upwind) { super(race, boat); this.direction = upwind? -1 : 1; From df624a8437001c04b0ee4b85696de03ce9af8ffc Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Fri, 8 Sep 2017 15:34:22 +1200 Subject: [PATCH 08/13] Angular movement when auto vmg is pressed is smoothed. #story[1196] --- .../src/main/java/mock/model/MockRace.java | 14 ------- .../model/commandFactory/ObserverCommand.java | 1 + .../model/commandFactory/TackGybeCommand.java | 1 + .../mock/model/commandFactory/VMGCommand.java | 37 ++++++++++++++++++- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 2b689276..0e4f4099 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -367,26 +367,12 @@ public class MockRace extends RaceState { //Move the boat forwards that many meters, and advances its time counters by enough milliseconds. boat.moveForwards(distanceTravelledMeters); boat.setTimeSinceTackChange(boat.getTimeSinceTackChange() + updatePeriodMilliseconds); - - if (boat.getAutoVMG()) { - newOptimalVMG(boat); - boat.setAutoVMG(false); - } - } this.updateEstimatedTime(boat); } - private void newOptimalVMG(MockBoat boat) { - long tackPeriod = 1000; - if (boat.getTimeSinceTackChange() > tackPeriod) { - VMG newVMG = NewPolars.setBestVMG(this.getWindDirection(), this.getWindSpeed(), boat.getBearing()); - boat.setVMG(newVMG); - } - } - private void setBoatSpeed(MockBoat boat) { VMG vmg = new VMG(NewPolars.calculateSpeed( this.getWindDirection(), diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java index a9ca9209..18cede5d 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java @@ -15,6 +15,7 @@ public abstract class ObserverCommand implements Command, Observer { public ObserverCommand(MockRace race, MockBoat boat) { this.race = race; this.boat = boat; + boat.setAutoVMG(false); race.addObserver(this); } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java index 0fa17279..bc99d255 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java @@ -68,6 +68,7 @@ public class TackGybeCommand extends ObserverCommand { totalRotation += offset; } else { System.out.println(goalAngle + " " + boat.getBearing().degrees()); + boat.setBearing(Bearing.fromDegrees(goalAngle)); race.deleteObserver(this); } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java index 45f666ec..982000b0 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java @@ -2,6 +2,9 @@ package mock.model.commandFactory; import mock.model.MockBoat; import mock.model.MockRace; +import mock.model.NewPolars; +import mock.model.VMG; +import shared.model.Bearing; import java.util.Observable; @@ -9,6 +12,10 @@ import java.util.Observable; * Command class for autoVMG */ public class VMGCommand extends ObserverCommand { + private double goalAngle; + private double goalRotation; + private double totalRotation = 0; + private int direction; /** * Constructor for class @@ -26,10 +33,38 @@ public class VMGCommand extends ObserverCommand { } else { boat.setAutoVMG(true); } + newOptimalVMG(boat); + + goalRotation = goalAngle - boat.getBearing().degrees(); + if (goalRotation < 0) { + goalRotation += 360; + } + if (goalRotation > 180) { + goalRotation = 360 - goalRotation; + direction = -1; + } else { + direction = 1; + } + } + + private void newOptimalVMG(MockBoat boat) { + long tackPeriod = 1000; + if (boat.getTimeSinceTackChange() > tackPeriod) { + VMG newVMG = NewPolars.setBestVMG(race.getWindDirection(), race.getWindSpeed(), boat.getBearing()); + goalAngle = newVMG.getBearing().degrees(); + } } @Override public void update(Observable o, Object arg) { - + double offset = 3.0; + if (totalRotation < goalRotation) { + boat.setBearing(Bearing.fromDegrees(boat.getBearing().degrees() + offset * direction)); + totalRotation += offset; + } else { + System.out.println(goalAngle + " " + boat.getBearing().degrees()); + boat.setBearing(Bearing.fromDegrees(goalAngle)); + race.deleteObserver(this); + } } } From 2868f921e2a114547df4dc56a79f536b3ab03345 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Fri, 8 Sep 2017 15:55:29 +1200 Subject: [PATCH 09/13] Only one angular command can be active at a time. Only one velocity command can be active at a time. #story[1196] --- .../src/main/java/mock/model/MockRace.java | 13 +++++++++ .../commandFactory/ActiveObserverCommand.java | 27 +++++++++++++++++++ .../model/commandFactory/ObserverCommand.java | 1 - .../model/commandFactory/SailsCommand.java | 1 + .../model/commandFactory/TackGybeCommand.java | 1 + .../mock/model/commandFactory/VMGCommand.java | 1 + .../model/commandFactory/WindCommand.java | 3 ++- 7 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 racevisionGame/src/main/java/mock/model/commandFactory/ActiveObserverCommand.java diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 0e4f4099..c9c5a144 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -1,5 +1,7 @@ package mock.model; +import mock.model.commandFactory.ActiveObserverCommand; +import mock.model.commandFactory.ObserverCommand; import mock.model.wind.WindGenerator; import javafx.animation.AnimationTimer; import mock.model.collider.ColliderRegistry; @@ -64,6 +66,8 @@ public class MockRace extends RaceState { */ private Polars polars; + private ActiveObserverCommand activeObserverCommand; + /** @@ -81,6 +85,7 @@ public class MockRace extends RaceState { this.setRaceDataSource(raceDataSource); this.setRegattaDataSource(regattaDataSource); + this.activeObserverCommand = new ActiveObserverCommand(); this.polars = polars; this.scaleFactor = timeScale; @@ -715,4 +720,12 @@ public class MockRace extends RaceState { public void setChanged() { super.setChanged(); } + + public void addVelocityCommand(ObserverCommand c) { + this.activeObserverCommand.changeVelocityCommand(this, c); + } + + public void addAngularCommand(ObserverCommand c) { + this.activeObserverCommand.changeAngularCommand(this, c); + } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/ActiveObserverCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/ActiveObserverCommand.java new file mode 100644 index 00000000..ccd69a20 --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/commandFactory/ActiveObserverCommand.java @@ -0,0 +1,27 @@ +package mock.model.commandFactory; + +import java.util.Observable; + +/** + * Used to track the current active observer command. This is to ensure two commands that do similar things do not overlap. + */ +public class ActiveObserverCommand { + private ObserverCommand currentVelocityCommand; + private ObserverCommand currentAngularCommand; + + public ActiveObserverCommand() { + + } + + public void changeVelocityCommand(Observable o, ObserverCommand c) { + o.deleteObserver(currentVelocityCommand); + o.addObserver(c); + currentVelocityCommand = c; + } + + public void changeAngularCommand(Observable o, ObserverCommand c) { + o.deleteObserver(currentAngularCommand); + o.addObserver(c); + currentAngularCommand = c; + } +} diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java index 18cede5d..987d24be 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/ObserverCommand.java @@ -16,6 +16,5 @@ public abstract class ObserverCommand implements Command, Observer { this.race = race; this.boat = boat; boat.setAutoVMG(false); - race.addObserver(this); } } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java index e4a0bf4b..c310f8fd 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java @@ -13,6 +13,7 @@ public class SailsCommand extends ObserverCommand { public SailsCommand(MockRace race, MockBoat boat, boolean sailsOut) { super(race, boat); + race.addVelocityCommand(this); this.sailsOut = sailsOut; } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java index bc99d255..5438ae8a 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java @@ -22,6 +22,7 @@ public class TackGybeCommand extends ObserverCommand { */ public TackGybeCommand(MockRace race, MockBoat boat) { super(race, boat); + race.addAngularCommand(this); } @Override diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java index 982000b0..a89e1a46 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java @@ -24,6 +24,7 @@ public class VMGCommand extends ObserverCommand { */ public VMGCommand(MockRace race, MockBoat boat) { super(race, boat); + race.addAngularCommand(this); } @Override diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java index a429b8c4..85eec091 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/WindCommand.java @@ -20,6 +20,7 @@ public class WindCommand extends ObserverCommand { */ public WindCommand(MockRace race, MockBoat boat, boolean upwind) { super(race, boat); + race.addAngularCommand(this); this.direction = upwind? -1 : 1; } @@ -42,6 +43,6 @@ public class WindCommand extends ObserverCommand { @Override public void update(Observable o, Object arg) { - + race.deleteObserver(this); } } From c94e0af69c39db45ffe410b29de2f0f2870c1dfa Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Tue, 12 Sep 2017 17:35:51 +1200 Subject: [PATCH 10/13] Removed remaining println statements --- .../src/main/java/mock/app/Event.java | 3 --- .../src/main/java/mock/model/NewPolars.java | 19 ------------------- .../model/commandFactory/SailsCommand.java | 2 -- .../model/commandFactory/TackGybeCommand.java | 1 - .../mock/model/commandFactory/VMGCommand.java | 1 - .../model/wind/ShiftingWindGenerator.java | 1 - .../network/PacketDump/AC35DumpReader.java | 1 - .../gameController/InputChecker.java | 9 --------- 8 files changed, 37 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index a588a754..427fdb6a 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -75,9 +75,6 @@ public class Event { * @throws EventConstructionException Thrown if we cannot create an Event for any reason. */ public Event(boolean singlePlayer, int mapIndex) throws EventConstructionException { - -// System.out.println(XMLUtilities.validateXML(this.getClass().getClassLoader().getResource("mock/mockXML/iMapLayout.xml").toString() -// , this.getClass().getClassLoader().getResource("mock/mockXML/schema/raceSchema.xsd"))); this.mapIndex = mapIndex; String raceXMLFile; String boatsXMLFile = "mock/mockXML/boatTest.xml"; diff --git a/racevisionGame/src/main/java/mock/model/NewPolars.java b/racevisionGame/src/main/java/mock/model/NewPolars.java index c525316c..f0318c67 100644 --- a/racevisionGame/src/main/java/mock/model/NewPolars.java +++ b/racevisionGame/src/main/java/mock/model/NewPolars.java @@ -145,8 +145,6 @@ public class NewPolars { * @return the best vmg that the boat can change to */ public static VMG setBestVMG(Bearing trueWindAngle, double trueWindSpeed, Bearing boatAngle){ - //System.out.println("VMG AUTO CALLED"); - //speed double closestSpeed = getClosest(trueWindSpeed, polars.keySet()); double angle = modulateAngle(boatAngle.degrees() - trueWindAngle.degrees()); @@ -184,21 +182,4 @@ public class NewPolars { public static double modulateAngle(double angle){ return (angle % 360 + 360) % 360; } - - private Map> getPolars(){ - //this function is just for testing so therefore it is private - return polars; - } - - private void printOutLinearInterpolated(){ - for (double tws: polars.keySet()){ - System.out.println("=================================================="); - System.out.println("Speed: " + tws); - System.out.println("=================================================="); - for (double twa: polars.get(tws).keySet()){ - System.out.println("TWA: " + twa + ", Boat Speed: " + polars.get(tws).get(twa)); - } - } - } - } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java index c310f8fd..ac4877c4 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/SailsCommand.java @@ -43,8 +43,6 @@ public class SailsCommand extends ObserverCommand { // Apply deceleration to strictly 0 speed boat.setCurrentSpeed(Math.max(0, boat.getCurrentSpeed() - acceleration)); } else { - System.out.println(goalVelocity + " " + boat.getCurrentSpeed()); - // Release boat from SailsCommand control if(sailsOut) boat.setVelocityDefault(true); race.deleteObserver(this); diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java index 5438ae8a..e10ee74a 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/TackGybeCommand.java @@ -68,7 +68,6 @@ public class TackGybeCommand extends ObserverCommand { boat.setBearing(Bearing.fromDegrees(boat.getBearing().degrees() + offset * direction)); totalRotation += offset; } else { - System.out.println(goalAngle + " " + boat.getBearing().degrees()); boat.setBearing(Bearing.fromDegrees(goalAngle)); race.deleteObserver(this); } diff --git a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java index a89e1a46..812f833a 100644 --- a/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java +++ b/racevisionGame/src/main/java/mock/model/commandFactory/VMGCommand.java @@ -63,7 +63,6 @@ public class VMGCommand extends ObserverCommand { boat.setBearing(Bearing.fromDegrees(boat.getBearing().degrees() + offset * direction)); totalRotation += offset; } else { - System.out.println(goalAngle + " " + boat.getBearing().degrees()); boat.setBearing(Bearing.fromDegrees(goalAngle)); race.deleteObserver(this); } diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index 4ceff627..3cbf14f2 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -105,7 +105,6 @@ public class ShiftingWindGenerator implements WindGenerator { if (shiftedSoFar >= 180){ shiftAnticlockwise = Math.random() > 0.5; shiftedSoFar = 0; -// System.out.println("Swapping"); } timeOfLastShift = System.currentTimeMillis(); diff --git a/racevisionGame/src/main/java/network/PacketDump/AC35DumpReader.java b/racevisionGame/src/main/java/network/PacketDump/AC35DumpReader.java index 8022c374..1277e62b 100644 --- a/racevisionGame/src/main/java/network/PacketDump/AC35DumpReader.java +++ b/racevisionGame/src/main/java/network/PacketDump/AC35DumpReader.java @@ -41,7 +41,6 @@ public class AC35DumpReader { messLen[1] = dump[pointer + 13]; messLen[0] = dump[pointer + 14]; int messageLength = ByteBuffer.wrap(messLen).getShort(); - //System.out.println(messageLength); packets.add(new AC35Packet(Arrays.copyOfRange(dump, pointer, pointer + messageLength + 19))); diff --git a/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java index 88cdcb74..86166dcf 100644 --- a/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java +++ b/racevisionGame/src/main/java/visualiser/gameController/InputChecker.java @@ -27,7 +27,6 @@ public class InputChecker { ControlKey controlKey = keyFactory.getKey(codeString); if (controlKey != null) { controlKey.onAction(); -// System.out.println(controlKey.toString() + " is Pressed."); } currentlyActiveKeys.put(codeString, true); } @@ -38,7 +37,6 @@ public class InputChecker { ControlKey controlKey = keyFactory.getKey(codeString); if (controlKey != null) { controlKey.onRelease(); -// System.out.println(controlKey.toString() + " is Released."); } currentlyActiveKeys.remove(event.getCode().toString()); }); @@ -50,15 +48,8 @@ public class InputChecker { ControlKey controlKey = keyFactory.getKey(key); if (controlKey != null){ controlKey.onHold(); -// System.out.println(controlKey.toString() + " is Held."); } } -// for (String key : InputKeys.stringKeysMap.keySet()){ -// if (removeActiveKey(key)) { -// System.out.println(key); -// } -// } - } }.start(); } From bae428fb3f2e399d202d9faac299a9c387934c7d Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Tue, 12 Sep 2017 17:44:05 +1200 Subject: [PATCH 11/13] Recovered a private method used in a test --- racevisionGame/src/main/java/mock/model/NewPolars.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/racevisionGame/src/main/java/mock/model/NewPolars.java b/racevisionGame/src/main/java/mock/model/NewPolars.java index f0318c67..20d89c04 100644 --- a/racevisionGame/src/main/java/mock/model/NewPolars.java +++ b/racevisionGame/src/main/java/mock/model/NewPolars.java @@ -182,4 +182,10 @@ public class NewPolars { public static double modulateAngle(double angle){ return (angle % 360 + 360) % 360; } + + @SuppressWarnings("unused") + private Map> getPolars(){ + //this function is just for testing so therefore it is private + return polars; + } } From 3a6070a645ab37f3a1f1ca46c2a44ba5aee48f6c Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Tue, 12 Sep 2017 22:08:02 +1200 Subject: [PATCH 12/13] Fixed Merge and added back some merge changes #story[1196] --- .idea/copyright/profiles_settings.xml | 3 +++ .../src/main/java/mock/model/NewPolars.java | 26 +++++++++++++++++++ .../test/java/shared/model/BearingTest.java | 5 ---- 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 .idea/copyright/profiles_settings.xml delete mode 100644 racevisionGame/src/test/java/shared/model/BearingTest.java diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000..e7bedf33 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/racevisionGame/src/main/java/mock/model/NewPolars.java b/racevisionGame/src/main/java/mock/model/NewPolars.java index 20d89c04..7f0d917f 100644 --- a/racevisionGame/src/main/java/mock/model/NewPolars.java +++ b/racevisionGame/src/main/java/mock/model/NewPolars.java @@ -179,13 +179,39 @@ public class NewPolars { } + /** + * gets the angle bound between 0 and 360 following modular arithmetic + * @param angle angle to modulate + * @return resultant angle after modulation. + */ public static double modulateAngle(double angle){ return (angle % 360 + 360) % 360; } + /** + * DO NOT DELETE THIS FUNCTIONS THEY ARE USED FOR TESTING PURPOSES + * @return current polars map + */ @SuppressWarnings("unused") private Map> getPolars(){ //this function is just for testing so therefore it is private return polars; } + + /** + * DO NOT DELETE THESE FUNCTIONS THEY ARE USED FOR TESTING PURPOSES + * @return nothing + */ + @SuppressWarnings("unused") + private void printOutLinearInterpolated(){ + for (double tws: polars.keySet()){ + System.out.println("=================================================="); + System.out.println("Speed: " + tws); + System.out.println("=================================================="); + for (double twa: polars.get(tws).keySet()){ + System.out.println("TWA: " + twa + ", Boat Speed: " + polars.get(tws).get(twa)); + } + } + } + } diff --git a/racevisionGame/src/test/java/shared/model/BearingTest.java b/racevisionGame/src/test/java/shared/model/BearingTest.java deleted file mode 100644 index 876a0deb..00000000 --- a/racevisionGame/src/test/java/shared/model/BearingTest.java +++ /dev/null @@ -1,5 +0,0 @@ -package shared.model; - -public class BearingTest { -//TODO -} From 070654a95c3b66e56ece79b45ab1286db54de3f2 Mon Sep 17 00:00:00 2001 From: fjc40 Date: Wed, 13 Sep 2017 13:07:13 +1200 Subject: [PATCH 13/13] Javadoc fix. --- racevisionGame/src/main/java/mock/model/NewPolars.java | 1 - 1 file changed, 1 deletion(-) diff --git a/racevisionGame/src/main/java/mock/model/NewPolars.java b/racevisionGame/src/main/java/mock/model/NewPolars.java index 7f0d917f..3a40e0e2 100644 --- a/racevisionGame/src/main/java/mock/model/NewPolars.java +++ b/racevisionGame/src/main/java/mock/model/NewPolars.java @@ -200,7 +200,6 @@ public class NewPolars { /** * DO NOT DELETE THESE FUNCTIONS THEY ARE USED FOR TESTING PURPOSES - * @return nothing */ @SuppressWarnings("unused") private void printOutLinearInterpolated(){