changeset 229:329b3044ddef

Much better facing renderers.
author Jeremy Thurgood <firxen@gmail.com>
date Wed, 04 Sep 2013 18:40:00 +0200
parents 316cff60a309
children a3db94687ce2
files data/images/creatures/human_NW_1.png data/images/creatures/human_NW_2.png data/images/creatures/human_N_1.png data/images/creatures/human_N_2.png data/images/creatures/human_SW_1.png data/images/creatures/human_SW_2.png data/images/creatures/human_W_1.png data/images/creatures/human_W_2.png data/images/creatures/werewolf_NW_1.png data/images/creatures/werewolf_NW_2.png data/images/creatures/werewolf_SW_1.png data/images/creatures/werewolf_SW_2.png data/images/creatures/werewolf_W_1.png data/images/creatures/werewolf_W_2.png nagslang/enemies.py nagslang/game_object.py nagslang/protagonist.py nagslang/render.py
diffstat 18 files changed, 88 insertions(+), 88 deletions(-) [+]
line wrap: on
line diff
Binary file data/images/creatures/human_NW_1.png has changed
Binary file data/images/creatures/human_NW_2.png has changed
Binary file data/images/creatures/human_N_1.png has changed
Binary file data/images/creatures/human_N_2.png has changed
Binary file data/images/creatures/human_SW_1.png has changed
Binary file data/images/creatures/human_SW_2.png has changed
Binary file data/images/creatures/human_W_1.png has changed
Binary file data/images/creatures/human_W_2.png has changed
Binary file data/images/creatures/werewolf_NW_1.png has changed
Binary file data/images/creatures/werewolf_NW_2.png has changed
Binary file data/images/creatures/werewolf_SW_1.png has changed
Binary file data/images/creatures/werewolf_SW_2.png has changed
Binary file data/images/creatures/werewolf_W_1.png has changed
Binary file data/images/creatures/werewolf_W_2.png has changed
--- a/nagslang/enemies.py	Wed Sep 04 18:37:43 2013 +0200
+++ b/nagslang/enemies.py	Wed Sep 04 18:40:00 2013 +0200
@@ -1,3 +1,5 @@
+import math
+
 import pymunk
 import pymunk.pygame_util
 
@@ -65,7 +67,15 @@
         })
 
     def get_render_angle(self):
-        return self.angle
+        # No image rotation when rendering, please.
+        return 0
+
+    def get_facing_direction(self):
+        # Enemies can face left or right.
+        if - math.pi / 2 < self.angle <= math.pi / 2:
+            return 'right'
+        else:
+            return 'left'
 
     def _switch_direction(self):
         if self._direction == 'away':
--- a/nagslang/game_object.py	Wed Sep 04 18:37:43 2013 +0200
+++ b/nagslang/game_object.py	Wed Sep 04 18:40:00 2013 +0200
@@ -117,6 +117,11 @@
     def get_render_angle(self):
         return self.physicser.get_angle()
 
+    def get_facing_direction(self):
+        """Used by rendererd that care what direction an object is facing.
+        """
+        return None
+
     def render(self, surface):
         return self.renderer.render(surface)
 
--- a/nagslang/protagonist.py	Wed Sep 04 18:37:43 2013 +0200
+++ b/nagslang/protagonist.py	Wed Sep 04 18:40:00 2013 +0200
@@ -1,5 +1,6 @@
 import pymunk
 import pymunk.pygame_util
+from pymunk.vec2d import Vec2d
 
 import math
 
@@ -28,7 +29,7 @@
 
 class ProtagonistFormSelectionRenderer(render.RendererSelectionRenderer):
     def select_renderer(self):
-        return self.game_object.render_form
+        return self.game_object.form
 
 
 class Protagonist(GameObject):
