Mercurial > boomslang
comparison pyntnclick/engine.py @ 608:a25cd1c6335a pyntnclick
Pass screens through engine by name
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Sat, 11 Feb 2012 20:57:28 +0200 |
parents | f2b1ddcc4986 |
children | cfc16ded7b34 |
comparison
equal
deleted
inserted
replaced
607:f2b1ddcc4986 | 608:a25cd1c6335a |
---|---|
9 | 9 |
10 class Engine(object): | 10 class Engine(object): |
11 def __init__(self, game_description): | 11 def __init__(self, game_description): |
12 self._screen = None | 12 self._screen = None |
13 self._game_description = game_description | 13 self._game_description = game_description |
14 self.screens = {} | |
14 | 15 |
15 def set_screen(self, screen): | 16 def set_screen(self, screen_name): |
16 if self._screen is not None: | 17 if self._screen is not None: |
17 self._screen.on_exit() | 18 self._screen.on_exit() |
18 self._screen = screen | 19 self._screen = self.screens.get(screen_name, None) |
19 if self._screen is not None: | 20 if self._screen is not None: |
20 self._screen.on_enter() | 21 self._screen.on_enter() |
22 | |
23 def add_screen(self, name, screen): | |
24 self.screens[name] = screen | |
21 | 25 |
22 def run(self): | 26 def run(self): |
23 """Game loop.""" | 27 """Game loop.""" |
24 | 28 |
25 get_events = pygame.event.get | 29 get_events = pygame.event.get |
29 events = get_events() | 33 events = get_events() |
30 for ev in events: | 34 for ev in events: |
31 if ev.type == QUIT: | 35 if ev.type == QUIT: |
32 return | 36 return |
33 elif ScreenChangeEvent.matches(ev): | 37 elif ScreenChangeEvent.matches(ev): |
34 self.set_screen(ev.screen) | 38 self.set_screen(ev.screen_name) |
35 else: | 39 else: |
36 self._screen.dispatch(ev) | 40 self._screen.dispatch(ev) |
37 surface = pygame.display.get_surface() | 41 surface = pygame.display.get_surface() |
38 self._screen.draw(surface) | 42 self._screen.draw(surface) |
39 flip() | 43 flip() |
85 def display_dialog(self, dialog): | 89 def display_dialog(self, dialog): |
86 self.container.paused = True | 90 self.container.paused = True |
87 self.container.add(dialog) | 91 self.container.add(dialog) |
88 dialog.grab_focus() | 92 dialog.grab_focus() |
89 | 93 |
90 def change_screen(self, new_screen): | 94 def change_screen(self, new_screen_name): |
91 ScreenChangeEvent.post(new_screen) | 95 ScreenChangeEvent.post(new_screen_name) |
92 | 96 |
93 | 97 |
94 class UserEvent(object): | 98 class UserEvent(object): |
95 """A user event type allowing subclassing, | 99 """A user event type allowing subclassing, |
96 to provide an infinate number of user-defined events | 100 to provide an infinate number of user-defined events |
111 class ScreenChangeEvent(UserEvent): | 115 class ScreenChangeEvent(UserEvent): |
112 | 116 |
113 TYPE = "SCREEN_CHANGE" | 117 TYPE = "SCREEN_CHANGE" |
114 | 118 |
115 @classmethod | 119 @classmethod |
116 def post(cls, screen): | 120 def post(cls, screen_name): |
117 super(ScreenChangeEvent, cls).post(screen=screen) | 121 super(ScreenChangeEvent, cls).post(screen_name=screen_name) |