source: nagslang/engine.py@ 252:73d6abf5ba22

Last change on this file since 252:73d6abf5ba22 was 252:73d6abf5ba22, checked in by Stefano Rivera <stefano@…>, 8 years ago

Save game state

File size: 2.2 KB
RevLine 
[15]1"""Top-level event dispatching and area transition."""
2
[18]3import pygame
[85]4import pygame.locals as pgl
[15]5
6from nagslang import constants
[18]7from nagslang.screens.menu import MenuScreen
[20]8from nagslang.screens.area import AreaScreen
9from nagslang.events import ScreenChange
[238]10from nagslang.world import World
[15]11
12
13class Engine(object):
[18]14 def __init__(self, surface):
15 self._surface = surface
16 self._clock = pygame.time.Clock()
[15]17 self._fps = constants.FPS
[41]18 self._dt = 1. / self._fps
[238]19 self._world = World()
[20]20 self._current_screen = None
21 self._screens = {
22 'menu': MenuScreen,
23 'level1': AreaScreen,
[175]24 'level2': AreaScreen,
[20]25 }
[252]26 self._world.load()
[180]27 self.change_screen('menu', None)
[142]28 # Dummy resize event, to force us to realise our real size
29 # http://stackoverflow.com/q/16442573/8629
30 pygame.event.post(pygame.event.Event(pgl.VIDEORESIZE,
31 size=(0, 0), w=0, h=0))
[20]32
[180]33 def change_screen(self, new_screen, player):
[20]34 if self._current_screen is not None:
35 self._current_screen.teardown()
[37]36 screen_cls = self._screens[new_screen]
[180]37 self._current_screen = screen_cls(new_screen, player, self._world)
[37]38 self._current_screen.setup()
[15]39
40 def run(self):
41 running = True
42 while running:
[18]43 for ev in pygame.event.get():
[85]44 if ev.type == pgl.QUIT:
[15]45 running = False
[85]46 elif ev.type == pgl.VIDEORESIZE:
47 pygame.display.set_mode(ev.size,
[128]48 pgl.SWSURFACE | pgl.RESIZABLE)
[85]49 self._surface = pygame.display.get_surface()
[20]50 elif ScreenChange.matches(ev):
[252]51 self._world.save()
[128]52 self._surface.fill(pygame.color.Color(0, 0, 0))
[180]53 self.change_screen(ev.screen, ev.player)
[18]54 else:
[20]55 self._current_screen.handle_event(ev)
[41]56 self._current_screen.tick(self._dt)
[20]57 self._current_screen.render(self._surface)
[18]58 pygame.display.flip()
[41]59 self._clock.tick(self._fps)
Note: See TracBrowser for help on using the repository browser.