Commit before breaking everything
[matches/honours.git] / research / transmission_spectroscopy / simulator / pgu-0.18 / build / lib / pgu / timer.py
diff --git a/research/transmission_spectroscopy/simulator/pgu-0.18/build/lib/pgu/timer.py b/research/transmission_spectroscopy/simulator/pgu-0.18/build/lib/pgu/timer.py
new file mode 100644 (file)
index 0000000..5601d66
--- /dev/null
@@ -0,0 +1,123 @@
+"""A timer for games with set-rate FPS.
+"""
+
+import pygame
+import time
+
+
+class Clock(object):
+    # The game time when one of the clock parameters was last changed
+    lastGameTime = None
+    # The real time corresponding to the last game time
+    lastRealTime = None
+    # The game time when 'tick' was last called
+    lastTickTime = None
+
+    # Whether the timer is paused or not
+    paused = False
+    # When this clock was created
+    startTime = None
+    # The speed which this clock moves at relative to the real clock
+    speed = 1
+
+    def __init__(self):
+        #self.startTime = time.time()
+        self.lastGameTime = 0
+        self.lastTickTime = 0
+        self.lastRealTime = time.time()
+        self.startTime = time.time()
+
+    # Set the rate at which this clock ticks relative to the real clock
+    def set_speed(self, n):
+        assert(n >= 0)
+        self.lastGameTime = self.get_time()
+        self.lastRealTime = time.time()
+        self.speed = n
+
+    # Pause the clock
+    def pause(self):
+        if (not self.paused):
+            self.lastGameTime = self.get_time()
+            self.lastRealTime = time.time()
+            self.paused = True
+
+    # Resume the clock
+    def resume(self):
+        if (self.paused):
+            self.paused = False
+            self.lastRealTime = time.time()
+
+    def tick(self, fps=0):
+        tm = self.get_time()
+        dt = tm - self.lastTickTime
+        if (fps > 0):
+            minTime = 1.0/fps
+            if (dt < minTime):
+                pygame.time.wait(int((minTime-dt)*1000))
+                dt = minTime
+        self.lastTickTime = tm
+        return dt
+
+    # Returns the amount of 'game time' that has passed since creating
+    # the clock (paused time does not count).
+    def get_time(self):
+        if (self.paused):
+            return self.lastGameTime
+        return self.speed*(time.time()-self.lastRealTime) + self.lastGameTime
+
+    def get_real_time(self):
+        return (time.time()-self.startTime)
+
+
+class Timer:
+    """A timer for games with set-rate FPS."""
+    
+    def __init__(self,fps):
+        if fps == 0: 
+            self.tick = self._blank
+            return
+        self.wait = 1000/fps
+        self.nt = pygame.time.get_ticks()
+        pygame.time.wait(0)
+        
+    def _blank(self):
+        pass
+        
+    def tick(self):
+        """Wait correct amount of time each frame.  Call this once per frame."""
+        self.ct = pygame.time.get_ticks()
+        if self.ct < self.nt:
+            pygame.time.wait(self.nt-self.ct)
+            self.nt+=self.wait
+        else: 
+            self.nt = pygame.time.get_ticks()+self.wait
+
+
+class Speedometer:
+    """A timer replacement that returns out FPS once a second.
+    
+    Attributes:
+        fps -- always set to the current FPS
+
+    """
+    def __init__(self):
+        self.frames = 0
+        self.st = pygame.time.get_ticks()
+        self.fps = 0
+        
+    def tick(self):
+        """ Call this once per frame."""
+        r = None
+        self.frames += 1
+        self.ct = pygame.time.get_ticks()
+        if (self.ct - self.st) >= 1000: 
+            r = self.fps = self.frames
+            #print "%s: %d fps"%(self.__class__.__name__,self.fps)
+            self.frames = 0
+            self.st += 1000
+        pygame.time.wait(0) #NOTE: not sure why, but you gotta call this now and again
+        return r
+
+            
+
+

UCC git Repository :: git.ucc.asn.au