Mercurial > nagslang
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 |
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 | 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 | 8 from nagslang.screens.area import AreaScreen |
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 | 15 def __init__(self, surface): |
16 self._surface = surface | |
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 | 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 | 24 for area_name in AreaScreen.list_areas(): |
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 | 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 | 43 if self._current_screen is not None: |
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 | 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 | 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 | 62 else: |
20 | 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 | 65 self._current_screen.render(self._surface) |
18 | 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) |