Mercurial > nagslang
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: