[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,
|
---|
| 23 | }
|
---|
| 24 | self.change_screen('menu')
|
---|
| 25 |
|
---|
| 26 | def change_screen(self, new_screen):
|
---|
| 27 | if self._current_screen is not None:
|
---|
| 28 | self._current_screen.teardown()
|
---|
[37] | 29 | screen_cls = self._screens[new_screen]
|
---|
| 30 | self._current_screen = screen_cls(new_screen, self._world)
|
---|
| 31 | self._current_screen.setup()
|
---|
[15] | 32 |
|
---|
| 33 | def run(self):
|
---|
| 34 | running = True
|
---|
| 35 | while running:
|
---|
[18] | 36 | for ev in pygame.event.get():
|
---|
[85] | 37 | if ev.type == pgl.QUIT:
|
---|
[15] | 38 | running = False
|
---|
[85] | 39 | elif ev.type == pgl.VIDEORESIZE:
|
---|
| 40 | pygame.display.set_mode(ev.size,
|
---|
| 41 | pgl.SWSURFACE | pgl.RESIZABLE)
|
---|
| 42 | self._surface = pygame.display.get_surface()
|
---|
[20] | 43 | elif ScreenChange.matches(ev):
|
---|
| 44 | self.change_screen(ev.screen)
|
---|
[18] | 45 | else:
|
---|
[20] | 46 | self._current_screen.handle_event(ev)
|
---|
[41] | 47 | self._current_screen.tick(self._dt)
|
---|
[20] | 48 | self._current_screen.render(self._surface)
|
---|
[18] | 49 | pygame.display.flip()
|
---|
[41] | 50 | self._clock.tick(self._fps)
|
---|