changeset 63:7f038ee778ad

Put werewolf facing direction magic back.
author Jeremy Thurgood <firxen@gmail.com>
date Sun, 01 Sep 2013 19:18:12 +0200
parents 1d67a8c9861d
children 972142c543ef
files nagslang/game_object.py nagslang/screens/area.py
diffstat 2 files changed, 44 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/game_object.py	Sun Sep 01 18:57:35 2013 +0200
+++ b/nagslang/game_object.py	Sun Sep 01 19:18:12 2013 +0200
@@ -1,3 +1,4 @@
+import math
 
 
 class Physicser(object):
@@ -7,7 +8,10 @@
     def remove_from_space(self, space):
         raise NotImplementedError()
 
-    def render_position(self):
+    def render_position(self, surface):
+        raise NotImplementedError()
+
+    def render_angle(self):
         raise NotImplementedError()
 
 
@@ -21,6 +25,9 @@
     def render_position(self):
         return (0, 0)
 
+    def render_angle(self):
+        return 0
+
 
 class SingleShapePhysicser(Physicser):
     def __init__(self, shape):
@@ -36,27 +43,51 @@
         pos = self._shape.body.position
         import pymunk.pygame_util
         return pymunk.pygame_util.to_pygame(pos, surface)
-        return (int(pos.x), int(pos.y))
+
+    def render_angle(self):
+        return self._shape.body.angle
 
 
 class Renderer(object):
-    def render(self, surface, pos):
+    def render(self, surface, pos, angle):
         raise NotImplementedError()
 
 
+def image_pos(image, pos):
+    return (pos[0] - image.get_width() / 2,
+            pos[1] - image.get_height() / 2)
+
+
 class ImageRenderer(Renderer):
     def __init__(self, image):
         self._image = image
 
-    def render(self, surface, pos):
-        surface.blit(self._image, pos)
+    def render(self, surface, pos, angle):
+        surface.blit(self._image, image_pos(self._image, pos))
+
+
+class FacingImageRenderer(Renderer):
+    def __init__(self, left_image, right_image):
+        self._images = {
+            'left': left_image,
+            'right': right_image,
+        }
+
+    def get_image(self, angle):
+        if abs(angle) < math.pi / 2:
+            return self._images['right']
+        return self._images['left']
+
+    def render(self, surface, pos, angle):
+        image = self.get_image(angle)
+        surface.blit(image, image_pos(image, pos))
 
 
 class ShapeRenderer(Renderer):
     def __init__(self, shape):
         self._shape = shape
 
-    def render(self, surface, pos):
+    def render(self, surface, pos, angle):
         import pymunk.pygame_util
         pymunk.pygame_util.draw(surface, self._shape)
 
@@ -78,4 +109,5 @@
 
     def render(self, surface):
         return self.renderer.render(
-            surface, self.physicser.render_position(surface))
+            surface, self.physicser.render_position(surface),
+            self.physicser.render_angle())
--- a/nagslang/screens/area.py	Sun Sep 01 18:57:35 2013 +0200
+++ b/nagslang/screens/area.py	Sun Sep 01 19:18:12 2013 +0200
@@ -6,7 +6,7 @@
 import pymunk.pygame_util
 
 from nagslang.game_object import (
-    GameObject, SingleShapePhysicser, ImageRenderer)
+    GameObject, SingleShapePhysicser, FacingImageRenderer)
 from nagslang.screens.base import Screen
 from nagslang.level import Level
 from nagslang.events import ScreenChange
@@ -42,7 +42,10 @@
         self.shape.friction = 10.0
 
         super(Protagonist, self).__init__(
-            ImageRenderer(resources.get_image('creatures', 'werewolf_1.png')),
+            FacingImageRenderer(
+                resources.get_image('creatures', 'werewolf_1.png'),
+                resources.get_image(
+                    'creatures', 'werewolf_1.png', transforms=(FLIP_H,))),
             SingleShapePhysicser(self.shape))
 
         self.go_human()
@@ -50,20 +53,6 @@
     def velocity_func(self, body, gravity, damping, dt):
         return pymunk.Body.update_velocity(body, gravity, self.damping, dt)
 
-    def render_TODO(self, surface):
-        if self.werewolf:
-            pos = pymunk.pygame_util.to_pygame(self.body.position, surface)
-            transforms = ()
-            if abs(self.body.angle) < math.pi / 2:
-                transforms = (FLIP_H,)
-
-            wolf = resources.get_image('creatures', 'werewolf_1.png',
-                                       transforms=transforms)
-            surface.blit(wolf, (pos[0] - wolf.get_width() / 2,
-                                pos[1] - wolf.get_height() / 2))
-        else:
-            pymunk.pygame_util.draw(surface, self.shape)
-
     def go_werewolf(self):
         self.werewolf = True
         self.body.mass = 100