Mercurial > mamba
view mamba/widgets/game.py @ 314:fba74abad7b7
Pass Level() objects to LevelHabitat and LevelEditorHabitat, in preparation for generating thumbnails from levels in levelmenu
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Fri, 16 Sep 2011 19:07:51 +0200 |
parents | 09ec51b9d385 |
children | 214b2bd173a8 |
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.send_new_direction, (LEFT,)) actions[K_RIGHT] = (self.world.snake.send_new_direction, (RIGHT,)) actions[K_DOWN] = (self.world.snake.send_new_direction, (DOWN,)) actions[K_UP] = (self.world.snake.send_new_direction, (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!\n%s' % ev.reason, 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())