Mercurial > rinkhals
comparison gamelib/engine.py @ 548:27c09c58d89d
Remove gameboard and dialog event flow hacks.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Sat, 28 Nov 2009 11:25:56 +0000 |
parents | 450de9dfa106 |
children | 296c73dcd286 |
comparison
equal
deleted
inserted
replaced
547:1456bf2ff02e | 548:27c09c58d89d |
---|---|
1 """Game engine and states.""" | 1 """Game engine and states.""" |
2 from pgu.engine import Game, State, Quit | 2 from pgu.engine import Game, State, Quit |
3 import pygame | 3 import pygame |
4 from pygame.locals import USEREVENT, QUIT, KEYDOWN, K_ESCAPE, K_n, K_d, K_s, K_i | 4 from pygame.locals import USEREVENT, QUIT, KEYDOWN, K_ESCAPE, K_s, K_i |
5 | 5 |
6 import gameboard | 6 import gameboard |
7 import gameover | 7 import gameover |
8 import sound | 8 import sound |
9 import constants | 9 import constants |
10 import mainmenu | 10 import mainmenu |
11 import helpscreen | 11 import helpscreen |
12 import level | 12 import level |
13 from misc import check_exit | |
14 | 13 |
15 class Engine(Game): | 14 class Engine(Game): |
16 def __init__(self, main_app, level_name): | 15 def __init__(self, main_app, level_name): |
17 self.main_app = main_app | 16 self.main_app = main_app |
18 self.clock = pygame.time.Clock() | 17 self.clock = pygame.time.Clock() |
139 | 138 |
140 sound.play_sound("daybreak.ogg") | 139 sound.play_sound("daybreak.ogg") |
141 # disable timer | 140 # disable timer |
142 pygame.time.set_timer(MOVE_FOX_ID, 0) | 141 pygame.time.set_timer(MOVE_FOX_ID, 0) |
143 sound.background_music("daytime.ogg") | 142 sound.background_music("daytime.ogg") |
144 self.dialog = None | 143 |
145 | 144 def event(self, e): |
146 def event(self, e): | |
147 if self.dialog and self.dialog.running: | |
148 if self.dialog.event(e): | |
149 return | |
150 elif self.dialog: | |
151 if self.dialog.do_quit: | |
152 self.dialog = None | |
153 self.game.gameboard.reset_states() | |
154 return GameOver(self.game) | |
155 self.dialog = None | |
156 return | |
157 if events_equal(e, START_NIGHT): | 145 if events_equal(e, START_NIGHT): |
158 self.game.gameboard.reset_states() | 146 self.game.gameboard.reset_states() |
159 return NightState(self.game) | 147 return NightState(self.game) |
160 elif e.type is KEYDOWN and e.key == K_ESCAPE: | 148 elif events_equal(e, GO_GAME_OVER): |
161 self.dialog = check_exit() | 149 return GameOver(self.game) |
162 elif e.type is KEYDOWN and e.key == K_n: | |
163 return pygame.event.post(START_NIGHT) | |
164 elif events_equal(e, GO_MAIN_MENU): | 150 elif events_equal(e, GO_MAIN_MENU): |
165 return MainMenuState(self.game) | 151 return MainMenuState(self.game) |
166 elif e.type is DO_LOAD_SAVEGAME: | 152 elif e.type is DO_LOAD_SAVEGAME: |
167 self.game.switch_gameboard(e.gameboard) | 153 self.game.switch_gameboard(e.gameboard) |
168 return | 154 return |
169 elif e.type is not QUIT: | 155 |
170 self.game.main_app.event(e) | 156 self.game.main_app.event(e) |
171 | 157 |
172 def paint(self, screen): | 158 def paint(self, screen): |
173 self.game.main_app.paint(screen) | 159 self.game.main_app.paint(screen) |
174 pygame.display.flip() | 160 pygame.display.flip() |
175 | 161 |
196 sound.background_music("nighttime.ogg") | 182 sound.background_music("nighttime.ogg") |
197 | 183 |
198 self.dialog = None | 184 self.dialog = None |
199 | 185 |
200 def event(self, e): | 186 def event(self, e): |
201 if self.dialog and self.dialog.running: | |
202 if self.dialog.event(e): | |
203 return | |
204 elif self.dialog: | |
205 if self.dialog.do_quit: | |
206 self.dialog = None | |
207 self.game.gameboard.reset_states() | |
208 return GameOver(self.game) | |
209 self.dialog=None | |
210 return | |
211 if events_equal(e, START_DAY): | 187 if events_equal(e, START_DAY): |
212 if self.game.gameboard.level.is_game_over(self.game.gameboard): | 188 if self.game.gameboard.level.is_game_over(self.game.gameboard): |
213 return GameOver(self.game) | 189 return GameOver(self.game) |
214 return DayState(self.game) | 190 return DayState(self.game) |
215 elif (e.type is KEYDOWN and e.key == K_d) or \ | 191 elif events_equal(e, GO_GAME_OVER): |
216 events_equal(e, FAST_FORWARD): | 192 return GameOver(self.game) |
193 elif events_equal(e, FAST_FORWARD): | |
217 if self.cycle_time > FAST__SPEED: | 194 if self.cycle_time > FAST__SPEED: |
218 self.cycle_time = FAST__SPEED | 195 self.cycle_time = FAST__SPEED |
219 else: | 196 else: |
220 self.cycle_time = SLOW__SPEED | 197 self.cycle_time = SLOW__SPEED |
221 pygame.time.set_timer(MOVE_FOX_ID, self.cycle_time) | 198 pygame.time.set_timer(MOVE_FOX_ID, self.cycle_time) |
222 elif e.type is KEYDOWN and e.key == K_ESCAPE: | 199 return |
223 self.dialog = check_exit() | |
224 elif e.type is MOVE_FOX_ID: | 200 elif e.type is MOVE_FOX_ID: |
225 # ensure no timers trigger while we're running | 201 # ensure no timers trigger while we're running |
226 pygame.time.set_timer(MOVE_FOX_ID, 0) | 202 pygame.time.set_timer(MOVE_FOX_ID, 0) |
227 cur_time = pygame.time.get_ticks() | 203 cur_time = pygame.time.get_ticks() |
228 # Clear any queued timer events, so we don't full the queue | 204 # Clear any queued timer events, so we don't full the queue |
238 diff = pygame.time.get_ticks() - cur_time | 214 diff = pygame.time.get_ticks() - cur_time |
239 time_left = self.cycle_time - diff | 215 time_left = self.cycle_time - diff |
240 if time_left <= 0: | 216 if time_left <= 0: |
241 time_left = self.cycle_time | 217 time_left = self.cycle_time |
242 pygame.time.set_timer(MOVE_FOX_ID, time_left) | 218 pygame.time.set_timer(MOVE_FOX_ID, time_left) |
243 elif e.type is not QUIT: | 219 return |
244 self.game.main_app.event(e) | 220 |
221 self.game.main_app.event(e) | |
245 | 222 |
246 def loop(self): | 223 def loop(self): |
247 self.game.gameboard.loop() | 224 self.game.gameboard.loop() |
248 | 225 |
249 def paint(self, screen): | 226 def paint(self, screen): |
288 | 265 |
289 START_DAY = pygame.event.Event(USEREVENT, name="START_DAY") | 266 START_DAY = pygame.event.Event(USEREVENT, name="START_DAY") |
290 START_NIGHT = pygame.event.Event(USEREVENT, name="START_NIGHT") | 267 START_NIGHT = pygame.event.Event(USEREVENT, name="START_NIGHT") |
291 GO_MAIN_MENU = pygame.event.Event(USEREVENT, name="GO_MAIN_MENU") | 268 GO_MAIN_MENU = pygame.event.Event(USEREVENT, name="GO_MAIN_MENU") |
292 GO_HELP_SCREEN = pygame.event.Event(USEREVENT, name="GO_HELP_SCREEN") | 269 GO_HELP_SCREEN = pygame.event.Event(USEREVENT, name="GO_HELP_SCREEN") |
270 GO_GAME_OVER = pygame.event.Event(USEREVENT, name="GO_GAME_OVER") | |
293 FAST_FORWARD = pygame.event.Event(USEREVENT, name="FAST_FORWARD") | 271 FAST_FORWARD = pygame.event.Event(USEREVENT, name="FAST_FORWARD") |
294 MOVE_FOX_ID = USEREVENT + 1 | 272 MOVE_FOX_ID = USEREVENT + 1 |
295 MOVE_FOXES = pygame.event.Event(MOVE_FOX_ID, name="MOVE_FOXES") | 273 MOVE_FOXES = pygame.event.Event(MOVE_FOX_ID, name="MOVE_FOXES") |
296 DO_LOAD_SAVEGAME = USEREVENT + 2 | 274 DO_LOAD_SAVEGAME = USEREVENT + 2 |
297 DO_LOAD_LEVEL = USEREVENT + 3 | 275 DO_LOAD_LEVEL = USEREVENT + 3 |