view nagslang/screens/menu.py @ 346:282113d86d75

Save door and lever state.
author Jeremy Thurgood <firxen@gmail.com>
date Fri, 06 Sep 2013 15:14:27 +0200
parents 4708e86a9a3c
children e36e6101b766
line wrap: on
line source

"""Display a menu screen."""

import pygame

from nagslang.screens.base import Screen
from nagslang.events import QuitEvent, ScreenChange
from nagslang.widgets.text import TextWidget, MultiLineWidget


class MenuScreen(Screen):
    def setup(self):
        # Position is hacked later
        self.cursor = TextWidget((0, 0), u'\N{Rightwards Arrow}',
                                 colour='red')
        self.cursor_pos = 0
        self.options = [
            self.play,
            self.restart,
            self.quit,
        ]
        self.widgets = [
            TextWidget((10, 10), 'Menu', fontsize=20),
            TextWidget((40, 50), 'Play the game'),
            TextWidget((40, 70), 'Start the game from the beginning again'),
            TextWidget((40, 90), 'Quit'),
            MultiLineWidget((60, 120), self.world.get_formatted_stats()),
            self.cursor,
        ]

    def handle_event(self, ev):
        if ev.type == pygame.locals.KEYDOWN:
            if ev.key == pygame.locals.K_ESCAPE:
                self.quit()
            elif ev.key == pygame.locals.K_DOWN:
                self.cursor_pos = (self.cursor_pos + 1) % len(self.options)
            elif ev.key == pygame.locals.K_UP:
                self.cursor_pos = (self.cursor_pos - 1) % len(self.options)
            elif ev.key == pygame.locals.K_RETURN:
                self.options[self.cursor_pos]()

    def render(self, surface):
        surface.fill(pygame.color.Color(255, 255, 255))
        self.cursor.pos = (10, 50 + 20 * self.cursor_pos)
        self.cursor.rect.top = self.cursor.pos[1]
        for widget in self.widgets:
            widget.draw(surface)

    def play(self):
        level_name, pos = self.world.level
        self.world.protagonist.set_position(tuple(pos))
        ScreenChange.post(level_name)

    def restart(self):
        self.world.reset()
        self.setup()

    def quit(self):
        QuitEvent.post()