Mercurial > mamba
view mamba/widgets/game.py @ 248:de3b4048e54a
Hook up tile arrow rotation
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Thu, 15 Sep 2011 00:40:30 +0200 |
parents | 321f2eef40e3 |
children | 71bc946ce1f1 |
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): self.world.pause() messagebox = MessageBox((300, 200), 'You died!', self.restart) self.parent.add(messagebox) messagebox.grab_focus() return True def restart(self): self.world.restart() self.actions = self.create_action_map() self.grab_focus() def level_completed(self, ev, widget): self.world.pause() 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())