view nagslang/engine.py @ 141:076448ba0582

Add a trailing newline
author Stefano Rivera <stefano@rivera.za.net>
date Mon, 02 Sep 2013 19:04:36 +0200
parents fbb073720bac
children cd77974b2a87
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.events import ScreenChange


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 = None  # TODO: create the world
        self._current_screen = None
        self._screens = {
            'menu': MenuScreen,
            'level1': AreaScreen,
        }
        self.change_screen('menu')

    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._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)