diff nagslang/screens/area.py @ 180:026297a03963

Add DoorEvent and tweak ScreenChange to keep more state when the player goes through a door
author Neil Muller <drnlmuller@gmail.com>
date Tue, 03 Sep 2013 16:58:45 +0200
parents 7d8e1682587f
children 3894cfe15823
line wrap: on
line diff
--- a/nagslang/screens/area.py	Tue Sep 03 16:57:09 2013 +0200
+++ b/nagslang/screens/area.py	Tue Sep 03 16:58:45 2013 +0200
@@ -4,7 +4,7 @@
 import pymunk
 import pymunk.pygame_util
 
-from nagslang.events import ScreenChange
+from nagslang.events import ScreenChange, DoorEvent
 from nagslang.level import Level
 from nagslang.protagonist import Protagonist
 from nagslang.screens.base import Screen
@@ -68,7 +68,14 @@
         self._level.load(self.space)
         self._drawables = Drawables()
         self.add_walls()
-        self.add_protagonist()
+        if self.protagonist is not None:
+            # We do things this way to avoid extra pymunk
+            # juggling to move objects between spaces
+            old_protagonist = self.protagonist
+            self.add_protagonist()
+            self.protagonist.copy_state(old_protagonist)
+        else:
+            self.add_protagonist()
         self.add_game_objects()
 
     def add_walls(self):
@@ -100,6 +107,13 @@
                 ScreenChange.post('menu')
             if ev.key == pygame.locals.K_c:
                 self.protagonist.toggle_form()
+        elif DoorEvent.matches(ev):
+            self.protagonist.set_position(ev.dest_pos)
+            if ev.destination != self.name:
+                # Go to anther screen
+                ScreenChange.post(ev.destination, self.protagonist)
+            # else we're teleporting within the screen, and just the
+            # position change is enough
         self.keys.handle_event(ev)
 
     def _calc_viewport(self, level_surface, display_surface):