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