Mercurial > mamba
view mamba/widgets/game.py @ 285:cacc03748580
Move world initialisation to restart
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Thu, 15 Sep 2011 23:02:47 +0200 |
parents | de3b4048e54a |
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())