annotate mamba/engine.py @ 59:3cc917814579

Container subclasses Widget
author Stefano Rivera <stefano@rivera.za.net>
date Sun, 11 Sep 2011 16:33:50 +0200
parents e5f36843f7cd
children fc4b7db1d832
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
1 """Game engine and top-level game loop."""
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
2
38
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
3 from mamba.constants import SCREEN
24
30d4f3e62bcf Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents: 19
diff changeset
4 from mamba.widgets.base import Container
38
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
5
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
6 import pygame.event
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
7 import pygame.display
38
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
8 import pygame
13
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
9 from pygame.locals import QUIT, USEREVENT
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
10
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
11
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
12 class Engine(object):
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
13 def __init__(self):
15
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
14 self._habitat = None
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
15
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
16 def set_habitat(self, habitat):
51
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
17 if self._habitat is not None:
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
18 self._habitat.on_exit()
15
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
19 self._habitat = habitat
51
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
20 if self._habitat is not None:
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
21 self._habitat.on_enter()
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
22
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
23 def run(self):
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
24 """Game loop."""
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
25 get_events = pygame.event.get
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
26 flip = pygame.display.flip
19
6d195a3a4557 Somewhere for levels to live.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
27 surface = pygame.display.get_surface()
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
28 while True:
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
29 events = get_events()
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
30 for ev in events:
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
31 if ev.type is QUIT:
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
32 return
15
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
33 self._habitat.dispatch(ev)
19
6d195a3a4557 Somewhere for levels to live.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
34 self._habitat.draw(surface)
12
0196455fa432 Minimal event loop.
Simon Cross <hodgestar@gmail.com>
parents: 6
diff changeset
35 flip()
13
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
36
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
37
15
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
38 class Habitat(object):
24
30d4f3e62bcf Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents: 19
diff changeset
39
30d4f3e62bcf Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents: 19
diff changeset
40 def __init__(self):
38
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
41 self.surface = pygame.Surface(SCREEN)
59
3cc917814579 Container subclasses Widget
Stefano Rivera <stefano@rivera.za.net>
parents: 51
diff changeset
42 self.container = Container(pygame.Rect((0, 0), SCREEN))
24
30d4f3e62bcf Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents: 19
diff changeset
43
51
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
44 def on_enter(self):
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
45 """Called when this becomes the current habitat."""
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
46 pass
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
47
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
48 def on_exit(self):
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
49 """Called when this stops being the current habitat."""
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
50 pass
e5f36843f7cd Add on_enter and on_exit methods to habitats.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
51
15
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
52 def dispatch(self, ev):
24
30d4f3e62bcf Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents: 19
diff changeset
53 self.container.event(ev)
15
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
54
19
6d195a3a4557 Somewhere for levels to live.
Simon Cross <hodgestar@gmail.com>
parents: 15
diff changeset
55 def draw(self, surface):
38
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
56 self.surface.fill(pygame.Color('black'))
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
57 self.container.draw(self.surface)
047273a63054 Main menu says hello
Stefano Rivera <stefano@rivera.za.net>
parents: 25
diff changeset
58 surface.blit(self.surface, self.surface.get_rect())
15
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
59
ad2bcbf492bf Hook up top-level habitat support.
Simon Cross <hodgestar@gmail.com>
parents: 13
diff changeset
60
13
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
61 class UserEvent(object):
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
62
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
63 utype = "UNKNOWN"
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
64
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
65 @classmethod
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
66 def post(cls, **kws):
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
67 ev = pygame.event.Event(USEREVENT, utype=cls.utype, **kws)
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
68 pygame.event.post(ev)
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
69
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
70 @classmethod
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
71 def matches(cls, ev):
f5846a46e9c5 Add base class for user events.
Simon Cross <hodgestar@gmail.com>
parents: 12
diff changeset
72 return ev.type is USEREVENT and ev.utype == cls.utype