Mercurial > skaapsteker
view skaapsteker/engine.py @ 14:fb1bd081cc86
Add scene changing.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Sun, 03 Apr 2011 16:35:18 +0200 |
parents | 249814efa91b |
children | fe8652a060df |
line wrap: on
line source
"""Top-level engine for switching scenes.""" import pygame.display import pygame.time import pygame.event from pygame.locals import QUIT, USEREVENT class Engine(object): def __init__(self): self._framerate = 60 self._current_scene = None def change_scene(self, next_scene): if self._current_scene is not None: self._current_scene.leave() self._current_scene = next_scene self._current_scene.enter() def run(self): """Run the game loop dispatching events as necessary.""" assert self._current_scene is not None clock = pygame.time.Clock() surface = pygame.display.get_surface() while True: events = pygame.event.get() for ev in events: if ev.type is QUIT: return if ChangeScene.matches(ev): self.change_scene(ev.next_scene) break self._current_scene.dispatch(ev) self._current_scene.draw(surface) pygame.display.flip() clock.tick(self._framerate) class Scene(object): def __init__(self): pass def post(self, ev): """Post an event to pygame's event loop.""" pygame.event.post(ev) def enter(self): """Enter the scene.""" pass def leave(self): """Exit the scene.""" pass def dispatch(self, ev): """Dispatch an event.""" pass def draw(self, surface): """Update the scene surface.""" pass class UserEvent(object): utype = "UNKNOWN" @classmethod def post(cls, **kws): ev = pygame.event.Event(USEREVENT, utype=cls.utype, **kws) pygame.event.post(ev) @classmethod def matches(cls, ev): return ev.type is USEREVENT and ev.utype == cls.utype class ChangeScene(UserEvent): utype = "CHANGE_SCENE" @classmethod def post(cls, next_scene): super(ChangeScene, cls).post(next_scene=next_scene)