view gamelib/engine.py @ 245:c39599854a2d

Better 'You've Won' Screen
author Neil Muller <drnlmuller@gmail.com>
date Sun, 13 May 2012 00:43:30 +0200
parents e386ec5d179b
children
line wrap: on
line source

# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8 ai ts=4 sts=4 et sw=4


"""Game engine stuff"""

import pygame
from pygame.locals import (MOUSEBUTTONDOWN, MOUSEBUTTONUP, MOUSEMOTION, QUIT,
        USEREVENT)
from pygame.time import Clock

from gamelib.constants import FPS


class UserEvent(object):
    # Handy event wrapper

    TYPE = "unknown"

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

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


class AddWindow(UserEvent):
    # Add the given window to the top of the window stack

    TYPE = "ADD_WINDOW"

    @classmethod
    def post(cls, window):
        super(AddWindow, cls).post(window=window)


class PopWindow(UserEvent):
    # Pop a window off the top of the window stack

    TYPE = "POP_WINDOW"

    @classmethod
    def post(cls):
        super(PopWindow, cls).post()


class GameOver(UserEvent):
    # The game is over

    TYPE = "GAME_OVER"

    @classmethod
    def post(cls, window):
        super(GameOver, cls).post(window=window)


class Engine(object):

    def __init__(self, screen):
        self._window_stack = []
        self._running = False
        self._mouse_down = False
        self._screen = screen

    def run(self, window):
        clock = Clock()
        self._window_stack.append(window)
        self._running = True
        self._mouse_down = False
        while self._running:
            self.process_input()
            self.draw()
            clock.tick(FPS)

    def draw(self):
        #for view in self._window_stack:
        self._window_stack[-1].draw(self._screen)
        pygame.display.flip()

    def process_input(self):
        for event in pygame.event.get():
            if self._mouse_down:
                if event.type == MOUSEBUTTONUP:
                    self._mouse_down = False
                    self._window_stack[-1].on_mouse_up(event.pos)
                elif event.type == MOUSEMOTION:
                    self._window_stack[-1].on_mouse_move(event.pos)
            elif not self._mouse_down and event.type == MOUSEBUTTONDOWN:
                self._mouse_down = True
                self._window_stack[-1].on_mouse_down(event.pos)
            elif event.type == QUIT:
                self._running = False
            elif AddWindow.matches(event):
                self._window_stack.append(event.window)
            elif PopWindow.matches(event):
                self._window_stack.pop()
            elif GameOver.matches(event):
                # call game_over method on every item in the stack
                for win in self._window_stack:
                    if hasattr(win, 'game_over'):
                        win.game_over()
                self._window_stack.append(event.window)