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