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); + } } }