Changeset 143:deac6a4008e7


Ignore:
Timestamp:
Sep 2, 2013, 8:35:41 PM (7 years ago)
Author:
Neil Muller <drnlmuller@…>
Branch:
default
Message:

Hook up protagnist animations

Location:
nagslang
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • nagslang/game_object.py

    r140 r143  
    151151            self._render_shape(surface, pos, angle)
    152152
     153    def animate(self):
     154        # Used by time animatations to advance the clock
     155        pass
     156
    153157
    154158def image_pos(image, pos):
     
    184188        surface.blit(image, image_pos(image, pos))
    185189        super(FacingImageRenderer, self).render(surface)
     190
     191
     192class AnimatedFacingImageRenderer(FacingImageRenderer):
     193    def __init__(self, left_images, right_images):
     194        self._images = {
     195            'left': left_images,
     196            'right': right_images,
     197        }
     198        self._frame = 0
     199        self._moving = False
     200
     201    def get_image(self, angle):
     202        if abs(angle) < math.pi / 2:
     203            face = 'right'
     204        else:
     205            face = 'left'
     206        if self._frame >= len(self._images[face]):
     207            self._frame = 0
     208        return self._images[face][self._frame]
     209
     210    def render(self, surface):
     211        pos = self.game_object.get_render_position(surface)
     212        image = self.get_image(self.game_object.get_render_angle())
     213        surface.blit(image, image_pos(image, pos))
     214        super(FacingImageRenderer, self).render(surface)
     215
     216    def animate(self):
     217        if self._moving:
     218            self._frame += 1
     219        else:
     220            self._frame = 0
     221
     222    def start(self):
     223        self._moving = True
     224
     225    def stop(self):
     226        self._moving = False
     227
     228
     229class TimedAnimatedRenderer(ImageRenderer):
     230
     231    def __init__(self, images):
     232        self._images = images
     233        self._frame = 0
     234        self._image = None
     235
     236    def _get_image(self):
     237        if self._frame > len(self._imaages):
     238            self._frame = 0
     239        return self._images[self._frame]
     240
     241    def render(self, surface):
     242        self._image = self._get_image()
     243        super(TimedAnimatedRenderer, self).render(surface)
     244
     245    def animate(self):
     246        self._frame += 1
    186247
    187248
     
    254315    def render(self, surface):
    255316        return self.renderer.render(surface)
     317
     318    def animate(self):
     319        self.renderer.animate()
    256320
    257321
  • nagslang/protagonist.py

    r133 r143  
    44from nagslang.constants import COLLISION_TYPE_PLAYER, ZORDER_MID
    55from nagslang.game_object import (
    6     GameObject, SingleShapePhysicser, FacingImageRenderer, make_body)
     6    GameObject, SingleShapePhysicser, AnimatedFacingImageRenderer, make_body)
    77from nagslang.mutators import FLIP_H
    88from nagslang.resources import resources
     
    5151    def _setup_renderers(self):
    5252        self._renderers = {
    53             self.HUMAN_FORM: FacingImageRenderer(
    54                 self._get_image('human_1.png'),
    55                 self._get_image('human_1.png', FLIP_H)),
    56             self.WOLF_FORM: FacingImageRenderer(
    57                 self._get_image('werewolf_1.png'),
    58                 self._get_image('werewolf_1.png', FLIP_H)),
     53            self.HUMAN_FORM: AnimatedFacingImageRenderer(
     54                (self._get_image('human_1.png'),
     55                 self._get_image('human_1.png'),
     56                 self._get_image('human_1.png'),
     57                 self._get_image('human_2.png'),
     58                 self._get_image('human_2.png'),
     59                 self._get_image('human_2.png')),
     60                (self._get_image('human_1.png', FLIP_H),
     61                 self._get_image('human_1.png', FLIP_H),
     62                 self._get_image('human_1.png', FLIP_H),
     63                 self._get_image('human_2.png', FLIP_H),
     64                 self._get_image('human_2.png', FLIP_H),
     65                 self._get_image('human_2.png', FLIP_H))),
     66            self.WOLF_FORM: AnimatedFacingImageRenderer(
     67                (self._get_image('werewolf_1.png'),
     68                 self._get_image('werewolf_1.png'),
     69                 self._get_image('werewolf_1.png'),
     70                 self._get_image('werewolf_2.png'),
     71                 self._get_image('werewolf_2.png'),
     72                 self._get_image('werewolf_2.png')),
     73                (self._get_image('werewolf_1.png', FLIP_H),
     74                 self._get_image('werewolf_1.png', FLIP_H),
     75                 self._get_image('werewolf_1.png', FLIP_H),
     76                 self._get_image('werewolf_2.png', FLIP_H),
     77                 self._get_image('werewolf_2.png', FLIP_H),
     78                 self._get_image('werewolf_2.png', FLIP_H))),
    5979        }
    6080        for renderer in self._renderers.values():
     
    94114    def set_direction(self, dx, dy):
    95115        if (dx, dy) == (0, 0):
     116            self.renderer.stop()
    96117            return
    97118        self.angle = pymunk.Vec2d((dx, dy)).angle
    98119        self._body.apply_impulse(
    99120            (dx * self.impulse_factor, dy * self.impulse_factor))
     121        self.renderer.start()
    100122
    101123    def toggle_form(self):
  • nagslang/screens/area.py

    r140 r143  
    163163    def tick(self, seconds):
    164164        self.tick_protagonist()
     165        for drawable in self._drawables:
     166            drawable.animate()
    165167        super(AreaScreen, self).tick(seconds)
Note: See TracChangeset for help on using the changeset viewer.