Mercurial > nagslang
comparison nagslang/protagonist.py @ 156:94a2456696af
front and back views
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Mon, 02 Sep 2013 23:52:24 +0200 |
parents | deac6a4008e7 |
children | 1ee8756888e4 |
comparison
equal
deleted
inserted
replaced
155:b455873020be | 156:94a2456696af |
---|---|
1 import pymunk | 1 import pymunk |
2 import pymunk.pygame_util | 2 import pymunk.pygame_util |
3 | |
4 import math | |
3 | 5 |
4 from nagslang.constants import COLLISION_TYPE_PLAYER, ZORDER_MID | 6 from nagslang.constants import COLLISION_TYPE_PLAYER, ZORDER_MID |
5 from nagslang.game_object import ( | 7 from nagslang.game_object import ( |
6 GameObject, SingleShapePhysicser, AnimatedFacingImageRenderer, make_body) | 8 GameObject, SingleShapePhysicser, AnimatedFacingImageRenderer, make_body) |
7 from nagslang.mutators import FLIP_H | 9 from nagslang.mutators import FLIP_H |
13 | 15 |
14 TODO: Factor out a bunch of this stuff when we need it for other objects. | 16 TODO: Factor out a bunch of this stuff when we need it for other objects. |
15 """ | 17 """ |
16 | 18 |
17 HUMAN_FORM = 'human' | 19 HUMAN_FORM = 'human' |
20 HUMAN_FORM_BACK = 'human_back' | |
18 WOLF_FORM = 'wolf' | 21 WOLF_FORM = 'wolf' |
22 WOLF_FORM_BACK = 'wolf_back' | |
19 | 23 |
20 def __init__(self, space, position): | 24 def __init__(self, space, position): |
21 self._setup_physics(space, position) | 25 self._setup_physics(space, position) |
22 self._setup_renderers() | 26 self._setup_renderers() |
23 self.inventory = {} | 27 self.inventory = {} |
24 self.form = self.HUMAN_FORM | 28 self.form = self.HUMAN_FORM |
29 self.render_form = self.HUMAN_FORM | |
25 | 30 |
26 super(Protagonist, self).__init__( | 31 super(Protagonist, self).__init__( |
27 self._physicsers[self.form], self._renderers[self.form]) | 32 self._physicsers[self.form], self._renderers[self.form]) |
28 self.zorder = ZORDER_MID | 33 self.zorder = ZORDER_MID |
29 | 34 |
61 self._get_image('human_1.png', FLIP_H), | 66 self._get_image('human_1.png', FLIP_H), |
62 self._get_image('human_1.png', FLIP_H), | 67 self._get_image('human_1.png', FLIP_H), |
63 self._get_image('human_2.png', FLIP_H), | 68 self._get_image('human_2.png', FLIP_H), |
64 self._get_image('human_2.png', FLIP_H), | 69 self._get_image('human_2.png', FLIP_H), |
65 self._get_image('human_2.png', FLIP_H))), | 70 self._get_image('human_2.png', FLIP_H))), |
71 self.HUMAN_FORM_BACK: AnimatedFacingImageRenderer( | |
72 (self._get_image('human_back_1.png'), | |
73 self._get_image('human_back_1.png'), | |
74 self._get_image('human_back_1.png'), | |
75 self._get_image('human_back_2.png'), | |
76 self._get_image('human_back_2.png'), | |
77 self._get_image('human_back_2.png')), | |
78 (self._get_image('human_back_1.png', FLIP_H), | |
79 self._get_image('human_back_1.png', FLIP_H), | |
80 self._get_image('human_back_1.png', FLIP_H), | |
81 self._get_image('human_back_2.png', FLIP_H), | |
82 self._get_image('human_back_2.png', FLIP_H), | |
83 self._get_image('human_back_2.png', FLIP_H))), | |
66 self.WOLF_FORM: AnimatedFacingImageRenderer( | 84 self.WOLF_FORM: AnimatedFacingImageRenderer( |
67 (self._get_image('werewolf_1.png'), | 85 (self._get_image('werewolf_1.png'), |
68 self._get_image('werewolf_1.png'), | 86 self._get_image('werewolf_1.png'), |
69 self._get_image('werewolf_1.png'), | 87 self._get_image('werewolf_1.png'), |
70 self._get_image('werewolf_2.png'), | 88 self._get_image('werewolf_2.png'), |
74 self._get_image('werewolf_1.png', FLIP_H), | 92 self._get_image('werewolf_1.png', FLIP_H), |
75 self._get_image('werewolf_1.png', FLIP_H), | 93 self._get_image('werewolf_1.png', FLIP_H), |
76 self._get_image('werewolf_2.png', FLIP_H), | 94 self._get_image('werewolf_2.png', FLIP_H), |
77 self._get_image('werewolf_2.png', FLIP_H), | 95 self._get_image('werewolf_2.png', FLIP_H), |
78 self._get_image('werewolf_2.png', FLIP_H))), | 96 self._get_image('werewolf_2.png', FLIP_H))), |
97 self.WOLF_FORM_BACK: AnimatedFacingImageRenderer( | |
98 (self._get_image('werewolf_back_1.png'), | |
99 self._get_image('werewolf_back_1.png'), | |
100 self._get_image('werewolf_back_1.png'), | |
101 self._get_image('werewolf_back_2.png'), | |
102 self._get_image('werewolf_back_2.png'), | |
103 self._get_image('werewolf_back_2.png')), | |
104 (self._get_image('werewolf_back_1.png', FLIP_H), | |
105 self._get_image('werewolf_back_1.png', FLIP_H), | |
106 self._get_image('werewolf_back_1.png', FLIP_H), | |
107 self._get_image('werewolf_back_2.png', FLIP_H), | |
108 self._get_image('werewolf_back_2.png', FLIP_H), | |
109 self._get_image('werewolf_back_2.png', FLIP_H))), | |
79 } | 110 } |
80 for renderer in self._renderers.values(): | 111 for renderer in self._renderers.values(): |
81 renderer.set_game_object(self) | 112 renderer.set_game_object(self) |
82 | 113 |
83 @classmethod | 114 @classmethod |
97 self._physicsers[self.form].add_to_space() | 128 self._physicsers[self.form].add_to_space() |
98 self._body.mass = 100 | 129 self._body.mass = 100 |
99 self._body.velocity_limit = 1000 | 130 self._body.velocity_limit = 1000 |
100 self.impulse_factor = 4000 | 131 self.impulse_factor = 4000 |
101 self._body.damping = 0.9 | 132 self._body.damping = 0.9 |
102 self.renderer = self._renderers[self.form] | 133 if self.render_form == self.HUMAN_FORM: |
134 self.render_form = self.WOLF_FORM | |
135 elif self.render_form == self.HUMAN_FORM_BACK: | |
136 self.render_form = self.WOLF_FORM_BACK | |
137 else: | |
138 self.render_form = self.WOLF_FORM | |
139 self.renderer = self._renderers[self.render_form] | |
103 | 140 |
104 def go_human(self): | 141 def go_human(self): |
105 self._physicsers[self.form].remove_from_space() | 142 self._physicsers[self.form].remove_from_space() |
106 self.form = self.HUMAN_FORM | 143 self.form = self.HUMAN_FORM |
107 self._physicsers[self.form].add_to_space() | 144 self._physicsers[self.form].add_to_space() |
108 self._body.mass = 10 | 145 self._body.mass = 10 |
109 self._body.velocity_limit = 1000 | 146 self._body.velocity_limit = 1000 |
110 self.impulse_factor = 500 | 147 self.impulse_factor = 500 |
111 self._body.damping = 0.8 | 148 self._body.damping = 0.8 |
112 self.renderer = self._renderers[self.form] | 149 if self.render_form == self.WOLF_FORM: |
150 self.render_form = self.HUMAN_FORM | |
151 elif self.render_form == self.WOLF_FORM_BACK: | |
152 self.render_form = self.HUMAN_FORM_BACK | |
153 else: | |
154 self.render_form = self.HUMAN_FORM | |
155 self.renderer = self._renderers[self.render_form] | |
156 | |
157 def _switch_to_back(self): | |
158 if self.render_form == self.HUMAN_FORM: | |
159 self.render_form = self.HUMAN_FORM_BACK | |
160 elif self.render_form == self.WOLF_FORM: | |
161 self.render_form = self.WOLF_FORM_BACK | |
162 self.renderer = self._renderers[self.render_form] | |
163 | |
164 def _switch_to_front(self): | |
165 if self.render_form == self.HUMAN_FORM_BACK: | |
166 self.render_form = self.HUMAN_FORM | |
167 elif self.render_form == self.WOLF_FORM_BACK: | |
168 self.render_form = self.WOLF_FORM | |
169 self.renderer = self._renderers[self.render_form] | |
113 | 170 |
114 def set_direction(self, dx, dy): | 171 def set_direction(self, dx, dy): |
115 if (dx, dy) == (0, 0): | 172 if (dx, dy) == (0, 0): |
116 self.renderer.stop() | 173 self.renderer.stop() |
117 return | 174 return |
175 old_angle = self.angle | |
118 self.angle = pymunk.Vec2d((dx, dy)).angle | 176 self.angle = pymunk.Vec2d((dx, dy)).angle |
177 # If we've gone from quadrants 2 & 3 to 1 & 4 (or vice versa) | |
178 # switch between front & back views | |
179 if self.angle != math.pi: | |
180 # == math.pi is going straight left, which can't | |
181 # trigger a front/back swap and simplifies these checks | |
182 if self.angle > 0 and old_angle != self.angle: | |
183 self._switch_to_back() | |
184 elif self.angle < 0 and old_angle != self.angle: | |
185 self._switch_to_front() | |
119 self._body.apply_impulse( | 186 self._body.apply_impulse( |
120 (dx * self.impulse_factor, dy * self.impulse_factor)) | 187 (dx * self.impulse_factor, dy * self.impulse_factor)) |
121 self.renderer.start() | 188 self.renderer.start() |
122 | 189 |
123 def toggle_form(self): | 190 def toggle_form(self): |