Ignore:
Timestamp:
09/04/13 12:53:37 (8 years ago)
Author:
Jeremy Thurgood <firxen@…>
Branch:
default
Phase:
public
Message:

Composition-based renderers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • nagslang/render.py

    r207 r217  
    7272
    7373
    74 class FacingImageRenderer(ImageRenderer):
    75     def __init__(self, left_image, right_image):
    76         self._images = {
    77             'left': left_image,
    78             'right': right_image,
    79         }
     74class TimedAnimatedRenderer(ImageRenderer):
     75    def __init__(self, images, frame_ticks=1):
     76        self._images = images
     77        self._frame_ticks = frame_ticks
     78        self._frame_tick = 0
     79        self._frame = 0
     80
     81    def advance_tick(self):
     82        self._frame_tick += 1
     83        if self._frame_tick > self._frame_ticks:
     84            self._frame_tick = 0
     85            self._frame += 1
     86        if self._frame >= len(self._images):
     87            self._frame = 0
     88
     89    def reset(self):
     90        self._frame_tick = 0
     91        self._frame = 0
     92
     93    def get_image(self):
     94        return self._images[self._frame]
     95
     96    def animate(self):
     97        self.advance_tick()
     98
     99
     100class MovementAnimatedRenderer(TimedAnimatedRenderer):
     101    def animate(self):
     102        if self.game_object.is_moving():
     103            self.advance_tick()
     104        else:
     105            self.reset()
     106
     107
     108class RendererSelectionRenderer(Renderer):
     109    def __init__(self, renderers):
     110        self._renderers = renderers
     111
     112    def set_game_object(self, game_object):
     113        self.game_object = game_object
     114        for renderer in self._renderers.values():
     115            renderer.set_game_object(game_object)
     116
     117    @property
     118    def renderer(self):
     119        return self._renderers[self.select_renderer()]
     120
     121    def render(self, surface):
     122        return self.renderer.render(surface)
     123
     124    def animate(self):
     125        return self.renderer.animate()
     126
     127    def select_renderer(self):
     128        raise NotImplementedError()
     129
     130
     131class FacingSelectionRenderer(RendererSelectionRenderer):
     132    def __init__(self, renderers):
     133        for renderer in renderers.values():
     134            # TODO: Unhack this somehow.
     135            renderer.rotate_image = self.rotate_image
     136        super(FacingSelectionRenderer, self).__init__(renderers)
    80137        self._face = 'left'
    81138
     
    90147        return image
    91148
    92     def get_facing_image(self):
    93         return self._images[self._face]
    94 
    95     def get_image(self):
     149    def select_renderer(self):
    96150        angle = self.game_object.get_render_angle()
    97151        self._update_facing(angle)
    98         return self.get_facing_image()
    99 
    100 
    101 class AnimatedFacingImageRenderer(FacingImageRenderer):
    102     def __init__(self, left_images, right_images):
    103         self._images = {
    104             'left': left_images,
    105             'right': right_images,
    106         }
    107         self._frame = 0
    108         self._moving = False
    109         self._face = 'left'
    110 
    111     def get_facing_image(self):
    112         if self._frame >= len(self._images[self._face]):
    113             self._frame = 0
    114         return self._images[self._face][self._frame]
    115 
    116     def animate(self):
    117         if self._moving:
    118             self._frame += 1
    119         else:
    120             self._frame = 0
    121 
    122     def start(self):
    123         self._moving = True
    124 
    125     def stop(self):
    126         self._moving = False
    127 
    128 
    129 class TimedAnimatedRenderer(ImageRenderer):
    130 
    131     def __init__(self, images):
    132         self._images = images
    133         self._frame = 0
    134         self._image = None
    135 
    136     def get_image(self):
    137         if self._frame > len(self._imaages):
    138             self._frame = 0
    139         return self._images[self._frame]
    140 
    141     def animate(self):
    142         self._frame += 1
     152        return self._face
    143153
    144154
Note: See TracChangeset for help on using the changeset viewer.