Mercurial > mamba
annotate mamba/engine.py @ 51:e5f36843f7cd
Add on_enter and on_exit methods to habitats.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Sun, 11 Sep 2011 15:42:57 +0200 |
parents | 047273a63054 |
children | 3cc917814579 |
rev | line source |
---|---|
12 | 1 """Game engine and top-level game loop.""" |
2 | |
38 | 3 from mamba.constants import SCREEN |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
4 from mamba.widgets.base import Container |
38 | 5 |
12 | 6 import pygame.event |
7 import pygame.display | |
38 | 8 import pygame |
13
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
9 from pygame.locals import QUIT, USEREVENT |
12 | 10 |
11 | |
12 class Engine(object): | |
13 def __init__(self): | |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
14 self._habitat = None |
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
15 |
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
16 def set_habitat(self, habitat): |
51
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
17 if self._habitat is not None: |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
18 self._habitat.on_exit() |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
19 self._habitat = habitat |
51
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
20 if self._habitat is not None: |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
21 self._habitat.on_enter() |
12 | 22 |
23 def run(self): | |
24 """Game loop.""" | |
25 get_events = pygame.event.get | |
26 flip = pygame.display.flip | |
19
6d195a3a4557
Somewhere for levels to live.
Simon Cross <hodgestar@gmail.com>
parents:
15
diff
changeset
|
27 surface = pygame.display.get_surface() |
12 | 28 while True: |
29 events = get_events() | |
30 for ev in events: | |
31 if ev.type is QUIT: | |
32 return | |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
33 self._habitat.dispatch(ev) |
19
6d195a3a4557
Somewhere for levels to live.
Simon Cross <hodgestar@gmail.com>
parents:
15
diff
changeset
|
34 self._habitat.draw(surface) |
12 | 35 flip() |
13
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
36 |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
37 |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
38 class Habitat(object): |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
39 |
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
40 def __init__(self): |
38 | 41 self.surface = pygame.Surface(SCREEN) |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
42 self.container = Container() |
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
43 |
51
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
44 def on_enter(self): |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
45 """Called when this becomes the current habitat.""" |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
46 pass |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
47 |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
48 def on_exit(self): |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
49 """Called when this stops being the current habitat.""" |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
50 pass |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
51 |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
52 def dispatch(self, ev): |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
53 self.container.event(ev) |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
54 |
19
6d195a3a4557
Somewhere for levels to live.
Simon Cross <hodgestar@gmail.com>
parents:
15
diff
changeset
|
55 def draw(self, surface): |
38 | 56 self.surface.fill(pygame.Color('black')) |
57 self.container.draw(self.surface) | |
58 surface.blit(self.surface, self.surface.get_rect()) | |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
59 |
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
60 |
13
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
61 class UserEvent(object): |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
62 |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
63 utype = "UNKNOWN" |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
64 |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
65 @classmethod |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
66 def post(cls, **kws): |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
67 ev = pygame.event.Event(USEREVENT, utype=cls.utype, **kws) |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
68 pygame.event.post(ev) |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
69 |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
70 @classmethod |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
71 def matches(cls, ev): |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
72 return ev.type is USEREVENT and ev.utype == cls.utype |