# HG changeset patch # User Neil Muller # Date 1328986648 -7200 # Node ID a25cd1c6335a4bc7a5502bd1ac3527904b471adc # Parent f2b1ddcc498667611aa20bf3140a7f62baa1e979 Pass screens through engine by name diff -r f2b1ddcc4986 -r a25cd1c6335a gamelib/endscreen.py --- a/gamelib/endscreen.py Sat Feb 11 20:34:23 2012 +0200 +++ b/gamelib/endscreen.py Sat Feb 11 20:57:28 2012 +0200 @@ -24,8 +24,7 @@ self.surface.blit(self._background, self.surface.get_rect()) def main_menu(self, ev, widget): - from gamelib.menu import MenuScreen - self.change_screen(MenuScreen(self.game_description)) + self.change_screen('menu') def quit(self, ev, widget): pygame.event.post(pygame.event.Event(QUIT)) diff -r f2b1ddcc4986 -r a25cd1c6335a gamelib/main.py --- a/gamelib/main.py Sat Feb 11 20:34:23 2012 +0200 +++ b/gamelib/main.py Sat Feb 11 20:57:28 2012 +0200 @@ -10,8 +10,11 @@ INITIAL_SCENE = scenes.INITIAL_SCENE SCENE_LIST = scenes.SCENE_LIST - MENU_SCREEN = MenuScreen - END_SCREEN = EndScreen + SPECIAL_SCENES = { + 'menu': MenuScreen, + 'end': EndScreen, + } + START_SCREEN = 'menu' def main(): diff -r f2b1ddcc4986 -r a25cd1c6335a gamelib/menu.py --- a/gamelib/menu.py Sat Feb 11 20:34:23 2012 +0200 +++ b/gamelib/menu.py Sat Feb 11 20:57:28 2012 +0200 @@ -27,8 +27,7 @@ self.surface.blit(self._background, self.surface.get_rect()) def start(self, ev, widget): - from gamelib.endscreen import EndScreen - self.change_screen(EndScreen(self.game_description)) + self.change_screen('end') def check_running(self): return self.shell.game_screen.running diff -r f2b1ddcc4986 -r a25cd1c6335a pyntnclick/engine.py --- a/pyntnclick/engine.py Sat Feb 11 20:34:23 2012 +0200 +++ b/pyntnclick/engine.py Sat Feb 11 20:57:28 2012 +0200 @@ -11,14 +11,18 @@ def __init__(self, game_description): self._screen = None self._game_description = game_description + self.screens = {} - def set_screen(self, screen): + def set_screen(self, screen_name): if self._screen is not None: self._screen.on_exit() - self._screen = screen + self._screen = self.screens.get(screen_name, None) if self._screen is not None: self._screen.on_enter() + def add_screen(self, name, screen): + self.screens[name] = screen + def run(self): """Game loop.""" @@ -31,7 +35,7 @@ if ev.type == QUIT: return elif ScreenChangeEvent.matches(ev): - self.set_screen(ev.screen) + self.set_screen(ev.screen_name) else: self._screen.dispatch(ev) surface = pygame.display.get_surface() @@ -87,8 +91,8 @@ self.container.add(dialog) dialog.grab_focus() - def change_screen(self, new_screen): - ScreenChangeEvent.post(new_screen) + def change_screen(self, new_screen_name): + ScreenChangeEvent.post(new_screen_name) class UserEvent(object): @@ -113,5 +117,5 @@ TYPE = "SCREEN_CHANGE" @classmethod - def post(cls, screen): - super(ScreenChangeEvent, cls).post(screen=screen) + def post(cls, screen_name): + super(ScreenChangeEvent, cls).post(screen_name=screen_name) diff -r f2b1ddcc4986 -r a25cd1c6335a pyntnclick/main.py --- a/pyntnclick/main.py Sat Feb 11 20:34:23 2012 +0200 +++ b/pyntnclick/main.py Sat Feb 11 20:57:28 2012 +0200 @@ -40,11 +40,12 @@ SCENE_LIST = None # starting menu - MENU_SCREEN = DefMenuScreen + SPECIAL_SCREENS = { + 'menu': DefMenuScreen, + 'end': DefEndScreen, + } - # game over screen - END_SCREEN = DefEndScreen - + START_SCREEN = 'menu' # resource module RESOURCE_MODULE = "Resources" @@ -69,7 +70,7 @@ initial_state = state.Game(self) initial_state.set_debug_rects(self._debug_rects) for scene in self._scene_list: - initial_state.load_scenes(scene) + initial_state.load_scenes(scene, self.engine) initial_state.set_current_scene(self._initial_scene) initial_state.set_do_enter_leave() return initial_state @@ -137,8 +138,9 @@ print 'Need to supply a scene to use the rect drawer' sys.exit(1) display = make_rect_display() + # FIXME: Remove Albow from here try: - engine = RectApp(display, self.initial_state, opts.scene, + self.engine = RectApp(display, self.initial_state, opts.scene, opts.detail) except KeyError: print 'Invalid scene: %s' % opts.scene @@ -149,10 +151,14 @@ 'suspended_sentence24x24.png', basedir='icons')) pygame.display.set_caption("Suspended Sentence") - engine = Engine(self) + self.engine = Engine(self) + # Initialize the special screens in the engine + for name, cls in self.SPECIAL_SCENES.iteritems(): + screen = cls(self) + self.engine.add_screen(name, screen) # Should we allow the menu not to be the opening screen? - engine.set_screen(self.MENU_SCREEN(self)) + self.engine.set_screen(self.START_SCREEN) try: - engine.run() + self.engine.run() except KeyboardInterrupt: pass diff -r f2b1ddcc4986 -r a25cd1c6335a pyntnclick/state.py --- a/pyntnclick/state.py Sat Feb 11 20:34:23 2012 +0200 +++ b/pyntnclick/state.py Sat Feb 11 20:57:28 2012 +0200 @@ -105,13 +105,17 @@ item.set_game(self) self.items[item.name] = item - def load_scenes(self, modname): + def load_scenes(self, modname, engine): mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname]) for scene_cls in mod.SCENES: - self.add_scene(scene_cls(self)) + scene = scene_cls(self) + self.add_scene(scene) + engine.add_screen(scene.name, scene) if hasattr(mod, 'DETAIL_VIEWS'): for scene_cls in mod.DETAIL_VIEWS: - self.add_detail_view(scene_cls(self)) + scene = scene_cls(self) + self.add_detail_view(scene) + engine.add_screen(scene.name, scene) def set_current_scene(self, name): old_scene = self.current_scene