Mercurial > skaapsteker
annotate skaapsteker/engine.py @ 134:4713a2a3b0be
Initial cutscene screen
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Tue, 05 Apr 2011 00:06:07 +0200 |
parents | aca8b7456c72 |
children | 8d45715c587d |
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 |
127
e1dd3b785269
Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
126
diff
changeset
|
8 from skaapsteker.gamestate import GameState |
e1dd3b785269
Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
126
diff
changeset
|
9 |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
10 class Engine(object): |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
11 |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
12 def __init__(self): |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
13 self._framerate = 60 |
14 | 14 self._current_scene = None |
123 | 15 self._fpss = [self._framerate] * 100 |
16 self._cur_frame = 0 | |
127
e1dd3b785269
Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
126
diff
changeset
|
17 self.game_state = GameState() |
14 | 18 |
19 def change_scene(self, next_scene): | |
20 if self._current_scene is not None: | |
21 self._current_scene.leave() | |
22 self._current_scene = next_scene | |
23 self._current_scene.enter() | |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
24 |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
25 def run(self): |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
26 """Run the game loop dispatching events as necessary.""" |
14 | 27 assert self._current_scene is not None |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
28 clock = pygame.time.Clock() |
14 | 29 surface = pygame.display.get_surface() |
11
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
30 while True: |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
31 events = pygame.event.get() |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
32 for ev in events: |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
33 if ev.type is QUIT: |
249814efa91b
Create game engine. Enable quitting.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
34 return |
14 | 35 if ChangeScene.matches(ev): |
36 self.change_scene(ev.next_scene) | |
37 break | |
38 self._current_scene.dispatch(ev) | |
123 | 39 self._current_scene.draw(surface, self) |
14 | 40 pygame.display.flip() |
126
9cae256b91d7
Fix bug in FPS calculation. Phew -- we're still fast.
Simon Cross <hodgestar@gmail.com>
parents:
123
diff
changeset
|
41 self._fpss[self._cur_frame] = 1000.0 / clock.tick(self._framerate) |
123 | 42 self._cur_frame = self._cur_frame + 1 if self._cur_frame < 99 else 0 |
43 | |
44 def get_fps(self): | |
45 return sum(self._fpss) / 100 | |
14 | 46 |
47 | |
48 class Scene(object): | |
49 | |
127
e1dd3b785269
Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
126
diff
changeset
|
50 def __init__(self, game_state): |
79
fe8652a060df
Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents:
14
diff
changeset
|
51 self.widgets = [] |
127
e1dd3b785269
Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
126
diff
changeset
|
52 self._game_state = game_state |
14 | 53 |
54 def post(self, ev): | |
55 """Post an event to pygame's event loop.""" | |
56 pygame.event.post(ev) | |
57 | |
58 def enter(self): | |
59 """Enter the scene.""" | |
60 pass | |
61 | |
62 def leave(self): | |
63 """Exit the scene.""" | |
64 pass | |
65 | |
66 def dispatch(self, ev): | |
67 """Dispatch an event.""" | |
79
fe8652a060df
Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents:
14
diff
changeset
|
68 for widget in self.widgets: |
fe8652a060df
Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents:
14
diff
changeset
|
69 widget.dispatch(ev) |
14 | 70 |
133
aca8b7456c72
Pass engine to all Scene draw() methods
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
71 def draw(self, surface, engine): |
14 | 72 """Update the scene surface.""" |
79
fe8652a060df
Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents:
14
diff
changeset
|
73 for widget in self.widgets: |
fe8652a060df
Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents:
14
diff
changeset
|
74 widget.draw(surface) |
14 | 75 |
76 | |
77 class UserEvent(object): | |
78 | |
79 utype = "UNKNOWN" | |
80 | |
81 @classmethod | |
82 def post(cls, **kws): | |
83 ev = pygame.event.Event(USEREVENT, utype=cls.utype, **kws) | |
84 pygame.event.post(ev) | |
85 | |
86 @classmethod | |
87 def matches(cls, ev): | |
88 return ev.type is USEREVENT and ev.utype == cls.utype | |
89 | |
90 class ChangeScene(UserEvent): | |
91 | |
92 utype = "CHANGE_SCENE" | |
93 | |
94 @classmethod | |
95 def post(cls, next_scene): | |
96 super(ChangeScene, cls).post(next_scene=next_scene) |