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