view skaapsteker/levelscene.py @ 134:4713a2a3b0be

Initial cutscene screen
author Stefano Rivera <stefano@rivera.za.net>
date Tue, 05 Apr 2011 00:06:07 +0200
parents 85e2fa1f77c2
children 753bd89f0d96
line wrap: on
line source

"""Scene wrapping a level object."""

from pygame.locals import (KEYDOWN, K_DOWN, K_ESCAPE, K_LEFT, K_RIGHT,
                           K_SEMICOLON, K_UP, K_q, K_x, K_z)

from . import options
import engine
import level
import physics
import sprites.player
from skaapsteker.widgets.text import Text
import pygame

class LevelScene(engine.Scene):

    def __init__(self, game_state, leveldef, player=None):
        super(LevelScene, self).__init__(game_state)
        if not player:
            self._player = sprites.player.Player()
        else:
            self._player = player
        self._level = level.Level(leveldef, self._player)
        self._level_surface = self._level.get_surface()
        self._clip_rect = None
        self._world = physics.World()
        self.frozen = False

        # hackity, hack, hack
        for sprite in self._level.enemies:
            self._world.add(sprite)
        for sprite in self._level.tiles:
            self._world.add(sprite)
        for sprite in self._game_state.levels.get(self._level.name, []):
            self._world.add(sprite)

        self._world.add(self._player)
        self._build_action_map()

    def _build_action_map(self):
        KEY_TO_PLAYER_ACTION = {
            K_LEFT: 'action_left',
            K_RIGHT: 'action_right',
            K_UP: 'action_up',
            K_DOWN: 'action_down',
        }
        QUIT_KEYS = [K_ESCAPE]

        if options['dvorak']:
            KEY_TO_PLAYER_ACTION[K_SEMICOLON] = 'action_fire1'
            KEY_TO_PLAYER_ACTION[K_q] = 'action_fire2'
        else:
            KEY_TO_PLAYER_ACTION[K_x] = 'action_fire1'
            KEY_TO_PLAYER_ACTION[K_z] = 'action_fire2'
            QUIT_KEYS.append(K_q)

        self._key_map = {}
        for key, action in KEY_TO_PLAYER_ACTION.items():
            self._key_map[key] = getattr(self._player, action)
        for key in QUIT_KEYS:
            self._key_map[key] = self._quit

    def _quit(self):
        import menuscene # avoid circular import
        self.freeze()
        engine.ChangeScene.post(menuscene.MenuScene(self))

    def freeze(self):
        """Freeze the scene, for serialization"""
        self.frozen = True
        self._world.freeze()

    def thaw(self):
        """Unfreeze"""
        self._world.thaw()
        self.frozen = False

    def draw(self, screen_surface, engine):
        if self._clip_rect is None:
            self._clip_rect = pygame.Rect((0, 0), screen_surface.get_size())

        self._world.update()
        self._update_clip_rect()

        self._level_surface.set_clip(self._clip_rect)
        self._level.draw(self._level_surface)
        self._world.draw(self._level_surface)

        fps_text_pos = self._clip_rect.left + 10, self._clip_rect.top + 10
        fps_text = Text('FPS: %.1f' % engine.get_fps(), fps_text_pos)
        fps_text.draw(self._level_surface)

        screen_surface.blit(self._level_surface, (0, 0), self._clip_rect)

    def _update_clip_rect(self):
        cr = self._clip_rect
        lr = self._level_surface.get_rect()
        cr.center = self._player.rect.center
        cr.clamp_ip(lr)

    def dispatch(self, ev):
        if ev.type is KEYDOWN:
            action = self._key_map.get(ev.key)
            if action is not None:
                action()