|
|
|
|
@ -40,20 +40,23 @@ public class RaceLogic implements RunnableWithFramePeriod {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
race.initialiseBoats();
|
|
|
|
|
this.countdownTimer.start();
|
|
|
|
|
|
|
|
|
|
countdown();
|
|
|
|
|
|
|
|
|
|
raceLoop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Countdown timer until race starts.
|
|
|
|
|
*/
|
|
|
|
|
protected AnimationTimer countdownTimer = new AnimationTimer() {
|
|
|
|
|
private void countdown() {
|
|
|
|
|
|
|
|
|
|
long previousFrameTime = System.currentTimeMillis();
|
|
|
|
|
|
|
|
|
|
long currentTime = System.currentTimeMillis();
|
|
|
|
|
while (race.getRaceStatusEnum() != RaceStatusEnum.STARTED) {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void handle(long arg0) {
|
|
|
|
|
long currentTime = System.currentTimeMillis();
|
|
|
|
|
|
|
|
|
|
//Update race time.
|
|
|
|
|
race.updateRaceTime(currentTime);
|
|
|
|
|
@ -72,47 +75,28 @@ public class RaceLogic implements RunnableWithFramePeriod {
|
|
|
|
|
race.changeWindDirection();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (race.getRaceStatusEnum() == RaceStatusEnum.STARTED) {
|
|
|
|
|
race.setBoatsStatusToRacing();
|
|
|
|
|
raceTimer.start();
|
|
|
|
|
this.stop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Update the animations timer's time.
|
|
|
|
|
currentTime = System.currentTimeMillis();
|
|
|
|
|
waitForFramePeriod(previousFrameTime, currentTime, 50);
|
|
|
|
|
previousFrameTime = currentTime;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Timer that runs for the duration of the race, until all boats finish.
|
|
|
|
|
*/
|
|
|
|
|
private AnimationTimer raceTimer = new AnimationTimer() {
|
|
|
|
|
private void raceLoop() {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Start time of loop, in milliseconds.
|
|
|
|
|
*/
|
|
|
|
|
long timeRaceStarted = System.currentTimeMillis();
|
|
|
|
|
long previousFrameTime = System.currentTimeMillis();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Current time during a loop iteration.
|
|
|
|
|
*/
|
|
|
|
|
long currentTime = System.currentTimeMillis();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The time of the previous frame, in milliseconds.
|
|
|
|
|
*/
|
|
|
|
|
long lastFrameTime = timeRaceStarted;
|
|
|
|
|
|
|
|
|
|
long framePeriod = currentTime - lastFrameTime;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void handle(long arg0) {
|
|
|
|
|
while (race.getRaceStatusEnum() != RaceStatusEnum.FINISHED) {
|
|
|
|
|
|
|
|
|
|
//Get the current time.
|
|
|
|
|
currentTime = System.currentTimeMillis();
|
|
|
|
|
long currentTime = System.currentTimeMillis();
|
|
|
|
|
|
|
|
|
|
//Execute commands from clients.
|
|
|
|
|
commands.execute();
|
|
|
|
|
@ -124,7 +108,7 @@ public class RaceLogic implements RunnableWithFramePeriod {
|
|
|
|
|
if (race.getNumberOfActiveBoats() != 0) {
|
|
|
|
|
|
|
|
|
|
//Get the time period of this frame.
|
|
|
|
|
framePeriod = currentTime - lastFrameTime;
|
|
|
|
|
long framePeriod = currentTime - previousFrameTime;
|
|
|
|
|
|
|
|
|
|
//For each boat, we update its position, and generate a BoatLocationMessage.
|
|
|
|
|
for (MockBoat boat : race.getBoats()) {
|
|
|
|
|
@ -141,7 +125,6 @@ public class RaceLogic implements RunnableWithFramePeriod {
|
|
|
|
|
//Otherwise, the race is over!
|
|
|
|
|
raceFinished.start();
|
|
|
|
|
race.setRaceStatusEnum(RaceStatusEnum.FINISHED);
|
|
|
|
|
this.stop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (race.getNumberOfActiveBoats() != 0) {
|
|
|
|
|
@ -152,10 +135,13 @@ public class RaceLogic implements RunnableWithFramePeriod {
|
|
|
|
|
server.parseSnapshot();
|
|
|
|
|
|
|
|
|
|
//Update the last frame time.
|
|
|
|
|
this.lastFrameTime = currentTime;
|
|
|
|
|
previousFrameTime = currentTime;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
waitForFramePeriod(previousFrameTime, currentTime, 50);
|
|
|
|
|
previousFrameTime = currentTime;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Broadcast that the race has finished.
|
|
|
|
|
|