changeset 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 f20262b41cbf
files gamelib/endscreen.py gamelib/main.py gamelib/menu.py pyntnclick/engine.py pyntnclick/main.py pyntnclick/state.py
diffstat 6 files changed, 40 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- 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))
--- 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():
--- 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
--- 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)
--- 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
--- 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