Mercurial > nagslang
annotate nagslang/render.py @ 647:aeb366d97774
Show splash image on startup
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sun, 08 Sep 2013 02:02:09 +0200 |
parents | 9ea26b835271 |
children |
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 |
609 | 50 class HatchRendererMixin(object): |
558
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 |
609 | 59 def render_hatch(self, surface): |
474 | 60 shape = self.game_object.get_shape() |
609 | 61 a = shape.body.local_to_world(shape.a) |
62 b = shape.body.local_to_world(shape.b) | |
474 | 63 if self.game_object.puzzler.get_state(): |
609 | 64 offset = vec_from_angle((b - a).angle, 10) |
65 ai = a + offset | |
66 bi = b - offset | |
67 self.draw_hatch_line(surface, a, ai) | |
68 self.draw_hatch_line(surface, bi, b) | |
474 | 69 else: |
609 | 70 mid = a + (b - a) / 2 |
71 self.draw_hatch_line(surface, a, mid) | |
72 self.draw_hatch_line(surface, mid, b) | |
73 | |
74 | |
75 class HatchRenderer(Renderer, HatchRendererMixin): | |
76 def render(self, surface): | |
77 self.render_hatch(surface) | |
474 | 78 |
79 | |
207 | 80 def image_pos(image, pos): |
81 return (pos[0] - image.get_width() / 2, | |
82 pos[1] - image.get_height() / 2) | |
83 | |
84 | |
85 class ImageRenderer(Renderer): | |
86 def __init__(self, image): | |
87 self._image = image | |
88 | |
89 def get_image(self): | |
90 return self._image | |
91 | |
92 def rotate_image(self, image): | |
93 angle = self.game_object.get_render_angle() * 180 / math.pi | |
94 return pygame.transform.rotate(image, angle) | |
95 | |
96 def render_image(self, surface, image): | |
97 image = self.rotate_image(image) | |
98 pos = self.game_object.get_render_position(surface) | |
99 surface.blit(image, image_pos(image, pos)) | |
100 | |
101 def render(self, surface): | |
102 self.render_image(surface, self.get_image()) | |
103 super(ImageRenderer, self).render(surface) | |
104 | |
105 | |
609 | 106 class KeyedHatchRenderer(ImageRenderer, HatchRendererMixin): |
107 def render(self, surface): | |
108 self.render_hatch(surface) | |
109 if not self.game_object.puzzler.get_state(): | |
110 self.render_image(surface, self.get_image()) | |
111 | |
112 | |
207 | 113 class ImageStateRenderer(ImageRenderer): |
114 def __init__(self, state_images): | |
115 self._state_images = state_images | |
116 | |
117 def get_image(self): | |
118 return self._state_images[self.game_object.puzzler.get_state()] | |
119 | |
120 | |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
121 class TimedAnimatedRenderer(ImageRenderer): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
122 def __init__(self, images, frame_ticks=1): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
123 self._images = images |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
124 self._frame_ticks = 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 = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
127 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
128 def advance_tick(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
129 self._frame_tick += 1 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
130 if self._frame_tick > self._frame_ticks: |
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 += 1 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
133 if self._frame >= len(self._images): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
134 self._frame = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
135 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
136 def reset(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
137 self._frame_tick = 0 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
138 self._frame = 0 |
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 def get_image(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
141 return self._images[self._frame] |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
142 |
307
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
143 def update(self, seconds): |
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 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
146 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
147 class MovementAnimatedRenderer(TimedAnimatedRenderer): |
307
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
148 def update(self, seconds): |
218
9e2ef2f15035
Better rendering and movement detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
217
diff
changeset
|
149 if self.game_object.is_moving: |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
150 self.advance_tick() |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
151 else: |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
152 self.reset() |
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 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
155 class RendererSelectionRenderer(Renderer): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
156 def __init__(self, renderers): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
157 self._renderers = renderers |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
158 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
159 def set_game_object(self, game_object): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
160 self.game_object = game_object |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
161 for renderer in self._renderers.values(): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
162 renderer.set_game_object(game_object) |
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 @property |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
165 def renderer(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
166 return self._renderers[self.select_renderer()] |
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 render(self, surface): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
169 return self.renderer.render(surface) |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
170 |
307
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
171 def update(self, seconds): |
c2bbb1e70d6f
Rename animate to update and pass seconds, for future fun
Neil Muller <drnlmuller@gmail.com>
parents:
286
diff
changeset
|
172 return self.renderer.update(seconds) |
217
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
173 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
174 def select_renderer(self): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
175 raise NotImplementedError() |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
176 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
177 |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
178 class FacingSelectionRenderer(RendererSelectionRenderer): |
d98daba73055
Composition-based renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
207
diff
changeset
|
179 def select_renderer(self): |
229
329b3044ddef
Much better facing renderers.
Jeremy Thurgood <firxen@gmail.com>
parents:
222
diff
changeset
|
180 return self.game_object.get_facing_direction() |
207 | 181 |
182 | |
183 class ShapeRenderer(Renderer): | |
184 def render(self, surface): | |
185 self._render_shape(surface) | |
186 super(ShapeRenderer, self).render(surface) | |
187 | |
188 | |
189 class ShapeStateRenderer(ShapeRenderer): | |
190 """Renders the shape in a different colour depending on the state. | |
191 | |
192 Requires the game object it's attached to to have a puzzler. | |
193 """ | |
194 def render(self, surface): | |
195 if self.game_object.puzzler.get_state(): | |
196 color = pygame.color.THECOLORS['green'] | |
197 else: | |
198 color = pygame.color.THECOLORS['red'] | |
199 | |
200 self.game_object.get_shape().color = color | |
201 super(ShapeStateRenderer, self).render(surface) | |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
202 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
203 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
204 class Overlay(object): |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
205 def set_game_object(self, game_object): |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
206 self.game_object = game_object |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
207 |
396
b3df20c76afd
Pass layout hint to overlays
Neil Muller <drnlmuller@gmail.com>
parents:
388
diff
changeset
|
208 def render(self, surface, display_offset, max_width): |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
209 pass |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
210 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
211 def is_visible(self): |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
212 return self.game_object.puzzler.get_state() |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
213 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
214 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
215 class TextOverlay(Overlay): |
521
61e3e5d28a05
Sligthly pinker ephemeral notes
Stefano Rivera <stefano@rivera.za.net>
parents:
488
diff
changeset
|
216 def __init__(self, text, **kwargs): |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
217 self.text = text |
521
61e3e5d28a05
Sligthly pinker ephemeral notes
Stefano Rivera <stefano@rivera.za.net>
parents:
488
diff
changeset
|
218 self.widget = LabelWidget((20, 20), self.text, **kwargs) |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
219 |
396
b3df20c76afd
Pass layout hint to overlays
Neil Muller <drnlmuller@gmail.com>
parents:
388
diff
changeset
|
220 def render(self, surface, display_offset, max_width): |
222
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
221 x, y = 20, 20 |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
222 if display_offset[0] < 0: |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
223 x += abs(display_offset[0]) |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
224 if display_offset[1] < 0: |
cc5f2a5ac501
Overlays belong in render
Stefano Rivera <stefano@rivera.za.net>
parents:
221
diff
changeset
|
225 y += abs(display_offset[1]) |
397
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
226 if self.widget.rect.width > max_width - 40: |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
227 # Need to relayout the widget |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
228 factor = 2 |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
229 while self.widget.rect.width > max_width - 40: |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
230 wrapped = '\n'.join(textwrap.wrap(self.text, |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
231 len(self.text) // factor)) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
232 factor *= 2 |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
233 self.widget = MultiLineWidget((20, 20), wrapped) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
234 if self.widget.rect.width < 100: |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
235 # safety valve |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
236 break |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
237 self.widget.rect.topleft = (x, y) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
238 self.widget.draw(surface) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
239 # TODO: undo the mad folding |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
240 else: |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
241 self.widget.rect.topleft = (x, y) |
a08965437df2
Fold long text messages somewhat
Neil Muller <drnlmuller@gmail.com>
parents:
396
diff
changeset
|
242 self.widget.draw(surface) |
349 | 243 |
244 | |
647
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
245 class ImageOverlay(Overlay): |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
246 def __init__(self, image): |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
247 self.image = image |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
248 |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
249 def render(self, surface, display_offset, max_width): |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
250 x = (surface.get_width() - self.image.get_width()) / 2 |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
251 y = (surface.get_height() - self.image.get_height()) / 2 |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
252 surface.blit(self.image, (x, y)) |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
253 |
aeb366d97774
Show splash image on startup
Stefano Rivera <stefano@rivera.za.net>
parents:
609
diff
changeset
|
254 |
349 | 255 class TiledRenderer(Renderer): |
256 """Tile the given image to fit the given outline | |
257 | |
258 Outline is assumed to be in pymunk coordinates""" | |
259 | |
362 | 260 def __init__(self, outline, tile_image, alpha=255): |
349 | 261 self._tile_image = tile_image |
262 self.outline = outline | |
263 self._tiled = None | |
353 | 264 self._offset = None |
362 | 265 self._alpha = alpha |
349 | 266 |
400
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
267 def _make_surface(self, surface, image): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
268 size = surface.get_size() |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
269 mask = pygame.surface.Surface(size, pgl.SRCALPHA) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
270 pointlist = [pymunk.pygame_util.to_pygame(p, surface) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
271 for p in self.outline] |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
272 rect = pygame.draw.polygon(mask, |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
273 pygame.color.Color( |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
274 255, 255, 255, self._alpha), |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
275 pointlist, 0) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
276 self._offset = (rect.x, rect.y) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
277 tiled = tile_surface((rect.w, rect.h), image) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
278 tiled.blit(mask, (0, 0), rect, |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
279 special_flags=pgl.BLEND_RGBA_MULT) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
280 return tiled |
349 | 281 |
282 def render(self, surface): | |
400
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
283 if not self._tiled: |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
284 self._tiled = self._make_surface(surface, self._tile_image) |
353 | 285 surface.blit(self._tiled, self._offset) |
349 | 286 super(TiledRenderer, self).render(surface) |
400
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 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
289 class TimedTiledRenderer(TiledRenderer): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
290 """Animate tiles""" |
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 # 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
|
293 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
294 def __init__(self, outline, images, frame_ticks=1, alpha=255): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
295 self._images = images |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
296 self._frame_ticks = frame_ticks |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
297 self.outline = outline |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
298 self._frames = [None] * len(images) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
299 self._offset = None |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
300 self._alpha = alpha |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
301 self._frame = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
302 self._frame_tick = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
303 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
304 def advance_tick(self): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
305 self._frame_tick += 1 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
306 if self._frame_tick > self._frame_ticks: |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
307 self._frame_tick = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
308 self._frame += 1 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
309 if self._frame >= len(self._images): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
310 self._frame = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
311 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
312 def reset(self): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
313 self._frame_tick = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
314 self._frame = 0 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
315 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
316 def update(self, seconds): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
317 self.advance_tick() |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
318 |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
319 def render(self, surface): |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
320 if not self._frames[self._frame]: |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
321 self._frames[self._frame] = self._make_surface( |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
322 surface, self._images[self._frame]) |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
323 self._tiled = self._frames[self._frame] |
4523b1ff17ae
Hack together tile animation
Neil Muller <drnlmuller@gmail.com>
parents:
397
diff
changeset
|
324 super(TimedTiledRenderer, self).render(surface) |