@@ -38,16 +39,13 @@
     """
 
     HUMAN_FORM = 'human'
-    HUMAN_FORM_BACK = 'human_back'
     WOLF_FORM = 'wolf'
-    WOLF_FORM_BACK = 'wolf_back'
 
     def __init__(self, space, position):
         physicser = self._make_physics(space, position)
         renderer = self._make_renderer()
         self.inventory = {}
         self.form = self.HUMAN_FORM
-        self.render_form = self.HUMAN_FORM
         self.angle = 0
         self.is_moving = False
 
@@ -88,39 +86,57 @@
         return ProtagonistFormSelectionRenderer({
             self.HUMAN_FORM: render.FacingSelectionRenderer(
                 {
-                    'left': render.MovementAnimatedRenderer(
-                        [self._get_image('human_1.png'),
-                         self._get_image('human_2.png')], 3),
-                    'right': render.MovementAnimatedRenderer(
-                        [self._get_image('human_1.png', FLIP_H),
-                         self._get_image('human_2.png', FLIP_H)], 3),
-                }),
-            self.HUMAN_FORM_BACK: render.FacingSelectionRenderer(
-                {
-                    'left': render.MovementAnimatedRenderer(
-                        [self._get_image('human_back_1.png'),
-                         self._get_image('human_back_2.png')], 3),
-                    'right': render.MovementAnimatedRenderer(
-                        [self._get_image('human_back_1.png', FLIP_H),
-                         self._get_image('human_back_2.png', FLIP_H)], 3),
+                    'N': render.MovementAnimatedRenderer(
+                        [self._get_image('human_N_1.png'),
+                         self._get_image('human_N_2.png')], 3),
+                    'S': render.MovementAnimatedRenderer(
+                        [self._get_image('human_S_1.png'),
+                         self._get_image('human_S_2.png')], 3),
+                    'W': render.MovementAnimatedRenderer(
+                        [self._get_image('human_W_1.png'),
+                         self._get_image('human_W_2.png')], 3),
+                    'E': render.MovementAnimatedRenderer(
+                        [self._get_image('human_W_1.png', FLIP_H),
+                         self._get_image('human_W_2.png', FLIP_H)], 3),
+                    'NW': render.MovementAnimatedRenderer(
+                        [self._get_image('human_NW_1.png'),
+                         self._get_image('human_NW_2.png')], 3),
+                    'NE': render.MovementAnimatedRenderer(
+                        [self._get_image('human_NW_1.png', FLIP_H),
+                         self._get_image('human_NW_2.png', FLIP_H)], 3),
+                    'SW': render.MovementAnimatedRenderer(
+                        [self._get_image('human_SW_1.png'),
+                         self._get_image('human_SW_2.png')], 3),
+                    'SE': render.MovementAnimatedRenderer(
+                        [self._get_image('human_SW_1.png', FLIP_H),
+                         self._get_image('human_SW_2.png', FLIP_H)], 3),
                 }),
             self.WOLF_FORM: render.FacingSelectionRenderer(
                 {
-                    'left': render.MovementAnimatedRenderer(
-                        [self._get_image('werewolf_1.png'),
-                         self._get_image('werewolf_2.png')], 3),
-                    'right': render.MovementAnimatedRenderer(
-                        [self._get_image('werewolf_1.png', FLIP_H),
-                         self._get_image('werewolf_2.png', FLIP_H)], 3),
-                }),
-            self.WOLF_FORM_BACK: render.FacingSelectionRenderer(
-                {
-                    'left': render.MovementAnimatedRenderer(
-                        [self._get_image('werewolf_back_1.png'),
-                         self._get_image('werewolf_back_2.png')], 3),
-                    'right': render.MovementAnimatedRenderer(
-                        [self._get_image('werewolf_back_1.png', FLIP_H),
-                         self._get_image('werewolf_back_2.png', FLIP_H)], 3),
+                    'N': render.MovementAnimatedRenderer(
+                        [self._get_image('werewolf_N_1.png'),
+                         self._get_image('werewolf_N_2.png')], 3),
+                    'S': render.MovementAnimatedRenderer(
+                        [self._get_image('werewolf_S_1.png'),
+                         self._get_image('werewolf_S_2.png')], 3),
+                    'W': render.MovementAnimatedRenderer(
+                        [self._get_image('werewolf_W_1.png'),
+                         self._get_image('werewolf_W_2.png')], 3),
+                    'E': render.MovementAnimatedRenderer(
+                        [self._get_image('werewolf_W_1.png', FLIP_H),
+                         self._get_image('werewolf_W_2.png', FLIP_H)], 3),
+                    'NW': render.MovementAnimatedRenderer(
+                        [self._get_image('werewolf_NW_1.png'),
+                         self._get_image('werewolf_NW_2.png')], 3),
+                    'NE': render.MovementAnimatedRenderer(
+                        [self._get_image('werewolf_NW_1.png', FLIP_H),
+                         self._get_image('werewolf_NW_2.png', FLIP_H)], 3),
+                    'SW': render.MovementAnimatedRenderer(
+                        [self._get_image('werewolf_SW_1.png'),
+                         self._get_image('werewolf_SW_2.png')], 3),
+                    'SE': render.MovementAnimatedRenderer(
+                        [self._get_image('werewolf_SW_1.png', FLIP_H),
+                         self._get_image('werewolf_SW_2.png', FLIP_H)], 3),
                 }),
         })
 
@@ -133,60 +149,44 @@
         return obj
 
     def get_render_angle(self):
-        return self.angle
+        # No image rotation when rendering, please.
+        return 0
+
+    def get_facing_direction(self):
+        # It's easier to work with a vector than an angle here.
+        vec = Vec2d.unit()
+        vec.angle = self.angle
+        # We probably don't have exactly -1, 0, or 1 here.
+        x = int(round(vec.x))
+        y = int(round(vec.y))
+
+        return {
+            (0, 1): 'N',
+            (0, -1): 'S',
+            (-1, 0): 'W',
+            (1, 0): 'E',
+            (1, 1): 'NE',
+            (1, -1): 'SE',
+            (-1, 1): 'NW',
+            (-1, -1): 'SW',
+        }[(x, y)]
 
     def go_werewolf(self):
         self.physicser.switch_form(self.form, self.WOLF_FORM)
         self.form = self.WOLF_FORM
         self.impulse_factor = 4000
 
-        if self.render_form == self.HUMAN_FORM:
-            self.render_form = self.WOLF_FORM
-        elif self.render_form == self.HUMAN_FORM_BACK:
-            self.render_form = self.WOLF_FORM_BACK
-        else:
-            self.render_form = self.WOLF_FORM
-
     def go_human(self):
         self.physicser.switch_form(self.form, self.HUMAN_FORM)
         self.form = self.HUMAN_FORM
         self.impulse_factor = 500
 
-        if self.render_form == self.WOLF_FORM:
-            self.render_form = self.HUMAN_FORM
-        elif self.render_form == self.WOLF_FORM_BACK:
-            self.render_form = self.HUMAN_FORM_BACK
-        else:
-            self.render_form = self.HUMAN_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
-
-    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
-
     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)
-        # switch between front & back views
-        if self.angle != math.pi:
-            # == math.pi is going straight left, which can't
-            # trigger a front/back swap and simplifies these checks
-            if self.angle > 0 and old_angle != self.angle:
-                self._switch_to_back()
-            elif self.angle < 0 and old_angle != self.angle:
-                self._switch_to_front()
         self.physicser.apply_impulse(
             (dx * self.impulse_factor, dy * self.impulse_factor))
 
@@ -199,7 +199,6 @@
         self.impulse_factor = old_protagonist.impulse_factor
         self.form = old_protagonist.form
         self.angle = old_protagonist.angle
-        self.render_form = old_protagonist.render_form
         self.inventory = old_protagonist.inventory
 
     def toggle_form(self):
--- a/nagslang/render.py	Wed Sep 04 18:37:43 2013 +0200
+++ b/nagslang/render.py	Wed Sep 04 18:40:00 2013 +0200
@@ -134,22 +134,8 @@
 
 
 class FacingSelectionRenderer(RendererSelectionRenderer):
-    def __init__(self, renderers):
-        for renderer in renderers.values():
-            renderer.rotate = False
-        super(FacingSelectionRenderer, self).__init__(renderers)
-        self._face = 'left'
-
-    def _update_facing(self, angle):
-        if abs(angle) < math.pi / 2:
-            self._face = 'right'
-        elif abs(angle) > math.pi / 2:
-            self._face = 'left'
-
     def select_renderer(self):
-        angle = self.game_object.get_render_angle()
-        self._update_facing(angle)
-        return self._face
+        return self.game_object.get_facing_direction()
 
 
 class ShapeRenderer(Renderer):