[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
|
---|
[15] | 10 |
|
---|
| 11 |
|
---|
| 12 | class Engine(object):
|
---|
[18] | 13 | def __init__(self, surface):
|
---|
| 14 | self._surface = surface
|
---|
| 15 | self._clock = pygame.time.Clock()
|
---|
[15] | 16 | self._fps = constants.FPS
|
---|
[41] | 17 | self._dt = 1. / self._fps
|
---|
[20] | 18 | self._world = None # TODO: create the world
|
---|
| 19 | self._current_screen = None
|
---|
| 20 | self._screens = {
|
---|
| 21 | 'menu': MenuScreen,
|
---|
| 22 | 'level1': AreaScreen,
|
---|
[175] | 23 | 'level2': AreaScreen,
|
---|
[20] | 24 | }
|
---|
[180] | 25 | self.change_screen('menu', None)
|
---|
[142] | 26 | # Dummy resize event, to force us to realise our real size
|
---|
| 27 | # http://stackoverflow.com/q/16442573/8629
|
---|
| 28 | pygame.event.post(pygame.event.Event(pgl.VIDEORESIZE,
|
---|
| 29 | size=(0, 0), w=0, h=0))
|
---|
[20] | 30 |
|
---|
[180] | 31 | def change_screen(self, new_screen, player):
|
---|
[20] | 32 | if self._current_screen is not None:
|
---|
| 33 | self._current_screen.teardown()
|
---|
[37] | 34 | screen_cls = self._screens[new_screen]
|
---|
[180] | 35 | self._current_screen = screen_cls(new_screen, player, self._world)
|
---|
[37] | 36 | self._current_screen.setup()
|
---|
[15] | 37 |
|
---|
| 38 | def run(self):
|
---|
| 39 | running = True
|
---|
| 40 | while running:
|
---|
[18] | 41 | for ev in pygame.event.get():
|
---|
[85] | 42 | if ev.type == pgl.QUIT:
|
---|
[15] | 43 | running = False
|
---|
[85] | 44 | elif ev.type == pgl.VIDEORESIZE:
|
---|
| 45 | pygame.display.set_mode(ev.size,
|
---|
[128] | 46 | pgl.SWSURFACE | pgl.RESIZABLE)
|
---|
[85] | 47 | self._surface = pygame.display.get_surface()
|
---|
[20] | 48 | elif ScreenChange.matches(ev):
|
---|
[128] | 49 | self._surface.fill(pygame.color.Color(0, 0, 0))
|
---|
[180] | 50 | self.change_screen(ev.screen, ev.player)
|
---|
[18] | 51 | else:
|
---|
[20] | 52 | self._current_screen.handle_event(ev)
|
---|
[41] | 53 | self._current_screen.tick(self._dt)
|
---|
[20] | 54 | self._current_screen.render(self._surface)
|
---|
[18] | 55 | pygame.display.flip()
|
---|
[41] | 56 | self._clock.tick(self._fps)
|
---|