annotate skaapsteker/engine.py @ 79:fe8652a060df

Simple menu screen and TextChoice widget
author Stefano Rivera <stefano@rivera.za.net>
date Mon, 04 Apr 2011 00:46:13 +0200
parents fb1bd081cc86
children 592477d8b09b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
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
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
12 self._current_scene = None
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
13
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
14 def change_scene(self, next_scene):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
15 if self._current_scene is not None:
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
16 self._current_scene.leave()
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
17 self._current_scene = next_scene
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
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
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
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
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
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
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
30 if ChangeScene.matches(ev):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
31 self.change_scene(ev.next_scene)
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
32 break
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
33 self._current_scene.dispatch(ev)
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
34 self._current_scene.draw(surface)
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
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
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
37
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
38
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
39 class Scene(object):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
40
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
41 def __init__(self):
79
fe8652a060df Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents: 14
diff changeset
42 self.widgets = []
14
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
43
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
44 def post(self, ev):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
45 """Post an event to pygame's event loop."""
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
46 pygame.event.post(ev)
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
47
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
48 def enter(self):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
49 """Enter the scene."""
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
50 pass
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
51
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
52 def leave(self):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
53 """Exit the scene."""
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
54 pass
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
55
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
56 def dispatch(self, ev):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
57 """Dispatch an event."""
79
fe8652a060df Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents: 14
diff changeset
58 for widget in self.widgets:
fe8652a060df Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents: 14
diff changeset
59 widget.dispatch(ev)
14
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
60
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
61 def draw(self, surface):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
62 """Update the scene surface."""
79
fe8652a060df Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents: 14
diff changeset
63 for widget in self.widgets:
fe8652a060df Simple menu screen and TextChoice widget
Stefano Rivera <stefano@rivera.za.net>
parents: 14
diff changeset
64 widget.draw(surface)
14
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
65
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
66
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
67 class UserEvent(object):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
68
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
69 utype = "UNKNOWN"
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
70
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
71 @classmethod
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
72 def post(cls, **kws):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
73 ev = pygame.event.Event(USEREVENT, utype=cls.utype, **kws)
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
74 pygame.event.post(ev)
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
75
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
76 @classmethod
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
77 def matches(cls, ev):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
78 return ev.type is USEREVENT and ev.utype == cls.utype
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
79
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
80 class ChangeScene(UserEvent):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
81
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
82 utype = "CHANGE_SCENE"
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
83
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
84 @classmethod
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
85 def post(cls, next_scene):
fb1bd081cc86 Add scene changing.
Simon Cross <hodgestar@gmail.com>
parents: 11
diff changeset
86 super(ChangeScene, cls).post(next_scene=next_scene)