Document windows 7 permissions workaround
[tabakrolletjie.git] / tabakrolletjie / engine.py
index eee88b761dcc168c07c1d8fe85731af1b00a7962..cdea1608316b5b68c1e4af4eb5856bd21a9be2ad 100644 (file)
@@ -7,26 +7,51 @@ import pygame.time
 
 import pygame.locals as pgl
 
-from .constants import FPS
+from .constants import FPS, DRAW_FPS, FONTS, FPS_FRAMES
+from .loader import loader
+from .events import QuitEvent, SceneChangeEvent
 
 
 class Engine(object):
-    def __init__(self, screen, scene):
+    def __init__(self, screen, gamestate):
         self._screen = screen
+        self._gamestate = gamestate
+        self._scene = None
+
+    def set_scene(self, scene):
+        if self._scene is not None:
+            self._scene.exit(self._gamestate)
         self._scene = scene
+        if scene is not None:
+            self._scene.enter(self._gamestate)
 
     def run(self):
         clock = pygame.time.Clock()
+        fpses = [FPS] * FPS_FRAMES
+        frame = 0
+        font = loader.load_font(FONTS['sans'], size=16)
 
         while True:
             events = pygame.event.get()
             for ev in events:
-                if ev.type == pgl.QUIT:
+                if QuitEvent.matches(ev) or ev.type == pgl.QUIT:
+                    self.set_scene(None)
                     return
+                elif SceneChangeEvent.matches(ev):
+                    self.set_scene(ev.scene)
                 else:
-                    pass  # TODO: send to scene
-
-            # TODO: render scene
+                    self._scene.event(ev, self._gamestate)
+
+            # Advance time on the world
+            # Time is assumed to flow perfectly, so no dt parameter for now
+            self._scene.tick(self._gamestate)
+            self._scene.render(self._screen, self._gamestate)
+            if DRAW_FPS:
+                fps = sum(fpses) / FPS_FRAMES
+                text = font.render("FPS: %.2f" % fps, True, (255, 255, 255))
+                self._screen.blit(text, (10, 10), None)
             pygame.display.flip()
-
-            clock.tick(FPS)
+            fpses[frame] = 1000.0 / clock.tick(FPS)
+            frame += 1
+            if frame >= FPS_FRAMES:
+                frame = 0