annotate nagslang/engine.py @ 647:aeb366d97774

Show splash image on startup
author Stefano Rivera <stefano@rivera.za.net>
date Sun, 08 Sep 2013 02:02:09 +0200
parents 80c452f348dc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Top-level event dispatching and area transition."""
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
3 import pygame
85
c56eeaabd850 Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents: 41
diff changeset
4 import pygame.locals as pgl
15
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
5
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
6 from nagslang import constants
448
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
7 from nagslang.options import options
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
8 from nagslang.screens.area import AreaScreen
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
9 from nagslang.events import ScreenChange
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
10 from nagslang.world import World
437
d087dfb10896 Replace menu and death screen with the starting level
Stefano Rivera <stefano@rivera.za.net>
parents: 399
diff changeset
11 from nagslang.level import Level
15
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
12
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
13
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
14 class Engine(object):
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
15 def __init__(self, surface):
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
16 self._surface = surface
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
17 self._clock = pygame.time.Clock()
15
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
18 self._fps = constants.FPS
41
1d087f79ca29 Use fixed timestemp because pymunk docs say this is an order of magnitude more efficient.
Simon Cross <hodgestar@gmail.com>
parents: 37
diff changeset
19 self._dt = 1. / self._fps
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
20 self._world = World()
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
21 self._current_screen = None
437
d087dfb10896 Replace menu and death screen with the starting level
Stefano Rivera <stefano@rivera.za.net>
parents: 399
diff changeset
22
d087dfb10896 Replace menu and death screen with the starting level
Stefano Rivera <stefano@rivera.za.net>
parents: 399
diff changeset
23 self._screens = {}
322
a4e93b1086b8 Load all levels.
Simon Cross <hodgestar@gmail.com>
parents: 285
diff changeset
24 for area_name in AreaScreen.list_areas():
a4e93b1086b8 Load all levels.
Simon Cross <hodgestar@gmail.com>
parents: 285
diff changeset
25 self._screens[area_name] = AreaScreen
437
d087dfb10896 Replace menu and death screen with the starting level
Stefano Rivera <stefano@rivera.za.net>
parents: 399
diff changeset
26 starting_area = Level.game_starting_point()[0]
d087dfb10896 Replace menu and death screen with the starting level
Stefano Rivera <stefano@rivera.za.net>
parents: 399
diff changeset
27
448
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
28 if options.point:
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
29 x, y = options.point.split(',')
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
30 point = (int(x), int(y))
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
31 self._world.protagonist.set_position(point)
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
32 if options.area:
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
33 self.change_screen(options.area)
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
34 else:
044b53eb22df DEBUG: Command line starting area and point
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
35 self.change_screen(starting_area)
142
cd77974b2a87 Send a fake resize event, to discover the real window size under a tiling window manager
Stefano Rivera <stefano@rivera.za.net>
parents: 128
diff changeset
36 # Dummy resize event, to force us to realise our real size
cd77974b2a87 Send a fake resize event, to discover the real window size under a tiling window manager
Stefano Rivera <stefano@rivera.za.net>
parents: 128
diff changeset
37 # http://stackoverflow.com/q/16442573/8629
cd77974b2a87 Send a fake resize event, to discover the real window size under a tiling window manager
Stefano Rivera <stefano@rivera.za.net>
parents: 128
diff changeset
38 pygame.event.post(pygame.event.Event(pgl.VIDEORESIZE,
cd77974b2a87 Send a fake resize event, to discover the real window size under a tiling window manager
Stefano Rivera <stefano@rivera.za.net>
parents: 128
diff changeset
39 size=(0, 0), w=0, h=0))
647
aeb366d97774 Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents: 505
diff changeset
40 self._current_screen.splash()
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
41
276
3153196517fc Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents: 252
diff changeset
42 def change_screen(self, new_screen):
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
43 if self._current_screen is not None:
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
44 self._current_screen.teardown()
37
4140780c21bc Give screens a name and a world.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
45 screen_cls = self._screens[new_screen]
276
3153196517fc Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents: 252
diff changeset
46 self._current_screen = screen_cls(new_screen, self._world)
37
4140780c21bc Give screens a name and a world.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
47 self._current_screen.setup()
15
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
48
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
49 def run(self):
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
50 running = True
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
51 while running:
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
52 for ev in pygame.event.get():
85
c56eeaabd850 Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents: 41
diff changeset
53 if ev.type == pgl.QUIT:
15
980339c28b42 Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
54 running = False
85
c56eeaabd850 Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents: 41
diff changeset
55 elif ev.type == pgl.VIDEORESIZE:
c56eeaabd850 Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents: 41
diff changeset
56 pygame.display.set_mode(ev.size,
128
fbb073720bac Fill screen with black on scene changes, so small levels aren't surrounded by old cruft
Neil Muller <drnlmuller@gmail.com>
parents: 85
diff changeset
57 pgl.SWSURFACE | pgl.RESIZABLE)
85
c56eeaabd850 Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents: 41
diff changeset
58 self._surface = pygame.display.get_surface()
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
59 elif ScreenChange.matches(ev):
128
fbb073720bac Fill screen with black on scene changes, so small levels aren't surrounded by old cruft
Neil Muller <drnlmuller@gmail.com>
parents: 85
diff changeset
60 self._surface.fill(pygame.color.Color(0, 0, 0))
276
3153196517fc Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents: 252
diff changeset
61 self.change_screen(ev.screen)
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
62 else:
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
63 self._current_screen.handle_event(ev)
41
1d087f79ca29 Use fixed timestemp because pymunk docs say this is an order of magnitude more efficient.
Simon Cross <hodgestar@gmail.com>
parents: 37
diff changeset
64 self._current_screen.tick(self._dt)
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
65 self._current_screen.render(self._surface)
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
66 pygame.display.flip()
41
1d087f79ca29 Use fixed timestemp because pymunk docs say this is an order of magnitude more efficient.
Simon Cross <hodgestar@gmail.com>
parents: 37
diff changeset
67 self._clock.tick(self._fps)