Mercurial > sypikslang
diff gamelib/engine.py @ 52:1d3d20bdc8b9
Move engine stuff into it's own file
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Mon, 07 May 2012 21:55:55 +0200 |
parents | |
children | 7309392d9ca9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gamelib/engine.py Mon May 07 21:55:55 2012 +0200 @@ -0,0 +1,89 @@ +# -*- 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 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: + view.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()