Mercurial > skaapsteker
annotate skaapsteker/engine.py @ 14:fb1bd081cc86
Add scene changing.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Sun, 03 Apr 2011 16:35:18 +0200 |
parents | 249814efa91b |
children | fe8652a060df |
rev | line source |
---|---|
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
1 """Top-level engine for switching scenes.""" |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
2 |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
3 import pygame.display |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
4 import pygame.time |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
5 import pygame.event |
14 | 6 from pygame.locals import QUIT, USEREVENT |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
7 |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
8 class Engine(object): |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
9 |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
10 def __init__(self): |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
11 self._framerate = 60 |
14 | 12 self._current_scene = None |
13 | |
14 def change_scene(self, next_scene): | |
15 if self._current_scene is not None: | |
16 self._current_scene.leave() | |
17 self._current_scene = next_scene | |
18 self._current_scene.enter() | |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
19 |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
20 def run(self): |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
21 """Run the game loop dispatching events as necessary.""" |
14 | 22 assert self._current_scene is not None |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
23 clock = pygame.time.Clock() |
14 | 24 surface = pygame.display.get_surface() |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
25 while True: |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
26 events = pygame.event.get() |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
27 for ev in events: |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
28 if ev.type is QUIT: |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
29 return |
14 | 30 if ChangeScene.matches(ev): |
31 self.change_scene(ev.next_scene) | |
32 break | |
33 self._current_scene.dispatch(ev) | |
34 self._current_scene.draw(surface) | |
35 pygame.display.flip() | |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
36 clock.tick(self._framerate) |
14 | 37 |
38 | |
39 class Scene(object): | |
40 | |
41 def __init__(self): | |
42 pass | |
43 | |
44 def post(self, ev): | |
45 """Post an event to pygame's event loop.""" | |
46 pygame.event.post(ev) | |
47 | |
48 def enter(self): | |
49 """Enter the scene.""" | |
50 pass | |
51 | |
52 def leave(self): | |
53 """Exit the scene.""" | |
54 pass | |
55 | |
56 def dispatch(self, ev): | |
57 """Dispatch an event.""" | |
58 pass | |
59 | |
60 def draw(self, surface): | |
61 """Update the scene surface.""" | |
62 pass | |
63 | |
64 | |
65 class UserEvent(object): | |
66 | |
67 utype = "UNKNOWN" | |
68 | |
69 @classmethod | |
70 def post(cls, **kws): | |
71 ev = pygame.event.Event(USEREVENT, utype=cls.utype, **kws) | |
72 pygame.event.post(ev) | |
73 | |
74 @classmethod | |
75 def matches(cls, ev): | |
76 return ev.type is USEREVENT and ev.utype == cls.utype | |
77 | |
78 class ChangeScene(UserEvent): | |
79 | |
80 utype = "CHANGE_SCENE" | |
81 | |
82 @classmethod | |
83 def post(cls, next_scene): | |
84 super(ChangeScene, cls).post(next_scene=next_scene) |