view skaapsteker/menuscene.py @ 632:0675f390653c

Initial port to Python 3 and Pygame 2.
author Simon Cross <hodgestar@gmail.com>
date Fri, 20 Jan 2023 20:01:06 +0100
parents a5a57abd5472
children
line wrap: on
line source

import pygame
from pygame.locals import K_ESCAPE, K_q, K_UP, K_DOWN, K_RETURN, K_SPACE, KEYDOWN, QUIT

from .data import load_image
from .cutscene import OpeningCutScene, UsageCutScene, CreditsCutScene
from .engine import ChangeScene, Scene
from .levelscene import LevelScene
from .widgets.text import Text, TextChoice


class MenuScene(Scene):
    def __init__(self, game_state, soundsystem):
        super(MenuScene, self).__init__(game_state, soundsystem)
        self._background = load_image('backgrounds/main-menu.png')
        self._cursor = load_image('sprites/main-menu-cursor.png')
        self._selected = 0
        self._options = ['restart', 'usage', 'credits', 'quit']
        self._can_resume = self.game_state.world is not None
        if self._can_resume:
            resume = load_image('sprites/main-menu-resume.png')
            self._background.blit(resume, (73, 180))
            self._options.insert(0, 'resume')

    def selected(self, option, data):
        if data == 'resume':
            fox = self.game_state.world.fox
            ChangeScene.post((LevelScene, '.'.join([fox.level, fox.doorway])))
        elif data == 'restart':
            self.game_state.new_game()
            ChangeScene.post(OpeningCutScene(self.game_state, self._soundsystem))
        elif data == 'usage':
            ChangeScene.post(UsageCutScene(self.game_state, self._soundsystem))
        elif data == 'credits':
            ChangeScene.post(CreditsCutScene(self.game_state, self._soundsystem))
        elif data == 'quit':
            pygame.event.post(pygame.event.Event(QUIT))

    def draw(self, surface, engine):
        cursor_x = 35
        cursor_y = 232
        if self._can_resume:
            cursor_y -= 43
        cursor_y += 43 * self._selected
        surface.blit(self._background, (0, 0))
        surface.blit(self._cursor, (cursor_x, cursor_y))

    def dispatch(self, ev):
        if ev.type == KEYDOWN:
            if ev.key in (K_q, K_ESCAPE):
                pygame.event.post(pygame.event.Event(QUIT))
            elif ev.key == K_DOWN:
                self._selected += 1
            elif ev.key == K_UP:
                self._selected -= 1
            elif ev.key in [K_RETURN, K_SPACE]:
                self.selected(self._selected, self._options[self._selected])

        self._selected %= 4 + int(self._can_resume)