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())