changeset 143:deac6a4008e7

Hook up protagnist animations
author Neil Muller <drnlmuller@gmail.com>
date Mon, 02 Sep 2013 22:35:41 +0200
parents cd77974b2a87
children 829c8b6e142d
files nagslang/game_object.py nagslang/protagonist.py nagslang/screens/area.py
diffstat 3 files changed, 95 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/game_object.py	Mon Sep 02 19:20:44 2013 +0200
+++ b/nagslang/game_object.py	Mon Sep 02 22:35:41 2013 +0200
@@ -150,6 +150,10 @@
         if options.debug:
             self._render_shape(surface, pos, angle)
 
+    def animate(self):
+        # Used by time animatations to advance the clock
+        pass
+
 
 def image_pos(image, pos):
     return (pos[0] - image.get_width() / 2,
@@ -185,6 +189,63 @@
         super(FacingImageRenderer, self).render(surface)
 
 
+class AnimatedFacingImageRenderer(FacingImageRenderer):
+    def __init__(self, left_images, right_images):
+        self._images = {
+            'left': left_images,
+            'right': right_images,
+        }
+        self._frame = 0
+        self._moving = False
+
+    def get_image(self, angle):
+        if abs(angle) < math.pi / 2:
+            face = 'right'
+        else:
+            face = 'left'
+        if self._frame >= len(self._images[face]):
+            self._frame = 0
+        return self._images[face][self._frame]
+
+    def render(self, surface):
+        pos = self.game_object.get_render_position(surface)
+        image = self.get_image(self.game_object.get_render_angle())
+        surface.blit(image, image_pos(image, pos))
+        super(FacingImageRenderer, self).render(surface)
+
+    def animate(self):
+        if self._moving:
+            self._frame += 1
+        else:
+            self._frame = 0
+
+    def start(self):
+        self._moving = True
+
+    def stop(self):
+        self._moving = False
+
+
+class TimedAnimatedRenderer(ImageRenderer):
+
+    def __init__(self, images):
+        self._images = images
+        self._frame = 0
+        self._image = None
+
+    def _get_image(self):
+        if self._frame > len(self._imaages):
+            self._frame = 0
+        return self._images[self._frame]
+
+    def render(self, surface):
+        self._image = self._get_image()
+        super(TimedAnimatedRenderer, self).render(surface)
+
+    def animate(self):
+        self._frame += 1
+
+
 class ShapeRenderer(Renderer):
     def render(self, surface):
         self._render_shape(surface)
@@ -254,6 +315,9 @@
     def render(self, surface):
         return self.renderer.render(surface)
 
+    def animate(self):
+        self.renderer.animate()
+
 
 class FloorSwitch(GameObject):
     def __init__(self, space, position):
--- a/nagslang/protagonist.py	Mon Sep 02 19:20:44 2013 +0200
+++ b/nagslang/protagonist.py	Mon Sep 02 22:35:41 2013 +0200
@@ -3,7 +3,7 @@
 
 from nagslang.constants import COLLISION_TYPE_PLAYER, ZORDER_MID
 from nagslang.game_object import (
-    GameObject, SingleShapePhysicser, FacingImageRenderer, make_body)
+    GameObject, SingleShapePhysicser, AnimatedFacingImageRenderer, make_body)
 from nagslang.mutators import FLIP_H
 from nagslang.resources import resources
 
@@ -50,12 +50,32 @@
 
     def _setup_renderers(self):
         self._renderers = {
-            self.HUMAN_FORM: FacingImageRenderer(
-                self._get_image('human_1.png'),
-                self._get_image('human_1.png', FLIP_H)),
-            self.WOLF_FORM: FacingImageRenderer(
-                self._get_image('werewolf_1.png'),
-                self._get_image('werewolf_1.png', FLIP_H)),
+            self.HUMAN_FORM: AnimatedFacingImageRenderer(
+                (self._get_image('human_1.png'),
+                 self._get_image('human_1.png'),
+                 self._get_image('human_1.png'),
+                 self._get_image('human_2.png'),
+                 self._get_image('human_2.png'),
+                 self._get_image('human_2.png')),
+                (self._get_image('human_1.png', FLIP_H),
+                 self._get_image('human_1.png', FLIP_H),
+                 self._get_image('human_1.png', FLIP_H),
+                 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.WOLF_FORM: AnimatedFacingImageRenderer(
+                (self._get_image('werewolf_1.png'),
+                 self._get_image('werewolf_1.png'),
+                 self._get_image('werewolf_1.png'),
+                 self._get_image('werewolf_2.png'),
+                 self._get_image('werewolf_2.png'),
+                 self._get_image('werewolf_2.png')),
+                (self._get_image('werewolf_1.png', FLIP_H),
+                 self._get_image('werewolf_1.png', FLIP_H),
+                 self._get_image('werewolf_1.png', FLIP_H),
+                 self._get_image('werewolf_2.png', FLIP_H),
+                 self._get_image('werewolf_2.png', FLIP_H),
+                 self._get_image('werewolf_2.png', FLIP_H))),
         }
         for renderer in self._renderers.values():
             renderer.set_game_object(self)
@@ -93,10 +113,12 @@
 
     def set_direction(self, dx, dy):
         if (dx, dy) == (0, 0):
+            self.renderer.stop()
             return
         self.angle = pymunk.Vec2d((dx, dy)).angle
         self._body.apply_impulse(
             (dx * self.impulse_factor, dy * self.impulse_factor))
+        self.renderer.start()
 
     def toggle_form(self):
         if self.form == self.WOLF_FORM:
--- a/nagslang/screens/area.py	Mon Sep 02 19:20:44 2013 +0200
+++ b/nagslang/screens/area.py	Mon Sep 02 22:35:41 2013 +0200
@@ -162,4 +162,6 @@
 
     def tick(self, seconds):
         self.tick_protagonist()
+        for drawable in self._drawables:
+            drawable.animate()
         super(AreaScreen, self).tick(seconds)