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