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)