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