changeset 156:94a2456696af

front and back views
author Neil Muller <drnlmuller@gmail.com>
date Mon, 02 Sep 2013 23:52:24 +0200
parents b455873020be
children 76049c9e3d5c
files nagslang/protagonist.py
diffstat 1 files changed, 69 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/protagonist.py	Mon Sep 02 23:49:27 2013 +0200
+++ b/nagslang/protagonist.py	Mon Sep 02 23:52:24 2013 +0200
@@ -1,6 +1,8 @@
 import pymunk
 import pymunk.pygame_util
 
+import math
+
 from nagslang.constants import COLLISION_TYPE_PLAYER, ZORDER_MID
 from nagslang.game_object import (
     GameObject, SingleShapePhysicser, AnimatedFacingImageRenderer, make_body)
@@ -15,13 +17,16 @@
     """
 
     HUMAN_FORM = 'human'
+    HUMAN_FORM_BACK = 'human_back'
     WOLF_FORM = 'wolf'
+    WOLF_FORM_BACK = 'wolf_back'
 
     def __init__(self, space, position):
         self._setup_physics(space, position)
         self._setup_renderers()
         self.inventory = {}
         self.form = self.HUMAN_FORM
+        self.render_form = self.HUMAN_FORM
 
         super(Protagonist, self).__init__(
             self._physicsers[self.form], self._renderers[self.form])
@@ -63,6 +68,19 @@
                  self._get_image('human_2.png', FLIP_H),
                  self._get_image('human_2.png', FLIP_H),
                  self._get_image('human_2.png', FLIP_H))),
+            self.HUMAN_FORM_BACK: AnimatedFacingImageRenderer(
+                (self._get_image('human_back_1.png'),
+                 self._get_image('human_back_1.png'),
+                 self._get_image('human_back_1.png'),
+                 self._get_image('human_back_2.png'),
+                 self._get_image('human_back_2.png'),
+                 self._get_image('human_back_2.png')),
+                (self._get_image('human_back_1.png', FLIP_H),
+                 self._get_image('human_back_1.png', FLIP_H),
+                 self._get_image('human_back_1.png', FLIP_H),
+                 self._get_image('human_back_2.png', FLIP_H),
+                 self._get_image('human_back_2.png', FLIP_H),
+                 self._get_image('human_back_2.png', FLIP_H))),
             self.WOLF_FORM: AnimatedFacingImageRenderer(
                 (self._get_image('werewolf_1.png'),
                  self._get_image('werewolf_1.png'),
@@ -76,6 +94,19 @@
                  self._get_image('werewolf_2.png', FLIP_H),
                  self._get_image('werewolf_2.png', FLIP_H),
                  self._get_image('werewolf_2.png', FLIP_H))),
+            self.WOLF_FORM_BACK: AnimatedFacingImageRenderer(
+                (self._get_image('werewolf_back_1.png'),
+                 self._get_image('werewolf_back_1.png'),
+                 self._get_image('werewolf_back_1.png'),
+                 self._get_image('werewolf_back_2.png'),
+                 self._get_image('werewolf_back_2.png'),
+                 self._get_image('werewolf_back_2.png')),
+                (self._get_image('werewolf_back_1.png', FLIP_H),
+                 self._get_image('werewolf_back_1.png', FLIP_H),
+                 self._get_image('werewolf_back_1.png', FLIP_H),
+                 self._get_image('werewolf_back_2.png', FLIP_H),
+                 self._get_image('werewolf_back_2.png', FLIP_H),
+                 self._get_image('werewolf_back_2.png', FLIP_H))),
         }
         for renderer in self._renderers.values():
             renderer.set_game_object(self)
@@ -99,7 +130,13 @@
         self._body.velocity_limit = 1000
         self.impulse_factor = 4000
         self._body.damping = 0.9
-        self.renderer = self._renderers[self.form]
+        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
+        self.renderer = self._renderers[self.render_form]
 
     def go_human(self):
         self._physicsers[self.form].remove_from_space()
@@ -109,13 +146,43 @@
         self._body.velocity_limit = 1000
         self.impulse_factor = 500
         self._body.damping = 0.8
-        self.renderer = self._renderers[self.form]
+        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
+        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.renderer.stop()
             return
+        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._body.apply_impulse(
             (dx * self.impulse_factor, dy * self.impulse_factor))
         self.renderer.start()