Mercurial > nagslang
annotate nagslang/engine.py @ 359:d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Fri, 06 Sep 2013 19:42:01 +0200 |
parents | a4e93b1086b8 |
children | a7d48819a711 |
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 |
18 | 7 from nagslang.screens.menu import MenuScreen |
20 | 8 from nagslang.screens.area import AreaScreen |
285 | 9 from nagslang.screens.playerdied import PlayerDiedScreen |
20 | 10 from nagslang.events import ScreenChange |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
180
diff
changeset
|
11 from nagslang.world import World |
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 |
22 self._screens = { | |
23 'menu': MenuScreen, | |
285 | 24 'dead': PlayerDiedScreen, |
20 | 25 } |
322 | 26 for area_name in AreaScreen.list_areas(): |
27 self._screens[area_name] = AreaScreen | |
252 | 28 self._world.load() |
276
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
252
diff
changeset
|
29 self.change_screen('menu') |
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
|
30 # 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
|
31 # 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
|
32 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
|
33 size=(0, 0), w=0, h=0)) |
20 | 34 |
276
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
252
diff
changeset
|
35 def change_screen(self, new_screen): |
20 | 36 if self._current_screen is not None: |
37 self._current_screen.teardown() | |
37
4140780c21bc
Give screens a name and a world.
Simon Cross <hodgestar@gmail.com>
parents:
25
diff
changeset
|
38 screen_cls = self._screens[new_screen] |
276
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
252
diff
changeset
|
39 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
|
40 self._current_screen.setup() |
15
980339c28b42
Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
41 |
980339c28b42
Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
42 def run(self): |
980339c28b42
Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
43 running = True |
980339c28b42
Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
44 while running: |
18 | 45 for ev in pygame.event.get(): |
85
c56eeaabd850
Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents:
41
diff
changeset
|
46 if ev.type == pgl.QUIT: |
15
980339c28b42
Add start of engine / event dispatcher.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
47 running = False |
85
c56eeaabd850
Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents:
41
diff
changeset
|
48 elif ev.type == pgl.VIDEORESIZE: |
c56eeaabd850
Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents:
41
diff
changeset
|
49 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
|
50 pgl.SWSURFACE | pgl.RESIZABLE) |
85
c56eeaabd850
Make the window resizable
Neil Muller <drnlmuller@gmail.com>
parents:
41
diff
changeset
|
51 self._surface = pygame.display.get_surface() |
20 | 52 elif ScreenChange.matches(ev): |
252 | 53 self._world.save() |
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
|
54 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
|
55 self.change_screen(ev.screen) |
18 | 56 else: |
20 | 57 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
|
58 self._current_screen.tick(self._dt) |
20 | 59 self._current_screen.render(self._surface) |
18 | 60 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
|
61 self._clock.tick(self._fps) |