From 0a90b17ca15694ae2c31b5a839490b0cc5caeb2c Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Thu, 9 Jan 2014 23:31:00 +0100 Subject: RobotRace: implement pause functionality --- src/Camera.java | 1 - src/RobotRace.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/Camera.java b/src/Camera.java index a3e3a43..24ebbc9 100644 --- a/src/Camera.java +++ b/src/Camera.java @@ -186,7 +186,6 @@ class Camera { fastest_pos = Math.max(fastest_pos, robot.getTimePos()); } double distance = Robot.racepost2meter(fastest_pos - slowest_pos); - System.err.println("dist+" + distance); // the helicopter view is more suitable if robots are more distant if (distance > 5) { setHelicopterMode(); diff --git a/src/RobotRace.java b/src/RobotRace.java index 57e0a98..d84ce68 100644 --- a/src/RobotRace.java +++ b/src/RobotRace.java @@ -151,6 +151,21 @@ public class RobotRace extends Base { */ boolean enableTextures; + /** + * Real animation time at which the game is paused (or -1 if not paused). + */ + private float pausedSince = -1; + + /** + * Total number of animation time that was spent in the paused state. + */ + private float pausedTimeTotal; + + /** + * Trigger a pause on the next frame update. + */ + private boolean requestPauseToggle = false; + /** * Constructs this robot race by initializing robots, camera, track, and * terrain. @@ -289,6 +304,8 @@ public class RobotRace extends Base { // function), the FPS update is done in the first accessible function // (here, in setView) updateFPS(); + // similarly, reset the time very early here when paused + applyPausedTime(); // Select part of window. gl.glViewport(0, 0, gs.w, gs.h); @@ -609,6 +626,10 @@ public class RobotRace extends Base { System.err.println("Textures are " + (state ? "enabled" : "disabled")); return true; + case KeyEvent.VK_SPACE: /* pause time */ + System.err.println("Triggering pause..."); + robotRace.requestPauseToggle = true; + return true; default: return false; } @@ -629,4 +650,35 @@ public class RobotRace extends Base { } return enableTextures; } + + /** + * If pause toggle is requested, check state and update. Otherwise, adjust + * global animation time. + */ + private void applyPausedTime() { + if (requestPauseToggle) { + if (pausedSince == -1) { + // just paused, store start time + pausedSince = gs.tAnim; + System.err.println("Paused since gs.tAnim=" + gs.tAnim); + } else { + // continuing, increase paused time and clear pause flag + float pausedTime = gs.tAnim - pausedSince; + pausedTimeTotal += pausedTime; + pausedSince = -1; + System.err.println("Continued at gs.tAnim=" + gs.tAnim + + ". Paused for " + pausedTime + " secs (new total: " + + pausedTimeTotal + " secs)"); + } + requestPauseToggle = false; + } + + // if paused, set clock back. + if (pausedSince != -1) { + gs.tAnim = pausedSince; + } + + // always apply correction for time drift + gs.tAnim -= pausedTimeTotal; + } } -- cgit v1.2.1