changeset 218:9e2ef2f15035

Better rendering and movement detection.
author Jeremy Thurgood <firxen@gmail.com>
date Wed, 04 Sep 2013 15:06:33 +0200
parents d98daba73055
children f9e92d540bfa
files nagslang/enemies.py nagslang/game_object.py nagslang/protagonist.py nagslang/render.py
diffstat 4 files changed, 17 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/enemies.py	Wed Sep 04 14:53:37 2013 +0200
+++ b/nagslang/enemies.py	Wed Sep 04 15:06:33 2013 +0200
@@ -33,6 +33,7 @@
 
 
 class PatrollingAlien(Enemy):
+    is_moving = True  # Always walking.
 
     def __init__(self, space, position, end_position):
         # An enemy that patrols between the two points
--- a/nagslang/game_object.py	Wed Sep 04 14:53:37 2013 +0200
+++ b/nagslang/game_object.py	Wed Sep 04 15:06:33 2013 +0200
@@ -117,6 +117,7 @@
     """
 
     zorder = ZORDER_LOW
+    is_moving = False  # `True` if a movement animation should play.
 
     def __init__(self, physicser, renderer, puzzler=None, overlay=None):
         self.physicser = physicser
@@ -149,13 +150,6 @@
     def animate(self):
         self.renderer.animate()
 
-    def is_moving(self):
-        """Returns `True` if this object is moving.
-
-        This is mostly for movement-based animation renderers to look at.
-        """
-        return self.physicser.get_velocity().length > 0
-
     def collide_with_protagonist(self):
         """Called as a `pre_solve` collision callback with the protagonist.
 
--- a/nagslang/protagonist.py	Wed Sep 04 14:53:37 2013 +0200
+++ b/nagslang/protagonist.py	Wed Sep 04 15:06:33 2013 +0200
@@ -26,6 +26,11 @@
         return self._form_shapes[self.game_object.form]
 
 
+class ProtagonistFormSelectionRenderer(render.RendererSelectionRenderer):
+    def select_renderer(self):
+        return self.game_object.render_form
+
+
 class Protagonist(GameObject):
     """Representation of our fearless protagonist.
 
@@ -39,13 +44,14 @@
 
     def __init__(self, space, position):
         physicser = self._make_physics(space, position)
-        self._setup_renderers()
+        renderer = self._make_renderer()
         self.inventory = {}
         self.form = self.HUMAN_FORM
         self.render_form = self.HUMAN_FORM
+        self.angle = 0
+        self.is_moving = False
 
-        super(Protagonist, self).__init__(
-            physicser, self._renderers[self.form])
+        super(Protagonist, self).__init__(physicser, renderer)
         self.zorder = ZORDER_MID
 
         self.go_human()
@@ -78,9 +84,8 @@
     def _get_image(self, name, *transforms):
         return resources.get_image('creatures', name, transforms=transforms)
 
-    def _setup_renderers(self):
-        self.angle = 0
-        self._renderers = {
+    def _make_renderer(self):
+        return ProtagonistFormSelectionRenderer({
             self.HUMAN_FORM: render.FacingSelectionRenderer(
                 {
                     'left': render.MovementAnimatedRenderer(
@@ -117,9 +122,7 @@
                         [self._get_image('werewolf_back_1.png', FLIP_H),
                          self._get_image('werewolf_back_2.png', FLIP_H)], 3),
                 }),
-        }
-        for renderer in self._renderers.values():
-            renderer.set_game_object(self)
+        })
 
     @classmethod
     def from_saved_state(cls, saved_state):
@@ -143,7 +146,6 @@
             self.render_form = self.WOLF_FORM_BACK
         else:
             self.render_form = self.WOLF_FORM
-        self.renderer = self._renderers[self.render_form]
 
     def go_human(self):
         self.physicser.switch_form(self.form, self.HUMAN_FORM)
@@ -156,25 +158,24 @@
             self.render_form = self.HUMAN_FORM_BACK
         else:
             self.render_form = self.HUMAN_FORM
-        self.renderer = self._renderers[self.render_form]
 
     def _switch_to_back(self):
         if self.render_form == self.HUMAN_FORM:
             self.render_form = self.HUMAN_FORM_BACK
         elif self.render_form == self.WOLF_FORM:
             self.render_form = self.WOLF_FORM_BACK
-        self.renderer = self._renderers[self.render_form]
 
     def _switch_to_front(self):
         if self.render_form == self.HUMAN_FORM_BACK:
             self.render_form = self.HUMAN_FORM
         elif self.render_form == self.WOLF_FORM_BACK:
             self.render_form = self.WOLF_FORM
-        self.renderer = self._renderers[self.render_form]
 
     def set_direction(self, dx, dy):
         if (dx, dy) == (0, 0):
+            self.is_moving = False
             return
+        self.is_moving = True
         old_angle = self.angle
         self.angle = pymunk.Vec2d((dx, dy)).angle
         # If we've gone from quadrants 2 & 3 to 1 & 4 (or vice versa)
@@ -200,7 +201,6 @@
         self.angle = old_protagonist.angle
         self.render_form = old_protagonist.render_form
         self.inventory = old_protagonist.inventory
-        self.renderer = self._renderers[self.render_form]
 
     def toggle_form(self):
         if self.form == self.WOLF_FORM:
--- a/nagslang/render.py	Wed Sep 04 14:53:37 2013 +0200
+++ b/nagslang/render.py	Wed Sep 04 15:06:33 2013 +0200
@@ -99,7 +99,7 @@
 
 class MovementAnimatedRenderer(TimedAnimatedRenderer):
     def animate(self):
-        if self.game_object.is_moving():
+        if self.game_object.is_moving:
             self.advance_tick()
         else:
             self.reset()