summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <lekensteyn@gmail.com>2014-01-09 23:31:00 +0100
committerPeter Wu <lekensteyn@gmail.com>2014-01-09 23:31:00 +0100
commit0a90b17ca15694ae2c31b5a839490b0cc5caeb2c (patch)
treec4111b7e14a557c5273f8117bc48a7601acb6cc4
parent093f04de5f03c0406861b6a715087868be8af19a (diff)
download2iv60-robots-0a90b17ca15694ae2c31b5a839490b0cc5caeb2c.tar.gz
RobotRace: implement pause functionality
-rw-r--r--src/Camera.java1
-rw-r--r--src/RobotRace.java52
2 files changed, 52 insertions, 1 deletions
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
@@ -152,6 +152,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;
+ }
}