Mercurial > mamba
annotate mamba/engine.py @ 555:c014f5023cd2
Test run replays
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Thu, 22 Sep 2011 17:32:38 +0200 |
parents | 165fcc747951 |
children | 4c30776673c6 |
rev | line source |
---|---|
12 | 1 """Game engine and top-level game loop.""" |
2 | |
122
45dd79e9ba1b
Rudimentary FPS and clock ticking.
Simon Cross <hodgestar@gmail.com>
parents:
106
diff
changeset
|
3 from mamba.constants import SCREEN, FPS |
320
13eaea2365b3
Stop music on scene changes
Neil Muller <drnlmuller@gmail.com>
parents:
304
diff
changeset
|
4 from mamba.sound import stop_sound |
38 | 5 |
12 | 6 import pygame.event |
7 import pygame.display | |
122
45dd79e9ba1b
Rudimentary FPS and clock ticking.
Simon Cross <hodgestar@gmail.com>
parents:
106
diff
changeset
|
8 import pygame.time |
38 | 9 import pygame |
13
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
10 from pygame.locals import QUIT, USEREVENT |
12 | 11 |
12 | |
13 class Engine(object): | |
14 def __init__(self): | |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
15 self._habitat = None |
122
45dd79e9ba1b
Rudimentary FPS and clock ticking.
Simon Cross <hodgestar@gmail.com>
parents:
106
diff
changeset
|
16 self._fps = FPS |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
17 |
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
18 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
|
19 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
|
20 self._habitat.on_exit() |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
21 self._habitat = habitat |
51
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
22 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
|
23 self._habitat.on_enter() |
12 | 24 |
25 def run(self): | |
26 """Game loop.""" | |
27 get_events = pygame.event.get | |
28 flip = pygame.display.flip | |
122
45dd79e9ba1b
Rudimentary FPS and clock ticking.
Simon Cross <hodgestar@gmail.com>
parents:
106
diff
changeset
|
29 clock = pygame.time.Clock() |
12 | 30 while True: |
31 events = get_events() | |
32 for ev in events: | |
33 if ev.type is QUIT: | |
34 return | |
61 | 35 elif NewHabitatEvent.matches(ev): |
36 self.set_habitat(ev.habitat) | |
37 else: | |
38 self._habitat.dispatch(ev) | |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
62
diff
changeset
|
39 surface = pygame.display.get_surface() |
19
6d195a3a4557
Somewhere for levels to live.
Simon Cross <hodgestar@gmail.com>
parents:
15
diff
changeset
|
40 self._habitat.draw(surface) |
12 | 41 flip() |
122
45dd79e9ba1b
Rudimentary FPS and clock ticking.
Simon Cross <hodgestar@gmail.com>
parents:
106
diff
changeset
|
42 self._fps = 1000.0 / clock.tick(FPS) |
13
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
43 |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
44 |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
45 class Habitat(object): |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
46 |
92
1e9da4893d51
Add size parameter to habitats
Neil Muller <drnlmuller@gmail.com>
parents:
77
diff
changeset
|
47 def __init__(self, size=SCREEN): |
208
c35e22dc225a
Prepare for circular import
Stefano Rivera <stefano@rivera.za.net>
parents:
185
diff
changeset
|
48 from mamba.widgets.base import Container |
320
13eaea2365b3
Stop music on scene changes
Neil Muller <drnlmuller@gmail.com>
parents:
304
diff
changeset
|
49 stop_sound() # Always stop any music on scene changes |
92
1e9da4893d51
Add size parameter to habitats
Neil Muller <drnlmuller@gmail.com>
parents:
77
diff
changeset
|
50 self.surface_size = size |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
62
diff
changeset
|
51 self.surface = None |
106 | 52 self.container = Container(pygame.Rect((0, 0), self.surface_size)) |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
53 |
51
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
54 def on_enter(self): |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
55 """Called when this becomes the current habitat.""" |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
62
diff
changeset
|
56 # Create the surface here as flipping between editor and |
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
62
diff
changeset
|
57 # other things kills pygame.display |
92
1e9da4893d51
Add size parameter to habitats
Neil Muller <drnlmuller@gmail.com>
parents:
77
diff
changeset
|
58 self.surface = pygame.Surface(self.surface_size) |
51
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
59 |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
60 def on_exit(self): |
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
61 """Called when this stops being the current habitat.""" |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
62
diff
changeset
|
62 self.surface = None |
51
e5f36843f7cd
Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents:
38
diff
changeset
|
63 |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
64 def dispatch(self, ev): |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
19
diff
changeset
|
65 self.container.event(ev) |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
66 |
467 | 67 def draw_background(self): |
68 self.surface.fill(pygame.Color('gray')) | |
69 | |
19
6d195a3a4557
Somewhere for levels to live.
Simon Cross <hodgestar@gmail.com>
parents:
15
diff
changeset
|
70 def draw(self, surface): |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
62
diff
changeset
|
71 if self.surface: |
467 | 72 self.draw_background() |
64
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
62
diff
changeset
|
73 self.container.draw(self.surface) |
fbb5cc655b47
More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents:
62
diff
changeset
|
74 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
|
75 |
404 | 76 def display_dialog(self, dialog): |
77 self.container.paused = True | |
78 self.container.add(dialog) | |
79 dialog.grab_focus() | |
80 | |
15
ad2bcbf492bf
Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents:
13
diff
changeset
|
81 |
13
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
82 class UserEvent(object): |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
83 |
61 | 84 TYPE = "UNKNOWN" |
13
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
85 |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
86 @classmethod |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
87 def post(cls, **kws): |
61 | 88 ev = pygame.event.Event(USEREVENT, utype=cls.TYPE, **kws) |
13
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
89 pygame.event.post(ev) |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
90 |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
91 @classmethod |
f5846a46e9c5
Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents:
12
diff
changeset
|
92 def matches(cls, ev): |
61 | 93 return ev.type is USEREVENT and ev.utype == cls.TYPE |
94 | |
95 | |
96 class NewHabitatEvent(UserEvent): | |
97 | |
98 TYPE = "NEW_HABITAT" | |
99 | |
100 @classmethod | |
101 def post(cls, habitat): | |
62 | 102 super(NewHabitatEvent, cls).post(habitat=habitat) |
185 | 103 |
104 | |
105 class SnakeDiedEvent(UserEvent): | |
106 | |
107 TYPE = "SNAKE_DIED" | |
108 | |
109 @classmethod | |
304
49fe66680ff8
And even death shall lose it's mysteries
Neil Muller <drnlmuller@gmail.com>
parents:
248
diff
changeset
|
110 def post(cls, reason): |
49fe66680ff8
And even death shall lose it's mysteries
Neil Muller <drnlmuller@gmail.com>
parents:
248
diff
changeset
|
111 super(SnakeDiedEvent, cls).post(reason=reason) |
213 | 112 |
113 | |
114 class LevelCompletedEvent(UserEvent): | |
115 | |
116 TYPE = "LEVEL_COMPLETED" | |
117 | |
118 @classmethod | |
119 def post(cls): | |
120 super(LevelCompletedEvent, cls).post() | |
248
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
121 |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
122 |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
123 class FlipArrowsEvent(UserEvent): |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
124 |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
125 TYPE = "FLIP_ARROWS" |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
126 |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
127 @classmethod |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
128 def post(cls): |
de3b4048e54a
Hook up tile arrow rotation
Stefano Rivera <stefano@rivera.za.net>
parents:
213
diff
changeset
|
129 super(FlipArrowsEvent, cls).post() |
408
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
130 |
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
131 |
555 | 132 class ReplayEvent(UserEvent): |
133 | |
134 TYPE = "REPLAY_EVENT" | |
135 | |
136 @classmethod | |
137 def post(cls, run, replay_pos): | |
138 super(ReplayEvent, cls).post(run=run, replay_pos=replay_pos) | |
139 | |
140 | |
408
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
141 class HabitatSetupEvent(UserEvent): |
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
142 |
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
143 TYPE = "SETUP_HABITAT" |
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
144 |
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
145 @classmethod |
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
146 def post(cls): |
98ccef2a1a3c
Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents:
404
diff
changeset
|
147 super(HabitatSetupEvent, cls).post() |