view skaapsteker/levelscene.py @ 104:12ce1d131a72

Hack in resume game option
author Neil Muller <drnlmuller@gmail.com>
date Mon, 04 Apr 2011 20:53:45 +0200
parents 2e913a89e69d
children bf7d511d3650
line wrap: on
line source

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

import engine
import level
import physics
import sprites.player
import pygame
from pygame.locals import KEYDOWN, K_UP, K_DOWN, K_LEFT, K_RIGHT, K_x, K_z, \
                          K_q, K_ESCAPE

class LevelScene(engine.Scene):

    KEY_TO_PLAYER_ACTION = {
        K_LEFT: 'action_left',
        K_RIGHT: 'action_right',
        K_UP: 'action_up',
        K_DOWN: 'action_down',
        K_x: 'action_fire1',
        K_z: 'action_fire2',
    }

    def __init__(self, leveldef, player=None):
        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._pos = (0, 0)
        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)

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

    def _build_action_map(self):
        self._key_map = {}
        for key, action in self.KEY_TO_PLAYER_ACTION.items():
            self._key_map[key] = getattr(self._player, action)
        for key in [K_q, K_ESCAPE]:
            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):
        self._world.update()

        clip_rect = pygame.Rect(self._pos, screen_surface.get_size())
        self._level_surface.set_clip(clip_rect)

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

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

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