view nagslang/engine.py @ 359:d42752ab3231

Refactor doors and add horrible temporoary image for someone to fix later.
author Jeremy Thurgood <firxen@gmail.com>
date Fri, 06 Sep 2013 19:42:01 +0200
parents a4e93b1086b8
children a7d48819a711
line wrap: on
line source

"""Top-level event dispatching and area transition."""

import pygame
import pygame.locals as pgl

from nagslang import constants
from nagslang.screens.menu import MenuScreen
from nagslang.screens.area import AreaScreen
from nagslang.screens.playerdied import PlayerDiedScreen
from nagslang.events import ScreenChange
from nagslang.world import World


class Engine(object):
    def __init__(self, surface):
        self._surface = surface
        self._clock = pygame.time.Clock()
        self._fps = constants.FPS
        self._dt = 1. / self._fps
        self._world = World()
        self._current_screen = None
        self._screens = {
            'menu': MenuScreen,
            'dead': PlayerDiedScreen,
        }
        for area_name in AreaScreen.list_areas():
            self._screens[area_name] = AreaScreen
        self._world.load()
        self.change_screen('menu')
        # Dummy resize event, to force us to realise our real size
        # http://stackoverflow.com/q/16442573/8629
        pygame.event.post(pygame.event.Event(pgl.VIDEORESIZE,
                                             size=(0, 0), w=0, h=0))

    def change_screen(self, new_screen):
        if self._current_screen is not None:
            self._current_screen.teardown()
        screen_cls = self._screens[new_screen]
        self._current_screen = screen_cls(new_screen, self._world)
        self._current_screen.setup()

    def run(self):
        running = True
        while running:
            for ev in pygame.event.get():
                if ev.type == pgl.QUIT:
                    running = False
                elif ev.type == pgl.VIDEORESIZE:
                    pygame.display.set_mode(ev.size,
                                            pgl.SWSURFACE | pgl.RESIZABLE)
                    self._surface = pygame.display.get_surface()
                elif ScreenChange.matches(ev):
                    self._world.save()
                    self._surface.fill(pygame.color.Color(0, 0, 0))
                    self.change_screen(ev.screen)
                else:
                    self._current_screen.handle_event(ev)
            self._current_screen.tick(self._dt)
            self._current_screen.render(self._surface)
            pygame.display.flip()
            self._clock.tick(self._fps)