Mercurial > nagslang
annotate nagslang/game_object.py @ 106:bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Mon, 02 Sep 2013 13:48:24 +0200 |
parents | 1be3eebb87c4 |
children | b90d01e4d9d4 |
rev | line source |
---|---|
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
1 import math |
62 | 2 |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
3 import pygame |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
4 import pymunk |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
5 import pymunk.pygame_util |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
6 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
7 from nagslang.constants import SWITCH_PUSHERS, COLLISION_TYPE_SWITCH |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
8 from nagslang.options import options |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
9 |
82 | 10 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
11 class PuzzleGlue(object): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
12 """Glue that holds bits of a puzzle together. |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
13 """ |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
14 def __init__(self): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
15 self._components = {} |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
16 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
17 def add_component(self, name, puzzler): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
18 self._components[name] = puzzler |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
19 puzzler.set_glue(self) |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
20 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
21 def get_state_of(self, name): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
22 return self._components[name].get_state() |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
23 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
24 |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
25 class Puzzler(object): |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
26 """Behaviour specific to a puzzle component. |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
27 """ |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
28 def set_glue(self, glue): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
29 self.glue = glue |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
30 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
31 def get_state(self): |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
32 raise NotImplementedError() |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
33 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
34 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
35 class FloorSwitchPuzzler(Puzzler): |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
36 def __init__(self, space, shape): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
37 self._space = space |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
38 self._shape = shape |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
39 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
40 def get_state(self): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
41 for shape in self._space.shape_query(self._shape): |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
42 if shape.collision_type in SWITCH_PUSHERS: |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
43 return True |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
44 return False |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
45 |
59 | 46 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
47 class StateProxyPuzzler(Puzzler): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
48 def __init__(self, state_source): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
49 self._state_source = state_source |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
50 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
51 def get_state(self): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
52 return self.glue.get_state_of(self._state_source) |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
53 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
54 |
59 | 55 class Physicser(object): |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
56 def __init__(self, space): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
57 self.space = space |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
58 |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
59 def add_to_space(self): |
59 | 60 raise NotImplementedError() |
61 | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
62 def remove_from_space(self): |
59 | 63 raise NotImplementedError() |
64 | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
65 def get_render_position(self, surface): |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
66 raise NotImplementedError() |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
67 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
68 def get_angle(self): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
69 raise NotImplementedError() |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
70 |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
71 def apply_impulse(self, j, r=(0, 0)): |
59 | 72 raise NotImplementedError() |
73 | |
74 | |
75 class SingleShapePhysicser(Physicser): | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
76 def __init__(self, space, shape): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
77 super(SingleShapePhysicser, self).__init__(space) |
59 | 78 self._shape = shape |
79 | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
80 def add_to_space(self): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
81 self.space.add(self._shape) |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
82 if not self._shape.body.is_static: |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
83 self.space.add(self._shape.body) |
59 | 84 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
85 def remove_from_space(self): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
86 self.space.remove(self._shape) |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
87 if not self._shape.body.is_static: |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
88 self.space.remove(self._shape.body) |
59 | 89 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
90 def get_render_position(self, surface): |
59 | 91 pos = self._shape.body.position |
92 return pymunk.pygame_util.to_pygame(pos, surface) | |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
93 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
94 def get_angle(self): |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
95 return self._shape.body.angle |
59 | 96 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
97 def apply_impulse(self, j, r=(0, 0)): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
98 return self._shape.body.apply_impulse(j, r) |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
99 |
59 | 100 |
101 class Renderer(object): | |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
102 def __init__(self, shape): |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
103 self._shape = shape |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
104 |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
105 def _render_shape(self, surface, pos, angle): |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
106 # Less general that pymunk.pygame_util.draw, but also a lot less noisy. |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
107 color = getattr( |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
108 self._shape, 'color', pygame.color.THECOLORS['lightblue']) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
109 # We only explicitly draw Circle and Poly shapes. Everything else we |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
110 # forward to pymunk. |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
111 if isinstance(self._shape, pymunk.Circle): |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
112 centre = pymunk.pygame_util.to_pygame( |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
113 self._shape.body.position, surface) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
114 radius = int(self._shape.radius) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
115 pygame.draw.circle(surface, color, centre, radius, 2) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
116 elif isinstance(self._shape, pymunk.Poly): |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
117 # polygon bounding box |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
118 points = [pymunk.pygame_util.to_pygame(p, surface) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
119 for p in self._shape.get_vertices()] |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
120 pygame.draw.lines(surface, color, True, points, 2) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
121 else: |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
122 pymunk.pygame_util.draw(surface, self._shape) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
123 |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
124 def render(self, surface, pos, angle): |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
125 if options.debug: |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
126 self._render_shape(surface, pos, angle) |
59 | 127 |
128 | |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
129 def image_pos(image, pos): |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
130 return (pos[0] - image.get_width() / 2, |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
131 pos[1] - image.get_height() / 2) |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
132 |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
133 |
59 | 134 class ImageRenderer(Renderer): |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
135 def __init__(self, shape, image): |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
136 super(ImageRenderer, self).__init__(shape) |
59 | 137 self._image = image |
138 | |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
139 def render(self, surface, pos, angle): |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
140 surface.blit(self._image, image_pos(self._image, pos)) |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
141 super(ImageRenderer, self).render(surface, pos, angle) |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
142 |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
143 |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
144 class FacingImageRenderer(Renderer): |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
145 def __init__(self, shape, left_image, right_image): |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
146 super(FacingImageRenderer, self).__init__(shape) |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
147 self._images = { |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
148 'left': left_image, |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
149 'right': right_image, |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
150 } |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
151 |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
152 def get_image(self, angle): |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
153 if abs(angle) < math.pi / 2: |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
154 return self._images['right'] |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
155 return self._images['left'] |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
156 |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
157 def render(self, surface, pos, angle): |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
158 image = self.get_image(angle) |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
159 surface.blit(image, image_pos(image, pos)) |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
160 super(FacingImageRenderer, self).render(surface, pos, angle) |
59 | 161 |
162 | |
163 class ShapeRenderer(Renderer): | |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
164 def render(self, surface, pos, angle): |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
165 self._render_shape(surface, pos, angle) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
166 super(ShapeRenderer, self).render(surface, pos, angle) |
59 | 167 |
168 | |
169 class GameObject(object): | |
170 """A representation of a thing in the game world. | |
171 | |
172 This has a rendery thing, physicsy things and maybe some other things. | |
173 """ | |
174 | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
175 def __init__(self, physicser, renderer, puzzler=None): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
176 self.physicser = physicser |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
177 self.physicser.add_to_space() |
59 | 178 self.renderer = renderer |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
179 self.puzzler = puzzler |
59 | 180 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
181 def get_render_position(self, surface): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
182 return self.physicser.get_render_position(surface) |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
183 |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
184 def get_render_angle(self): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
185 return self.physicser.get_angle() |
59 | 186 |
187 def render(self, surface): | |
60 | 188 return self.renderer.render( |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
189 surface, self.get_render_position(surface), |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
190 self.get_render_angle()) |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
191 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
192 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
193 class FloorSwitch(GameObject): |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
194 def __init__(self, space, position): |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
195 body = pymunk.Body() |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
196 body.position = position |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
197 self.shape = pymunk.Circle(body, 30) |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
198 self.shape.collision_type = COLLISION_TYPE_SWITCH |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
199 self.shape.sensor = True |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
200 super(FloorSwitch, self).__init__( |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
201 SingleShapePhysicser(space, self.shape), |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
202 ShapeRenderer(self.shape), |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
203 FloorSwitchPuzzler(space, self.shape), |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
204 ) |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
205 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
206 def render(self, surface): |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
207 if self.puzzler.get_state(): |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
208 self.shape.color = pygame.color.THECOLORS['green'] |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
209 else: |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
210 self.shape.color = pygame.color.THECOLORS['red'] |
82 | 211 super(FloorSwitch, self).render(surface) |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
212 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
213 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
214 class FloorLight(GameObject): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
215 def __init__(self, space, position, state_source): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
216 body = pymunk.Body() |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
217 body.position = position |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
218 self.shape = pymunk.Circle(body, 10) |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
219 self.shape.collision_type = COLLISION_TYPE_SWITCH |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
220 self.shape.sensor = True |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
221 super(FloorLight, self).__init__( |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
222 SingleShapePhysicser(space, self.shape), |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
223 ShapeRenderer(self.shape), |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
224 StateProxyPuzzler(state_source), |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
225 ) |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
226 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
227 def render(self, surface): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
228 if self.puzzler.get_state(): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
229 self.shape.color = pygame.color.THECOLORS['green'] |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
230 else: |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
231 self.shape.color = pygame.color.THECOLORS['red'] |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
232 super(FloorLight, self).render(surface) |