Mercurial > nagslang
view nagslang/engine.py @ 252:73d6abf5ba22
Save game state
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Wed, 04 Sep 2013 23:53:34 +0200 |
parents | 28d906fc2ab1 |
children | 3153196517fc |
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 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, 'level1': AreaScreen, 'level2': AreaScreen, } self._world.load() self.change_screen('menu', None) # 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, player): if self._current_screen is not None: self._current_screen.teardown() screen_cls = self._screens[new_screen] self._current_screen = screen_cls(new_screen, player, 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, ev.player) 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)