Mercurial > pyntnclick
comparison 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 |
comparison
equal
deleted
inserted
replaced
595:59f1ee3f5632 | 596:5496dcd16a84 |
---|---|
1 """Game engine and top-level game loop.""" | |
2 | |
3 import pygame | |
4 import pygame.event | |
5 import pygame.display | |
6 import pygame.time | |
7 from pygame.locals import QUIT, USEREVENT | |
8 | |
9 | |
10 class Engine(object): | |
11 def __init__(self, game_description): | |
12 self._screen = None | |
13 self._game_description = game_description | |
14 | |
15 def set_screen(self, screen): | |
16 if self._screen is not None: | |
17 self._screen.on_exit() | |
18 self._screen = screen | |
19 if self._screen is not None: | |
20 self._screen.on_enter() | |
21 | |
22 def run(self): | |
23 """Game loop.""" | |
24 | |
25 get_events = pygame.event.get | |
26 flip = pygame.display.flip | |
27 clock = pygame.time.Clock() | |
28 while True: | |
29 events = get_events() | |
30 for ev in events: | |
31 if ev.type == QUIT: | |
32 return | |
33 elif ScreenChangeEvent.matches(ev): | |
34 self.set_habitat(ev.habitat) | |
35 else: | |
36 self._screen.dispatch(ev) | |
37 surface = pygame.display.get_surface() | |
38 self._habitat.draw(surface) | |
39 flip() | |
40 self._fps = 1000.0 / clock.tick( | |
41 self.game_description.constants.fps) | |
42 | |
43 | |
44 class UserEvent(object): | |
45 """A user event type allowing subclassing, | |
46 to provide an infinate number of user-defined events | |
47 """ | |
48 | |
49 TYPE = "UNKNOWN" | |
50 | |
51 @classmethod | |
52 def post(cls, **kws): | |
53 ev = pygame.event.Event(USEREVENT, utype=cls.TYPE, **kws) | |
54 pygame.event.post(ev) | |
55 | |
56 @classmethod | |
57 def matches(cls, ev): | |
58 return ev.type == USEREVENT and ev.utype == cls.TYPE | |
59 | |
60 | |
61 class ScreenChangeEvent(UserEvent): | |
62 | |
63 TYPE = "SCREEN_CHANGE" | |
64 | |
65 @classmethod | |
66 def post(cls, screen): | |
67 super(ScreenChangeEvent, cls).post(screen=screen) |