changeset 276:3153196517fc

Move protagonist to the world
author Neil Muller <drnlmuller@gmail.com>
date Thu, 05 Sep 2013 13:09:14 +0200
parents 2abb61878bb1
children 56e42c00da25
files nagslang/engine.py nagslang/events.py nagslang/game_object.py nagslang/protagonist.py nagslang/screens/area.py nagslang/screens/base.py nagslang/screens/menu.py nagslang/world.py
diffstat 8 files changed, 26 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/engine.py	Thu Sep 05 12:04:14 2013 +0200
+++ b/nagslang/engine.py	Thu Sep 05 13:09:14 2013 +0200
@@ -24,17 +24,17 @@
             'level2': AreaScreen,
         }
         self._world.load()
-        self.change_screen('menu', None)
+        self.change_screen('menu')
         # Dummy resize event, to force us to realise our real size
         # http://stackoverflow.com/q/16442573/8629
         pygame.event.post(pygame.event.Event(pgl.VIDEORESIZE,
                                              size=(0, 0), w=0, h=0))
 
-    def change_screen(self, new_screen, player):
+    def change_screen(self, new_screen):
         if self._current_screen is not None:
             self._current_screen.teardown()
         screen_cls = self._screens[new_screen]
-        self._current_screen = screen_cls(new_screen, player, self._world)
+        self._current_screen = screen_cls(new_screen, self._world)
         self._current_screen.setup()
 
     def run(self):
@@ -50,7 +50,7 @@
                 elif ScreenChange.matches(ev):
                     self._world.save()
                     self._surface.fill(pygame.color.Color(0, 0, 0))
-                    self.change_screen(ev.screen, ev.player)
+                    self.change_screen(ev.screen)
                 else:
                     self._current_screen.handle_event(ev)
             self._current_screen.tick(self._dt)
--- a/nagslang/events.py	Thu Sep 05 12:04:14 2013 +0200
+++ b/nagslang/events.py	Thu Sep 05 13:09:14 2013 +0200
@@ -37,7 +37,7 @@
 class ScreenChange(UserEvent):
     @classmethod
     def post(cls, new_screen, player=None):
-        super(ScreenChange, cls).post(screen=new_screen, player=player)
+        super(ScreenChange, cls).post(screen=new_screen)
 
 
 class DoorEvent(UserEvent):
--- a/nagslang/game_object.py	Thu Sep 05 12:04:14 2013 +0200
+++ b/nagslang/game_object.py	Thu Sep 05 13:09:14 2013 +0200
@@ -27,6 +27,9 @@
     def get_space(self):
         return self._space
 
+    def set_space(self, new_space):
+        self._space = new_space
+
     def set_game_object(self, game_object):
         self.game_object = game_object
 
--- a/nagslang/protagonist.py	Thu Sep 05 12:04:14 2013 +0200
+++ b/nagslang/protagonist.py	Thu Sep 05 13:09:14 2013 +0200
@@ -85,6 +85,11 @@
     def _get_image(self, name, *transforms):
         return resources.get_image('creatures', name, transforms=transforms)
 
+    def change_space(self, new_space):
+        self.physicser.remove_from_space()
+        self.physicser.set_space(new_space)
+        self.physicser.add_to_space()
+
     def _make_renderer(self):
         return ProtagonistFormSelectionRenderer({
             self.HUMAN_FORM: render.FacingSelectionRenderer(
--- a/nagslang/screens/area.py	Thu Sep 05 12:04:14 2013 +0200
+++ b/nagslang/screens/area.py	Thu Sep 05 13:09:14 2013 +0200
@@ -7,7 +7,6 @@
 from nagslang.constants import COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS
 from nagslang.events import ScreenChange, DoorEvent, FireEvent
 from nagslang.level import Level
-from nagslang.protagonist import Protagonist
 from nagslang.screens.base import Screen
 from nagslang.game_object import Bullet
 from nagslang.sound import sound
@@ -73,14 +72,7 @@
         self._drawables = Drawables()
         self.add_walls()
         self._add_collision_handlers()
-        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_protagonist()
         self.add_game_objects()
         sound.play_music("POL-cyber-factory-short.ogg")
 
@@ -123,7 +115,8 @@
             self._drawables.add(drawable)
 
     def add_protagonist(self):
-        self.protagonist = Protagonist(self.space, (350, 300))
+        self.protagonist = self.world.protagonist
+        self.protagonist.change_space(self.space)
         self._drawables.add(self.protagonist)
 
     def handle_event(self, ev):
@@ -142,7 +135,7 @@
                 # Go to anther screen
                 self._disable_render = True
                 self.world.rooms += 1
-                ScreenChange.post(ev.destination, self.protagonist)
+                ScreenChange.post(ev.destination)
                 return
             # else we're teleporting within the screen, and just the
             # position change is enough
--- a/nagslang/screens/base.py	Thu Sep 05 12:04:14 2013 +0200
+++ b/nagslang/screens/base.py	Thu Sep 05 13:09:14 2013 +0200
@@ -6,10 +6,9 @@
 
 class Screen(object):
 
-    def __init__(self, name, player, world):
+    def __init__(self, name, world):
         self.name = name
         self.world = world
-        self.protagonist = player
         self.space = pymunk.Space()
 
     def setup(self):
--- a/nagslang/screens/menu.py	Thu Sep 05 12:04:14 2013 +0200
+++ b/nagslang/screens/menu.py	Thu Sep 05 13:09:14 2013 +0200
@@ -46,7 +46,7 @@
             widget.draw(surface)
 
     def play(self):
-        ScreenChange.post('level1', None)
+        ScreenChange.post('level1')
 
     def restart(self):
         self.world.reset()
--- a/nagslang/world.py	Thu Sep 05 12:04:14 2013 +0200
+++ b/nagslang/world.py	Thu Sep 05 13:09:14 2013 +0200
@@ -5,7 +5,10 @@
 import os
 import sys
 
+import pymunk
+
 from nagslang.yamlish import dump, load
+from nagslang.protagonist import Protagonist
 
 
 class World(object):
@@ -18,6 +21,7 @@
         self.transformations = 0
         self.kills = 0
         self.rooms = 0
+        self.protagonist = Protagonist(pymunk.Space(), (350, 300))
 
     def _save_location(self):
         app = 'nagslang'
@@ -37,6 +41,9 @@
             value = getattr(self, attr)
             if hasattr(value, '__name__'):
                 continue
+            # Hack until we save protagonist state
+            if hasattr(value, 'animate'):
+                continue
             data[attr] = value
 
         fn = self._save_location()