Mercurial > nagslang
annotate nagslang/render.py @ 474:9775055ba2f0
Prettier bulkheads.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sat, 07 Sep 2013 16:43:44 +0200 |
parents | 803d53c86f7f |
children | ae8eb7c0f7bb |
rev | line source |
---|---|
207 | 1 import math |
397
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
2 import textwrap |
207 | 3 |
4 import pygame | |
349 | 5 import pygame.locals as pgl |
207 | 6 import pymunk |
7 | |
8 from nagslang.options import options | |
474 | 9 from nagslang.utils import tile_surface, vec_from_angle |
397
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
10 from nagslang.widgets.text import LabelWidget, MultiLineWidget |
207 | 11 |
12 | |
13 class Renderer(object): | |
14 def set_game_object(self, game_object): | |
15 self.game_object = game_object | |
16 | |
17 def _render_shape(self, surface): | |
18 shape = self.game_object.get_shape() | |
19 # Less general that pymunk.pygame_util.draw, but also a lot less noisy. | |
20 color = getattr(shape, 'color', pygame.color.THECOLORS['lightblue']) | |
21 # We only explicitly draw Circle and Poly shapes. Everything else we | |
22 # forward to pymunk. | |
23 if isinstance(shape, pymunk.Circle): | |
24 centre = pymunk.pygame_util.to_pygame(shape.body.position, surface) | |
25 radius = int(shape.radius) | |
26 pygame.draw.circle(surface, color, centre, radius, 2) | |
27 elif isinstance(shape, pymunk.Poly): | |
28 # polygon bounding box | |
29 points = [pymunk.pygame_util.to_pygame(p, surface) | |
30 for p in shape.get_vertices()] | |
31 pygame.draw.lines(surface, color, True, points, 2) | |
32 else: | |
33 pymunk.pygame_util.draw(surface, shape) | |
34 | |
35 def render(self, surface): | |
454
803d53c86f7f
Don't show debugging shapes by default in DEBUG mode
Stefano Rivera <stefano@rivera.za.net>
parents:
400
diff
changeset
|
36 if options.shapes: |
207 | 37 self._render_shape(surface) |
38 | |
307
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
39 def update(self, seconds): |
207 | 40 # Used by time animatations to advance the clock |
41 pass | |
42 | |
43 | |
286
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
230
diff
changeset
|
44 class NullRenderer(Renderer): |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
230
diff
changeset
|
45 def render(self, surface): |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
230
diff
changeset
|
46 pass |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
230
diff
changeset
|
47 |
248b8fdb160c
Collect gun (which currently looks like a bullet) to shoot.
Jeremy Thurgood <firxen@gmail.com>
parents:
230
diff
changeset
|
48 |
474 | 49 class BulkheadRenderer(Renderer): |
50 def _offset_point(self, vec, to_vec, length): | |
51 offset = vec_from_angle((to_vec - vec).angle, abs(length)) | |
52 if length < 0: | |
53 offset = -offset | |
54 return vec + offset | |
55 | |
56 def _to_pygame(self, surface, *points): | |
57 return [pymunk.pygame_util.to_pygame(p, surface) for p in points] | |
58 | |
59 def draw_bulkhead_line(self, surface, a, b): | |
60 ai = self._offset_point(a, b, 2) | |
61 bi = self._offset_point(b, a, 2) | |
62 a, b, ai, bi = self._to_pygame(surface, a, b, ai, bi) | |
63 pygame.draw.line( | |
64 surface, pygame.color.THECOLORS['black'], a, b, 8) | |
65 pygame.draw.line( | |
66 surface, pygame.color.THECOLORS['lightblue'], ai, bi, 6) | |
67 | |
68 def render(self, surface): | |
69 shape = self.game_object.get_shape() | |
70 if self.game_object.puzzler.get_state(): | |
71 ai = self._offset_point(shape.a, shape.b, 10) | |
72 bi = self._offset_point(shape.b, shape.a, 10) | |
73 self.draw_bulkhead_line(surface, shape.a, ai) | |
74 self.draw_bulkhead_line(surface, bi, shape.b) | |
75 else: | |
76 mid = shape.a + (shape.b - shape.a) / 2 | |
77 self.draw_bulkhead_line(surface, shape.a, mid) | |
78 self.draw_bulkhead_line(surface, mid, shape.b) | |
79 | |
80 | |
207 | 81 def image_pos(image, pos): |
82 return (pos[0] - image.get_width() / 2, | |
83 pos[1] - image.get_height() / 2) | |
84 | |
85 | |
86 class ImageRenderer(Renderer): | |
87 def __init__(self, image): | |
88 self._image = image | |
89 | |
90 def get_image(self): | |
91 return self._image | |
92 | |
93 def rotate_image(self, image): | |
94 angle = self.game_object.get_render_angle() * 180 / math.pi | |
95 return pygame.transform.rotate(image, angle) | |
96 | |
97 def render_image(self, surface, image): | |
98 image = self.rotate_image(image) | |
99 pos = self.game_object.get_render_position(surface) | |
100 surface.blit(image, image_pos(image, pos)) | |
101 | |
102 def render(self, surface): | |
103 self.render_image(surface, self.get_image()) | |
104 super(ImageRenderer, self).render(surface) | |
105 | |
106 | |
107 class ImageStateRenderer(ImageRenderer): | |
108 def __init__(self, state_images): | |
109 self._state_images = state_images | |
110 | |
111 def get_image(self): | |
112 return self._state_images[self.game_object.puzzler.get_state()] | |
113 | |
114 | |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
115 class TimedAnimatedRenderer(ImageRenderer): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
116 def __init__(self, images, frame_ticks=1): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
117 self._images = images |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
118 self._frame_ticks = frame_ticks |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
119 self._frame_tick = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
120 self._frame = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
121 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
122 def advance_tick(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
123 self._frame_tick += 1 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
124 if self._frame_tick > self._frame_ticks: |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
125 self._frame_tick = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
126 self._frame += 1 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
127 if self._frame >= len(self._images): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
128 self._frame = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
129 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
130 def reset(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
131 self._frame_tick = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
132 self._frame = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
133 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
134 def get_image(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
135 return self._images[self._frame] |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
136 |
307
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
137 def update(self, seconds): |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
138 self.advance_tick() |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
139 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
140 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
141 class MovementAnimatedRenderer(TimedAnimatedRenderer): |
307
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
142 def update(self, seconds): |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
143 if self.game_object.is_moving: |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
144 self.advance_tick() |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
145 else: |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
146 self.reset() |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
147 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
148 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
149 class RendererSelectionRenderer(Renderer): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
150 def __init__(self, renderers): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
151 self._renderers = renderers |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
152 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
153 def set_game_object(self, game_object): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
154 self.game_object = game_object |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
155 for renderer in self._renderers.values(): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
156 renderer.set_game_object(game_object) |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
157 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
158 @property |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
159 def renderer(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
160 return self._renderers[self.select_renderer()] |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
161 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
162 def render(self, surface): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
163 return self.renderer.render(surface) |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
164 |
307
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
165 def update(self, seconds): |
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
166 return self.renderer.update(seconds) |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
167 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
168 def select_renderer(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
169 raise NotImplementedError() |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
170 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
171 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
172 class FacingSelectionRenderer(RendererSelectionRenderer): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
173 def select_renderer(self): |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
174 return self.game_object.get_facing_direction() |
207 | 175 |
176 | |
177 class ShapeRenderer(Renderer): | |
178 def render(self, surface): | |
179 self._render_shape(surface) | |
180 super(ShapeRenderer, self).render(surface) | |
181 | |
182 | |
183 class ShapeStateRenderer(ShapeRenderer): | |
184 """Renders the shape in a different colour depending on the state. | |
185 | |
186 Requires the game object it's attached to to have a puzzler. | |
187 """ | |
188 def render(self, surface): | |
189 if self.game_object.puzzler.get_state(): | |
190 color = pygame.color.THECOLORS['green'] | |
191 else: | |
192 color = pygame.color.THECOLORS['red'] | |
193 | |
194 self.game_object.get_shape().color = color | |
195 super(ShapeStateRenderer, self).render(surface) | |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
196 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
197 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
198 class Overlay(object): |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
199 def set_game_object(self, game_object): |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
200 self.game_object = game_object |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
201 |
396
b3df20c76afd
Pass layout hint to overlays
Neil Muller <drnlmuller@gmail.com>
parents:
388
diff
changeset
|
202 def render(self, surface, display_offset, max_width): |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
203 pass |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
204 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
205 def is_visible(self): |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
206 return self.game_object.puzzler.get_state() |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
207 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
208 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
209 class TextOverlay(Overlay): |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
210 def __init__(self, text): |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
211 self.text = text |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
212 self.widget = LabelWidget((20, 20), self.text) |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
213 |
396
b3df20c76afd
Pass layout hint to overlays
Neil Muller <drnlmuller@gmail.com>
parents:
388
diff
changeset
|
214 def render(self, surface, display_offset, max_width): |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
215 x, y = 20, 20 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
216 if display_offset[0] < 0: |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
217 x += abs(display_offset[0]) |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
218 if display_offset[1] < 0: |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
219 y += abs(display_offset[1]) |
397
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
220 if self.widget.rect.width > max_width - 40: |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
221 # Need to relayout the widget |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
222 factor = 2 |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
223 while self.widget.rect.width > max_width - 40: |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
224 wrapped = '\n'.join(textwrap.wrap(self.text, |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
225 len(self.text) // factor)) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
226 factor *= 2 |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
227 self.widget = MultiLineWidget((20, 20), wrapped) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
228 if self.widget.rect.width < 100: |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
229 # safety valve |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
230 break |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
231 self.widget.rect.topleft = (x, y) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
232 self.widget.draw(surface) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
233 # TODO: undo the mad folding |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
234 else: |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
235 self.widget.rect.topleft = (x, y) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
236 self.widget.draw(surface) |
349 | 237 |
238 | |
239 class TiledRenderer(Renderer): | |
240 """Tile the given image to fit the given outline | |
241 | |
242 Outline is assumed to be in pymunk coordinates""" | |
243 | |
362 | 244 def __init__(self, outline, tile_image, alpha=255): |
349 | 245 self._tile_image = tile_image |
246 self.outline = outline | |
247 self._tiled = None | |
353 | 248 self._offset = None |
362 | 249 self._alpha = alpha |
349 | 250 |
400
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
251 def _make_surface(self, surface, image): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
252 size = surface.get_size() |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
253 mask = pygame.surface.Surface(size, pgl.SRCALPHA) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
254 pointlist = [pymunk.pygame_util.to_pygame(p, surface) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
255 for p in self.outline] |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
256 rect = pygame.draw.polygon(mask, |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
257 pygame.color.Color( |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
258 255, 255, 255, self._alpha), |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
259 pointlist, 0) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
260 self._offset = (rect.x, rect.y) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
261 tiled = tile_surface((rect.w, rect.h), image) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
262 tiled.blit(mask, (0, 0), rect, |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
263 special_flags=pgl.BLEND_RGBA_MULT) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
264 return tiled |
349 | 265 |
266 def render(self, surface): | |
400
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
267 if not self._tiled: |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
268 self._tiled = self._make_surface(surface, self._tile_image) |
353 | 269 surface.blit(self._tiled, self._offset) |
349 | 270 super(TiledRenderer, self).render(surface) |
400
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
271 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
272 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
273 class TimedTiledRenderer(TiledRenderer): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
274 """Animate tiles""" |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
275 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
276 # Should make this a mixin with TimeAnimate, but not right now |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
277 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
278 def __init__(self, outline, images, frame_ticks=1, alpha=255): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
279 self._images = images |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
280 self._frame_ticks = frame_ticks |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
281 self.outline = outline |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
282 self._frames = [None] * len(images) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
283 self._offset = None |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
284 self._alpha = alpha |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
285 self._frame = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
286 self._frame_tick = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
287 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
288 def advance_tick(self): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
289 self._frame_tick += 1 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
290 if self._frame_tick > self._frame_ticks: |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
291 self._frame_tick = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
292 self._frame += 1 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
293 if self._frame >= len(self._images): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
294 self._frame = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
295 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
296 def reset(self): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
297 self._frame_tick = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
298 self._frame = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
299 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
300 def update(self, seconds): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
301 self.advance_tick() |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
302 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
303 def render(self, surface): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
304 if not self._frames[self._frame]: |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
305 self._frames[self._frame] = self._make_surface( |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
306 surface, self._images[self._frame]) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
307 self._tiled = self._frames[self._frame] |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
308 super(TimedTiledRenderer, self).render(surface) |