view pyntnclick/engine.py @ 596:5496dcd16a84 pyntnclick

Add pyntnclick.engine, based on mamba
author Stefano Rivera <stefano@rivera.za.net>
date Sat, 11 Feb 2012 18:22:57 +0200
parents
children fabce47e542f
line wrap: on
line source

"""Game engine and top-level game loop."""

import pygame
import pygame.event
import pygame.display
import pygame.time
from pygame.locals import QUIT, USEREVENT


class Engine(object):
    def __init__(self, game_description):
        self._screen = None
        self._game_description = game_description

    def set_screen(self, screen):
        if self._screen is not None:
            self._screen.on_exit()
        self._screen = screen
        if self._screen is not None:
            self._screen.on_enter()

    def run(self):
        """Game loop."""

        get_events = pygame.event.get
        flip = pygame.display.flip
        clock = pygame.time.Clock()
        while True:
            events = get_events()
            for ev in events:
                if ev.type == QUIT:
                    return
                elif ScreenChangeEvent.matches(ev):
                    self.set_habitat(ev.habitat)
                else:
                    self._screen.dispatch(ev)
            surface = pygame.display.get_surface()
            self._habitat.draw(surface)
            flip()
            self._fps = 1000.0 / clock.tick(
                    self.game_description.constants.fps)


class UserEvent(object):
    """A user event type allowing subclassing,
       to provide an infinate number of user-defined events
    """

    TYPE = "UNKNOWN"

    @classmethod
    def post(cls, **kws):
        ev = pygame.event.Event(USEREVENT, utype=cls.TYPE, **kws)
        pygame.event.post(ev)

    @classmethod
    def matches(cls, ev):
        return ev.type == USEREVENT and ev.utype == cls.TYPE


class ScreenChangeEvent(UserEvent):

    TYPE = "SCREEN_CHANGE"

    @classmethod
    def post(cls, screen):
        super(ScreenChangeEvent, cls).post(screen=screen)