Mercurial > mamba
view mamba/widgets/game.py @ 286:71bc946ce1f1
Check if paused to avoid displaing two MessageBoxes on the screen if we manage to stack up SnakeDied events
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Thu, 15 Sep 2011 23:07:18 +0200 |
parents | de3b4048e54a |
children | 49fe66680ff8 |
line wrap: on
line source
"""Display the game area.""" from pygame.rect import Rect from pygame.locals import KEYDOWN, K_LEFT, K_RIGHT, K_DOWN, K_UP from mamba.constants import UP, DOWN, LEFT, RIGHT from mamba.widgets.base import Widget from mamba.widgets.messagebox import MessageBox from mamba.engine import (SnakeDiedEvent, LevelCompletedEvent, NewHabitatEvent, FlipArrowsEvent) from mamba.habitats.mainmenu import MainMenu from mamba.gamestate import level_done class GameWidget(Widget): def __init__(self, world, offset=(0, 0)): self.world = world self.actions = self.create_action_map() rect = Rect(offset, world.get_size()) super(GameWidget, self).__init__(rect) self.focussable = True self.add_callback(KEYDOWN, self.action_callback) self.add_callback(SnakeDiedEvent, self.snake_died) self.add_callback(LevelCompletedEvent, self.level_completed) self.add_callback(FlipArrowsEvent, self.flip_arrows) def create_action_map(self): actions = {} actions[K_LEFT] = (self.world.snake.set_orientation, (LEFT,)) actions[K_RIGHT] = (self.world.snake.set_orientation, (RIGHT,)) actions[K_DOWN] = (self.world.snake.set_orientation, (DOWN,)) actions[K_UP] = (self.world.snake.set_orientation, (UP,)) return actions def action_callback(self, ev, widget): if ev.key in self.actions: func, args = self.actions[ev.key] func(*args) return True def flip_arrows(self, ev, widget): self.world.level.flip_arrows() def draw(self, surface): self.world.update() self.world.draw(surface) def snake_died(self, ev, widget): if not self.world.pause(): return False messagebox = MessageBox((300, 200), 'You died!', self.restart) self.parent.add(messagebox) messagebox.grab_focus() self.world.snake.alive = False return True def restart(self): self.world.restart() self.actions = self.create_action_map() self.grab_focus() def level_completed(self, ev, widget): if not self.world.pause(): return False messagebox = MessageBox((300, 200), 'Level complete!', self.go_mainmenu) self.parent.add(messagebox) messagebox.grab_focus() level_done(self.world.level.level_name) return True def go_mainmenu(self): self.grab_focus() NewHabitatEvent.post(MainMenu())