# HG changeset patch # User Neil Muller # Date 1378154141 -7200 # Node ID deac6a4008e78d67231187e41bbbb572099ef1cc # Parent cd77974b2a8707702f3819491deb99c3ad33f6be Hook up protagnist animations diff -r cd77974b2a87 -r deac6a4008e7 nagslang/game_object.py --- 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): diff -r cd77974b2a87 -r deac6a4008e7 nagslang/protagonist.py --- 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: diff -r cd77974b2a87 -r deac6a4008e7 nagslang/screens/area.py --- 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)