Added WindCommand and multiple command execution to RaceLogic

- Dispatch commands with CompositeCommand
- Single WindCommand handles upwind and downwind logic
- Changed key bindings as Mac lacks PgUp PgDn
- ControllerServer is observable, RaceLogic updates CompositeCommand as observer
This commit is contained in:
Connor Taylor-Brown
2017-08-04 23:08:07 +12:00
parent 851bbb4fde
commit 554f8a2a0f
7 changed files with 127 additions and 8 deletions
@@ -19,6 +19,8 @@ public class CommandFactory {
switch(action) {
case AUTO_PILOT: return new VMGCommand(race, boat);
case TACK_GYBE: return new TackGybeCommand(race, boat);
case UPWIND: return new WindCommand(race, boat, true);
case DOWNWIND: return new WindCommand(race, boat, false);
default: return null; // TODO - please please have discussion over what to default to
}
}
@@ -0,0 +1,23 @@
package mock.model.commandFactory;
import java.util.Stack;
/**
* Wraps multiple commands into a composite to execute queued commands during a frame.
*/
public class CompositeCommand implements Command {
private Stack<Command> commands;
public CompositeCommand() {
this.commands = new Stack<>();
}
public void addCommand(Command command) {
commands.push(command);
}
@Override
public void execute() {
while(!commands.isEmpty()) commands.pop().execute();
}
}
@@ -0,0 +1,30 @@
package mock.model.commandFactory;
import mock.model.MockBoat;
import mock.model.MockRace;
import shared.model.Bearing;
/**
* Created by connortaylorbrown on 4/08/17.
*/
public class WindCommand implements Command {
private MockRace race;
private MockBoat boat;
private int direction;
public WindCommand(MockRace race, MockBoat boat, boolean upwind) {
this.race = race;
this.boat = boat;
this.direction = upwind? 1 : -1;
}
@Override
public void execute() {
double wind = race.getWindDirection().degrees();
double heading = boat.getBearing().degrees();
double offset = 3;
if(wind - heading < 0) offset *= -1 * direction;
boat.setBearing(Bearing.fromDegrees(heading + offset));
}
}