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