From c9875f3987308969c2baa2adfe3f238dc1288569 Mon Sep 17 00:00:00 2001 From: fjc40 Date: Tue, 15 Aug 2017 14:37:36 +1200 Subject: [PATCH] RaceLogic no longer uses AnimationTimer for its main loop (since that ran in javafx thread). --- .../src/main/java/mock/model/RaceLogic.java | 58 +++++++------------ .../java/visualiser/model/VisualiserBoat.java | 4 +- 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index 7b314d0f..418ade17 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -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. diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java b/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java index 41d0e484..ce966b02 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserBoat.java @@ -174,7 +174,7 @@ public class VisualiserBoat extends Boat { */ public String getTimeToNextMarkFormatted(ZonedDateTime currentTime) { - if (getTimeAtLastMark() != null) { + if ((getTimeAtLastMark() != null) && (currentTime != null)) { //Calculate time delta. Duration timeUntil = Duration.between(currentTime, getEstimatedTimeAtNextMark()); @@ -213,7 +213,7 @@ public class VisualiserBoat extends Boat { */ public String getTimeSinceLastMarkFormatted(ZonedDateTime currentTime) { - if (getTimeAtLastMark() != null) { + if ((getTimeAtLastMark() != null) && (currentTime != null)) { //Calculate time delta. Duration timeSince = Duration.between(getTimeAtLastMark(), currentTime);