changeset 400:4523b1ff17ae

Hack together tile animation
author Neil Muller <drnlmuller@gmail.com>
date Sat, 07 Sep 2013 08:59:28 +0200
parents a7d48819a711
children f7ee43c0e5c9
files nagslang/render.py
diffstat 1 files changed, 54 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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)