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