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):