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