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)