[15] | 1 | """Top-level event dispatching and area transition."""
|
---|
| 2 |
|
---|
[18] | 3 | import pygame
|
---|
[85] | 4 | import pygame.locals as pgl
|
---|
[15] | 5 |
|
---|
| 6 | from nagslang import constants
|
---|
[18] | 7 | from nagslang.screens.menu import MenuScreen
|
---|
[20] | 8 | from nagslang.screens.area import AreaScreen
|
---|
| 9 | from nagslang.events import ScreenChange
|
---|
[238] | 10 | from nagslang.world import World
|
---|
[15] | 11 |
|
---|
| 12 |
|
---|
| 13 | class 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()
|
---|
[276] | 27 | self.change_screen('menu')
|
---|
[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 |
|
---|
[276] | 33 | def change_screen(self, new_screen):
|
---|
[20] | 34 | if self._current_screen is not None:
|
---|
| 35 | self._current_screen.teardown()
|
---|
[37] | 36 | screen_cls = self._screens[new_screen]
|
---|
[276] | 37 | self._current_screen = screen_cls(new_screen, 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))
|
---|
[276] | 53 | self.change_screen(ev.screen)
|
---|
[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)
|
---|