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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
1 """Game engine and top-level game loop."""
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
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
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
5
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
6 import pygame.event
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
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
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
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
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
11
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
13 class Engine(object):
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
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
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
24
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
25 def run(self):
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
26 """Game loop."""
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
27 get_events = pygame.event.get
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
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
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
30 while True:
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
31 events = get_events()
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
32 for ev in events:
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
33 if ev.type is QUIT:
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
34 return
61
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
35 elif NewHabitatEvent.matches(ev):
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
36 self.set_habitat(ev.habitat)
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
37 else:
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
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
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
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
d1152f2a0e13 Mouse affects focus
Stefano Rivera <stefano@rivera.za.net>
parents: 96
diff changeset
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
165fcc747951 Splishy splash
Stefano Rivera <stefano@rivera.za.net>
parents: 408
diff changeset
67 def draw_background(self):
165fcc747951 Splishy splash
Stefano Rivera <stefano@rivera.za.net>
parents: 408
diff changeset
68 self.surface.fill(pygame.Color('gray'))
165fcc747951 Splishy splash
Stefano Rivera <stefano@rivera.za.net>
parents: 408
diff changeset
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
165fcc747951 Splishy splash
Stefano Rivera <stefano@rivera.za.net>
parents: 408
diff changeset
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
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 320
diff changeset
76 def display_dialog(self, dialog):
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 320
diff changeset
77 self.container.paused = True
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 320
diff changeset
78 self.container.add(dialog)
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 320
diff changeset
79 dialog.grab_focus()
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 320
diff changeset
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
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
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
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
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
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
93 return ev.type is USEREVENT and ev.utype == cls.TYPE
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
94
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
95
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
96 class NewHabitatEvent(UserEvent):
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
97
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
98 TYPE = "NEW_HABITAT"
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
99
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
100 @classmethod
fc4b7db1d832 Habitat switching.
Simon Cross <hodgestar@gmail.com>
parents: 59
diff changeset
101 def post(cls, habitat):
62
40be38f4427c Bug squashing.
Simon Cross <hodgestar@gmail.com>
parents: 61
diff changeset
102 super(NewHabitatEvent, cls).post(habitat=habitat)
185
b93845471311 Add SnakeDiedEvent
Neil Muller <drnlmuller@gmail.com>
parents: 152
diff changeset
103
b93845471311 Add SnakeDiedEvent
Neil Muller <drnlmuller@gmail.com>
parents: 152
diff changeset
104
b93845471311 Add SnakeDiedEvent
Neil Muller <drnlmuller@gmail.com>
parents: 152
diff changeset
105 class SnakeDiedEvent(UserEvent):
b93845471311 Add SnakeDiedEvent
Neil Muller <drnlmuller@gmail.com>
parents: 152
diff changeset
106
b93845471311 Add SnakeDiedEvent
Neil Muller <drnlmuller@gmail.com>
parents: 152
diff changeset
107 TYPE = "SNAKE_DIED"
b93845471311 Add SnakeDiedEvent
Neil Muller <drnlmuller@gmail.com>
parents: 152
diff changeset
108
b93845471311 Add SnakeDiedEvent
Neil Muller <drnlmuller@gmail.com>
parents: 152
diff changeset
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
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
112
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
113
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
114 class LevelCompletedEvent(UserEvent):
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
115
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
116 TYPE = "LEVEL_COMPLETED"
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
117
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
118 @classmethod
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
119 def post(cls):
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 208
diff changeset
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
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
132 class ReplayEvent(UserEvent):
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
133
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
134 TYPE = "REPLAY_EVENT"
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
135
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
136 @classmethod
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
137 def post(cls, run, replay_pos):
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
138 super(ReplayEvent, cls).post(run=run, replay_pos=replay_pos)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
139
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 467
diff changeset
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()