# HG changeset patch # User Neil Muller # Date 1378537168 -7200 # Node ID 4523b1ff17ae6de98b7f3902af5c3cf5b3ecd4c0 # Parent a7d48819a7111945de120f44b367811400468621 Hack together tile animation diff -r a7d48819a711 -r 4523b1ff17ae nagslang/render.py --- a/nagslang/render.py Sat Sep 07 01:21:32 2013 +0200 +++ b/nagslang/render.py Sat Sep 07 08:59:28 2013 +0200 @@ -216,22 +216,61 @@ self._offset = None self._alpha = alpha - def _make_surface(self, surface): - if not self._tiled: - size = surface.get_size() - mask = pygame.surface.Surface(size, pgl.SRCALPHA) - pointlist = [pymunk.pygame_util.to_pygame(p, surface) - for p in self.outline] - rect = pygame.draw.polygon(mask, - pygame.color.Color( - 255, 255, 255, self._alpha), - pointlist, 0) - self._offset = (rect.x, rect.y) - self._tiled = tile_surface((rect.w, rect.h), self._tile_image) - self._tiled.blit(mask, (0, 0), rect, - special_flags=pgl.BLEND_RGBA_MULT) + def _make_surface(self, surface, image): + size = surface.get_size() + mask = pygame.surface.Surface(size, pgl.SRCALPHA) + pointlist = [pymunk.pygame_util.to_pygame(p, surface) + for p in self.outline] + rect = pygame.draw.polygon(mask, + pygame.color.Color( + 255, 255, 255, self._alpha), + pointlist, 0) + self._offset = (rect.x, rect.y) + tiled = tile_surface((rect.w, rect.h), image) + tiled.blit(mask, (0, 0), rect, + special_flags=pgl.BLEND_RGBA_MULT) + return tiled def render(self, surface): - self._make_surface(surface) + if not self._tiled: + self._tiled = self._make_surface(surface, self._tile_image) surface.blit(self._tiled, self._offset) super(TiledRenderer, self).render(surface) + + +class TimedTiledRenderer(TiledRenderer): + """Animate tiles""" + + # Should make this a mixin with TimeAnimate, but not right now + + def __init__(self, outline, images, frame_ticks=1, alpha=255): + self._images = images + self._frame_ticks = frame_ticks + self.outline = outline + self._frames = [None] * len(images) + self._offset = None + self._alpha = alpha + self._frame = 0 + self._frame_tick = 0 + + def advance_tick(self): + self._frame_tick += 1 + if self._frame_tick > self._frame_ticks: + self._frame_tick = 0 + self._frame += 1 + if self._frame >= len(self._images): + self._frame = 0 + + def reset(self): + self._frame_tick = 0 + self._frame = 0 + + def update(self, seconds): + self.advance_tick() + + def render(self, surface): + if not self._frames[self._frame]: + self._frames[self._frame] = self._make_surface( + surface, self._images[self._frame]) + self._tiled = self._frames[self._frame] + super(TimedTiledRenderer, self).render(surface)