Mercurial > nagslang
view nagslang/engine.py @ 322:a4e93b1086b8
Load all levels.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Fri, 06 Sep 2013 02:03:53 +0200 |
parents | ef4f6375c0b5 |
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)