Changeset 334:a3f1b2f0e3fb
- Timestamp:
- 09/06/13 09:39:48 (9 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- nagslang
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
nagslang/enemies.py
r333 r334 11 11 from nagslang.mutators import FLIP_H 12 12 from nagslang.resources import resources 13 from nagslang.utils import vec_with_length 13 14 14 15 … … 22 23 23 24 25 def get_alien_image(enemy_type, suffix, *transforms): 26 image_name = 'alien_%s_%s.png' % (enemy_type, suffix) 27 return resources.get_image('creatures', image_name, transforms=transforms) 28 29 24 30 class Enemy(GameObject): 25 31 """A base class for mobile enemies""" 26 enemy_type = None # Image to use for dead Enemy 32 zorder = ZORDER_MID 33 enemy_type = None # Which set of images to use 27 34 enemy_damage = None 35 health = None 36 impulse_factor = None 28 37 29 38 def __init__(self, space, world, position): 30 self._setup_physics(space, position)31 self._setup_renderer()32 self.health = 4233 34 39 super(Enemy, self).__init__( 35 self._physicser, self.renderer) 36 self.zorder = ZORDER_MID 40 self.make_physics(space, position), self.make_renderer()) 37 41 self.world = world 38 39 def _get_image(self, name, *transforms): 40 return resources.get_image('creatures', name, transforms=transforms) 41 42 def _setup_physics(self, space, position): 42 self.angle = 0 43 44 def make_physics(self, space, position): 43 45 raise NotImplementedError 44 46 45 def _setup_renderer(self): 46 raise NotImplementedError 47 def make_renderer(self): 48 return render.FacingSelectionRenderer({ 49 'left': render.TimedAnimatedRenderer( 50 [get_alien_image(self.enemy_type, '1'), 51 get_alien_image(self.enemy_type, '2')], 3), 52 'right': render.TimedAnimatedRenderer( 53 [get_alien_image(self.enemy_type, '1', FLIP_H), 54 get_alien_image(self.enemy_type, '2', FLIP_H)], 3), 55 }) 47 56 48 57 def attack(self): … … 62 71 self.remove = True 63 72 EnemyDeathEvent.post(self.physicser.position, self.enemy_type) 73 74 def set_direction(self, dx, dy): 75 vec = vec_with_length((dx, dy), self.impulse_factor) 76 self.angle = vec.angle 77 self.physicser.apply_impulse(vec) 64 78 65 79 def collide_with_protagonist(self, protagonist): … … 92 106 is_moving = True # Always walking. 93 107 enemy_type = 'A' 108 health = 42 109 impulse_factor = 50 94 110 95 111 def __init__(self, space, world, position, end_position): … … 100 116 self._direction = 'away' 101 117 102 def _setup_physics(self, space, position): 103 self._body = make_body(10, pymunk.inf, position, 0.8) 104 105 self._shape = pymunk.Circle(self._body, 30) 106 107 self._shape.elasticity = 1.0 108 self._shape.friction = 0.05 109 self._shape.collision_type = COLLISION_TYPE_ENEMY 110 self._physicser = SingleShapePhysicser(space, self._shape) 111 self.impulse_factor = 50 112 self.angle = 0 113 114 def _setup_renderer(self): 115 self.renderer = render.FacingSelectionRenderer({ 116 'left': render.TimedAnimatedRenderer( 117 [self._get_image('alien_A_1.png'), 118 self._get_image('alien_A_2.png')], 3), 119 'right': render.TimedAnimatedRenderer( 120 [self._get_image('alien_A_1.png', FLIP_H), 121 self._get_image('alien_A_2.png', FLIP_H)], 3), 122 }) 118 def make_physics(self, space, position): 119 body = make_body(10, pymunk.inf, position, 0.8) 120 shape = pymunk.Circle(body, 30) 121 shape.elasticity = 1.0 122 shape.friction = 0.05 123 shape.collision_type = COLLISION_TYPE_ENEMY 124 return SingleShapePhysicser(space, shape) 123 125 124 126 def get_render_angle(self): … … 139 141 self._direction = 'away' 140 142 141 def set_direction(self, dx, dy):142 self.angle = pymunk.Vec2d((dx, dy)).angle143 self._body.apply_impulse(144 (dx * self.impulse_factor, dy * self.impulse_factor))145 146 143 def update(self, dt): 147 144 # Calculate the step every frame … … 152 149 x_step = 0 153 150 y_step = 0 154 if (target[0] < self. _body.position[0]):155 x_step = max(-1, target[0] - self. _body.position[0])156 elif (target[0] > self. _body.position[0]):157 x_step = min(1, target[0] - self. _body.position[0])151 if (target[0] < self.physicser.position[0]): 152 x_step = max(-1, target[0] - self.physicser.position[0]) 153 elif (target[0] > self.physicser.position[0]): 154 x_step = min(1, target[0] - self.physicser.position[0]) 158 155 if abs(x_step) < 0.5: 159 156 x_step = 0 160 if (target[1] < self. _body.position[1]):161 y_step = max(-1, target[1] - self. _body.position[1])162 elif (target[1] > self. _body.position[1]):163 y_step = min(1, target[1] - self. _body.position[1])157 if (target[1] < self.physicser.position[1]): 158 y_step = max(-1, target[1] - self.physicser.position[1]) 159 elif (target[1] > self.physicser.position[1]): 160 y_step = min(1, target[1] - self.physicser.position[1]) 164 161 if abs(y_step) < 0.5: 165 162 y_step = 0 … … 179 176 is_moving = False 180 177 enemy_type = 'B' 178 health = 42 179 impulse_factor = 300 181 180 182 181 def __init__(self, space, world, position, attack_range=100): … … 184 183 self._range = attack_range 185 184 186 def _setup_physics(self, space, position): 187 self._body = make_body(100, pymunk.inf, position, 0.8) 188 189 self._shape = pymunk.Circle(self._body, 30) 190 191 self._shape.elasticity = 1.0 192 self._shape.friction = 0.05 193 self._shape.collision_type = COLLISION_TYPE_ENEMY 194 self._physicser = SingleShapePhysicser(space, self._shape) 195 self.impulse_factor = 300 196 self.angle = 0 197 198 def _setup_renderer(self): 199 self.renderer = render.FacingSelectionRenderer({ 200 'left': render.TimedAnimatedRenderer( 201 [self._get_image('alien_B_1.png'), 202 self._get_image('alien_B_2.png')], 3), 203 'right': render.TimedAnimatedRenderer( 204 [self._get_image('alien_B_1.png', FLIP_H), 205 self._get_image('alien_B_2.png', FLIP_H)], 3), 206 }) 185 def make_physics(self, space, position): 186 body = make_body(100, pymunk.inf, position, 0.8) 187 shape = pymunk.Circle(body, 30) 188 shape.elasticity = 1.0 189 shape.friction = 0.05 190 shape.collision_type = COLLISION_TYPE_ENEMY 191 return SingleShapePhysicser(space, shape) 207 192 208 193 def get_render_angle(self): … … 217 202 return 'left' 218 203 219 def set_direction(self, dx, dy):220 self.angle = pymunk.Vec2d((dx, dy)).angle221 self._body.apply_impulse(222 (dx * self.impulse_factor, dy * self.impulse_factor))223 224 204 def update(self, dt): 225 205 # Calculate the step every frame 226 206 # Distance to the protagonist 227 pos = self. _body.position207 pos = self.physicser.position 228 208 target = self.world.protagonist.get_shape().body.position 229 209 if pos.get_distance(target) > self._range: -
nagslang/protagonist.py
r333 r334 1 1 import pymunk 2 2 import pymunk.pygame_util 3 from pymunk.vec2d import Vec2d4 3 5 4 from nagslang import render … … 13 12 from nagslang.resources import resources 14 13 from nagslang.events import ScreenChange 14 from nagslang.utils import vec_from_angle, vec_with_length 15 15 16 16 … … 171 171 172 172 def get_facing_direction(self): 173 # It's easier to work with a vector than an angle here. 174 vec = Vec2d.unit() 175 vec.angle = self.angle 176 # We probably don't have exactly -1, 0, or 1 here. 173 # Our angle is quantised to 45 degree intervals, so possible values for 174 # x and y in a unit vector are +/-(0, sqrt(2)/2, 1) with some floating 175 # point imprecision. Rounding will normalise these to (-1.0, 0.0, 1.0) 176 # which we can safely turn into integers and use as dict keys. 177 vec = vec_from_angle(self.angle) 177 178 x = int(round(vec.x)) 178 179 y = int(round(vec.y)) … … 204 205 return 205 206 self.is_moving = True 206 self.angle = pymunk.Vec2d((dx, dy)).angle207 self. physicser.apply_impulse(208 (dx * self.impulse_factor, dy * self.impulse_factor))207 vec = vec_with_length((dx, dy), self.impulse_factor) 208 self.angle = vec.angle 209 self.physicser.apply_impulse(vec) 209 210 210 211 def set_position(self, position): … … 259 260 if not self.has_item('gun'): 260 261 return 261 vec = Vec2d.unit() 262 vec.angle = self.angle 263 vec.length = 1000 262 vec = vec_from_angle(self.angle, 1000) 264 263 FireEvent.post( 265 264 self.physicser.position, vec, BULLET_DAMAGE, COLLISION_TYPE_PLAYER) 266 265 267 266 def claw(self): 268 vec = Vec2d.unit() 269 vec.angle = self.angle 270 vec.length = 30 267 vec = vec_from_angle(self.angle, 30) 271 268 ClawEvent.post(self.physicser.position, vec, CLAW_DAMAGE) 272 269 -
nagslang/utils.py
r29 r334 1 1 import pygame 2 from pymunk.vec2d import Vec2d 2 3 3 4 … … 10 11 return pygame.Color(colour) 11 12 raise ValueError() 13 14 15 def vec_from_angle(angle, length=1): 16 vec = Vec2d(length, 0) 17 vec.angle = angle 18 return vec 19 20 21 def vec_with_length(coords, length=1): 22 vec = Vec2d(coords) 23 vec.length = length 24 return vec
Note:
See TracChangeset
for help on using the changeset viewer.