Mercurial > nagslang
annotate nagslang/game_object.py @ 180:026297a03963
Add DoorEvent and tweak ScreenChange to keep more state when the player goes through a door
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Tue, 03 Sep 2013 16:58:45 +0200 |
parents | 054944c6472b |
children | dfacd08b8566 |
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 |
107 | 7 from nagslang.constants import ( |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
8 SWITCH_PUSHERS, COLLISION_TYPE_SWITCH, COLLISION_TYPE_BOX, ZORDER_LOW, |
176 | 9 ZORDER_FLOOR, COLLISION_TYPE_DOOR, COLLISION_TYPE_PLAYER) |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
10 from nagslang.options import options |
155
b455873020be
Crates look like crates.
Jeremy Thurgood <firxen@gmail.com>
parents:
145
diff
changeset
|
11 from nagslang.resources import resources |
180
026297a03963
Add DoorEvent and tweak ScreenChange to keep more state when the player goes through a door
Neil Muller <drnlmuller@gmail.com>
parents:
176
diff
changeset
|
12 from nagslang.events import DoorEvent |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
13 |
82 | 14 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
15 class PuzzleGlue(object): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
16 """Glue that holds bits of a puzzle together. |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
17 """ |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
18 def __init__(self): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
19 self._components = {} |
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 add_component(self, name, puzzler): |
145
0c49627920eb
Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
22 if not isinstance(puzzler, Puzzler): |
0c49627920eb
Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
23 puzzler = puzzler.puzzler |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
24 self._components[name] = puzzler |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
25 puzzler.set_glue(self) |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
26 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
27 def get_state_of(self, name): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
28 return self._components[name].get_state() |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
29 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
30 |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
31 class Puzzler(object): |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
32 """Behaviour specific to a puzzle component. |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
33 """ |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
34 def set_glue(self, glue): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
35 self.glue = glue |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
36 |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
37 def set_game_object(self, game_object): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
38 self.game_object = game_object |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
39 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
40 def get_state(self): |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
41 raise NotImplementedError() |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
42 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
43 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
44 class FloorSwitchPuzzler(Puzzler): |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
45 def get_state(self): |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
46 space = self.game_object.get_space() |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
47 for shape in space.shape_query(self.game_object.get_shape()): |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
48 if shape.collision_type in SWITCH_PUSHERS: |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
49 return True |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
50 return False |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
51 |
59 | 52 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
53 class StateProxyPuzzler(Puzzler): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
54 def __init__(self, state_source): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
55 self._state_source = state_source |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
56 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
57 def get_state(self): |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
58 return self.glue.get_state_of(self._state_source) |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
59 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
60 |
140 | 61 class StateLogicalAndPuzzler(Puzzler): |
62 def __init__(self, *state_sources): | |
63 self._state_sources = state_sources | |
64 | |
65 def get_state(self): | |
66 for state_source in self._state_sources: | |
67 if not self.glue.get_state_of(state_source): | |
68 return False | |
69 return True | |
70 | |
71 | |
59 | 72 class Physicser(object): |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
73 def __init__(self, space): |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
74 self._space = space |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
75 |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
76 def get_space(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
77 return self._space |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
78 |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
79 def set_game_object(self, game_object): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
80 self.game_object = game_object |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
81 |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
82 def get_shape(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
83 raise NotImplementedError() |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
84 |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
85 def add_to_space(self): |
59 | 86 raise NotImplementedError() |
87 | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
88 def remove_from_space(self): |
59 | 89 raise NotImplementedError() |
90 | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
91 def get_render_position(self, surface): |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
92 raise NotImplementedError() |
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): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
95 raise NotImplementedError() |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
96 |
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)): |
59 | 98 raise NotImplementedError() |
99 | |
100 | |
101 class SingleShapePhysicser(Physicser): | |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
102 def __init__(self, space, shape): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
103 super(SingleShapePhysicser, self).__init__(space) |
59 | 104 self._shape = shape |
105 | |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
106 def get_shape(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
107 return self._shape |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
108 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
109 def add_to_space(self): |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
110 self.get_space().add(self._shape) |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
111 if not self._shape.body.is_static: |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
112 self.get_space().add(self._shape.body) |
59 | 113 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
114 def remove_from_space(self): |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
115 self.get_space().remove(self._shape) |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
116 if not self._shape.body.is_static: |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
117 self.get_space().remove(self._shape.body) |
59 | 118 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
119 def get_render_position(self, surface): |
59 | 120 pos = self._shape.body.position |
121 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
|
122 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
123 def get_angle(self): |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
124 return self._shape.body.angle |
59 | 125 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
126 def apply_impulse(self, j, r=(0, 0)): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
127 return self._shape.body.apply_impulse(j, r) |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
128 |
59 | 129 |
130 class Renderer(object): | |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
131 def set_game_object(self, game_object): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
132 self.game_object = game_object |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
133 |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
134 def _render_shape(self, surface): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
135 shape = self.game_object.get_shape() |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
136 # Less general that pymunk.pygame_util.draw, but also a lot less noisy. |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
137 color = getattr(shape, 'color', pygame.color.THECOLORS['lightblue']) |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
138 # 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
|
139 # forward to pymunk. |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
140 if isinstance(shape, pymunk.Circle): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
141 centre = pymunk.pygame_util.to_pygame(shape.body.position, surface) |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
142 radius = int(shape.radius) |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
143 pygame.draw.circle(surface, color, centre, radius, 2) |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
144 elif isinstance(shape, pymunk.Poly): |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
145 # polygon bounding box |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
146 points = [pymunk.pygame_util.to_pygame(p, surface) |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
147 for p in shape.get_vertices()] |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
148 pygame.draw.lines(surface, color, True, points, 2) |
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
149 else: |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
150 pymunk.pygame_util.draw(surface, shape) |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
151 |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
152 def render(self, surface): |
104
1be3eebb87c4
More consistent debug rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
93
diff
changeset
|
153 if options.debug: |
155
b455873020be
Crates look like crates.
Jeremy Thurgood <firxen@gmail.com>
parents:
145
diff
changeset
|
154 self._render_shape(surface) |
59 | 155 |
143
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
156 def animate(self): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
157 # Used by time animatations to advance the clock |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
158 pass |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
159 |
59 | 160 |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
161 def image_pos(image, pos): |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
162 return (pos[0] - image.get_width() / 2, |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
163 pos[1] - image.get_height() / 2) |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
164 |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
165 |
59 | 166 class ImageRenderer(Renderer): |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
167 def __init__(self, image): |
59 | 168 self._image = image |
169 | |
160
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
170 def get_image(self): |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
171 return self._image |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
172 |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
173 def rotate_image(self, image): |
155
b455873020be
Crates look like crates.
Jeremy Thurgood <firxen@gmail.com>
parents:
145
diff
changeset
|
174 angle = self.game_object.get_render_angle() * 180 / math.pi |
160
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
175 return pygame.transform.rotate(image, angle) |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
176 |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
177 def render_image(self, surface, image): |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
178 image = self.rotate_image(image) |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
179 pos = self.game_object.get_render_position(surface) |
155
b455873020be
Crates look like crates.
Jeremy Thurgood <firxen@gmail.com>
parents:
145
diff
changeset
|
180 surface.blit(image, image_pos(image, pos)) |
160
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
181 |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
182 def render(self, surface): |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
183 self.render_image(surface, self.get_image()) |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
184 super(ImageRenderer, self).render(surface) |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
185 |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
186 |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
187 class ImageStateRenderer(ImageRenderer): |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
188 def __init__(self, state_images): |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
189 self._state_images = state_images |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
190 |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
191 def get_image(self): |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
192 return self._state_images[self.game_object.puzzler.get_state()] |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
193 |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
194 |
160
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
195 class FacingImageRenderer(ImageRenderer): |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
196 def __init__(self, left_image, right_image): |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
197 self._images = { |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
198 'left': left_image, |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
199 'right': right_image, |
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
200 } |
159 | 201 self._face = 'left' |
202 | |
203 def _update_facing(self, angle): | |
204 if abs(angle) < math.pi / 2: | |
205 self._face = 'right' | |
206 elif abs(angle) > math.pi / 2: | |
207 self._face = 'left' | |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
208 |
160
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
209 def rotate_image(self, image): |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
210 # Facing images don't get rotated. |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
211 return image |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
212 |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
213 def get_facing_image(self): |
159 | 214 return self._images[self._face] |
63
7f038ee778ad
Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents:
62
diff
changeset
|
215 |
160
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
216 def get_image(self): |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
217 angle = self.game_object.get_render_angle() |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
218 self._update_facing(angle) |
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
219 return self.get_facing_image() |
59 | 220 |
221 | |
143
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
222 class AnimatedFacingImageRenderer(FacingImageRenderer): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
223 def __init__(self, left_images, right_images): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
224 self._images = { |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
225 'left': left_images, |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
226 'right': right_images, |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
227 } |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
228 self._frame = 0 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
229 self._moving = False |
159 | 230 self._face = 'left' |
143
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
231 |
160
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
232 def get_facing_image(self): |
159 | 233 if self._frame >= len(self._images[self._face]): |
143
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
234 self._frame = 0 |
159 | 235 return self._images[self._face][self._frame] |
143
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
236 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
237 def animate(self): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
238 if self._moving: |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
239 self._frame += 1 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
240 else: |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
241 self._frame = 0 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
242 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
243 def start(self): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
244 self._moving = True |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
245 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
246 def stop(self): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
247 self._moving = False |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
248 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
249 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
250 class TimedAnimatedRenderer(ImageRenderer): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
251 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
252 def __init__(self, images): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
253 self._images = images |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
254 self._frame = 0 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
255 self._image = None |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
256 |
160
0c9b0449485e
Consolidate image rendering stuff a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
159
diff
changeset
|
257 def get_image(self): |
143
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
258 if self._frame > len(self._imaages): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
259 self._frame = 0 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
260 return self._images[self._frame] |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
261 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
262 def animate(self): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
263 self._frame += 1 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
264 |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
265 |
133 | 266 class ShapeRenderer(Renderer): |
267 def render(self, surface): | |
268 self._render_shape(surface) | |
269 super(ShapeRenderer, self).render(surface) | |
270 | |
271 | |
272 class ShapeStateRenderer(ShapeRenderer): | |
126
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
273 """Renders the shape in a different colour depending on the state. |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
274 |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
275 Requires the game object it's attached to to have a puzzler. |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
276 """ |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
277 def render(self, surface): |
126
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
278 if self.game_object.puzzler.get_state(): |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
279 color = pygame.color.THECOLORS['green'] |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
280 else: |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
281 color = pygame.color.THECOLORS['red'] |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
282 |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
283 self.game_object.get_shape().color = color |
c3af35561494
Cleaner switch/light rendering.
Jeremy Thurgood <firxen@gmail.com>
parents:
123
diff
changeset
|
284 super(ShapeStateRenderer, self).render(surface) |
59 | 285 |
286 | |
133 | 287 def damping_velocity_func(body, gravity, damping, dt): |
288 """Apply custom damping to this body's velocity. | |
289 """ | |
290 damping = getattr(body, 'damping', damping) | |
291 return pymunk.Body.update_velocity(body, gravity, damping, dt) | |
292 | |
293 | |
294 def make_body(mass, moment, position, damping=None): | |
295 body = pymunk.Body(mass, moment) | |
145
0c49627920eb
Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
296 body.position = tuple(position) |
133 | 297 if damping is not None: |
298 body.damping = damping | |
299 body.velocity_func = damping_velocity_func | |
300 return body | |
301 | |
302 | |
59 | 303 class GameObject(object): |
304 """A representation of a thing in the game world. | |
305 | |
306 This has a rendery thing, physicsy things and maybe some other things. | |
307 """ | |
308 | |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
309 zorder = ZORDER_LOW |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
310 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
311 def __init__(self, physicser, renderer, puzzler=None): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
312 self.physicser = physicser |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
313 physicser.set_game_object(self) |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
314 self.physicser.add_to_space() |
59 | 315 self.renderer = renderer |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
316 renderer.set_game_object(self) |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
317 self.puzzler = puzzler |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
318 if puzzler is not None: |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
319 puzzler.set_game_object(self) |
59 | 320 |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
321 def get_space(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
322 return self.physicser.get_space() |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
323 |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
324 def get_shape(self): |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
325 return self.physicser.get_shape() |
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
326 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
327 def get_render_position(self, surface): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
328 return self.physicser.get_render_position(surface) |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
329 |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
330 def get_render_angle(self): |
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
331 return self.physicser.get_angle() |
59 | 332 |
333 def render(self, surface): | |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
334 return self.renderer.render(surface) |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
335 |
143
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
336 def animate(self): |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
337 self.renderer.animate() |
deac6a4008e7
Hook up protagnist animations
Neil Muller <drnlmuller@gmail.com>
parents:
140
diff
changeset
|
338 |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
339 |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
340 class FloorSwitch(GameObject): |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
341 zorder = ZORDER_FLOOR |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
342 |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
343 def __init__(self, space, position): |
145
0c49627920eb
Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
344 body = make_body(None, None, position) |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
345 self.shape = pymunk.Circle(body, 30) |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
346 self.shape.collision_type = COLLISION_TYPE_SWITCH |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
347 self.shape.sensor = True |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
348 super(FloorSwitch, self).__init__( |
93
d6a49f0c1e6e
Rectangular human protagonist shape, refactored physicsers.
Jeremy Thurgood <firxen@gmail.com>
parents:
91
diff
changeset
|
349 SingleShapePhysicser(space, self.shape), |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
350 ImageStateRenderer({ |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
351 True: resources.get_image('objects', 'sensor_on.png'), |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
352 False: resources.get_image('objects', 'sensor_off.png'), |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
353 }), |
123
23b533d6f27e
Rearrange game objects a bit.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
354 FloorSwitchPuzzler(), |
81
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
355 ) |
a1b4d09e6f23
Floor switch with horrible hackery.
davidsharpe@lantea.local
parents:
63
diff
changeset
|
356 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
357 |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
358 class FloorLight(GameObject): |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
359 zorder = ZORDER_FLOOR |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
360 |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
361 def __init__(self, space, position, state_source): |
145
0c49627920eb
Load game objects from level.
Jeremy Thurgood <firxen@gmail.com>
parents:
143
diff
changeset
|
362 body = make_body(None, None, position) |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
363 self.shape = pymunk.Circle(body, 10) |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
364 self.shape.collision_type = COLLISION_TYPE_SWITCH |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
365 self.shape.sensor = True |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
366 super(FloorLight, self).__init__( |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
367 SingleShapePhysicser(space, self.shape), |
162
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
368 ImageStateRenderer({ |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
369 True: resources.get_image('objects', 'light_on.png'), |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
370 False: resources.get_image('objects', 'light_off.png'), |
507df17cfbaf
Pictures for lights and switches.
Jeremy Thurgood <firxen@gmail.com>
parents:
160
diff
changeset
|
371 }), |
106
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
372 StateProxyPuzzler(state_source), |
bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
Jeremy Thurgood <firxen@gmail.com>
parents:
104
diff
changeset
|
373 ) |
133 | 374 |
375 | |
376 class Box(GameObject): | |
377 def __init__(self, space, position): | |
378 body = make_body(10, 10000, position, damping=0.5) | |
379 self.shape = pymunk.Poly( | |
380 body, [(-20, -20), (20, -20), (20, 20), (-20, 20)]) | |
381 self.shape.collision_type = COLLISION_TYPE_BOX | |
382 super(Box, self).__init__( | |
383 SingleShapePhysicser(space, self.shape), | |
155
b455873020be
Crates look like crates.
Jeremy Thurgood <firxen@gmail.com>
parents:
145
diff
changeset
|
384 ImageRenderer(resources.get_image('objects', 'crate.png')), |
133 | 385 ) |
176 | 386 |
387 | |
388 class Door(GameObject): | |
389 zorder = ZORDER_FLOOR | |
390 | |
391 def __init__(self, space, position, destination, dest_pos): | |
392 body = make_body(pymunk.inf, pymunk.inf, position, damping=0.5) | |
393 self.shape = pymunk.Poly( | |
394 body, [(-32, -32), (32, -32), (32, 32), (-32, 32)]) | |
395 self.shape.collision_type = COLLISION_TYPE_DOOR | |
396 self.shape.sensor = True | |
397 self.destination = destination | |
398 self.dest_pos = tuple(dest_pos) | |
399 super(Door, self).__init__( | |
400 SingleShapePhysicser(space, self.shape), | |
401 ImageRenderer(resources.get_image('objects', 'door.png')), | |
402 ) | |
403 | |
404 def animate(self): | |
405 space = self.get_space() | |
406 for shape in space.shape_query(self.get_shape()): | |
407 if shape.collision_type == COLLISION_TYPE_PLAYER: | |
408 # Force to new position | |
180
026297a03963
Add DoorEvent and tweak ScreenChange to keep more state when the player goes through a door
Neil Muller <drnlmuller@gmail.com>
parents:
176
diff
changeset
|
409 DoorEvent.post(self.destination, self.dest_pos) |