Mercurial > nagslang
changeset 278:e72025e9aa07
simple slow charging alien
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Thu, 05 Sep 2013 13:34:37 +0200 |
parents | 56e42c00da25 |
children | 9f68e22c1e58 |
files | data/levels/level2 nagslang/enemies.py |
diffstat | 2 files changed, 93 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/data/levels/level2 Thu Sep 05 13:15:31 2013 +0200 +++ b/data/levels/level2 Thu Sep 05 13:34:37 2013 +0200 @@ -1,8 +1,12 @@ base_tile: tiles/floor.png -enemies: [] +enemies: +- args: + - [200, 250] + - 300 + classname: ChargingAlien game_objects: - args: - - [400, 400] + - [400, 440] - level1 - [600, 700] - 90 @@ -22,12 +26,10 @@ - [320, 310] - [530, 310] - [530, 90] - - [600, 90] - - [600, 200] - - [550, 200] - - [550, 330] - - [290, 330] - - [290, 220] - - [230, 220] + - [460, 90] + - [460, 260] + - [350, 260] + - [350, 140] + - [230, 140] - [230, 180] size: [1200, 500]
--- a/nagslang/enemies.py Thu Sep 05 13:15:31 2013 +0200 +++ b/nagslang/enemies.py Thu Sep 05 13:34:37 2013 +0200 @@ -134,3 +134,85 @@ def requires(cls): return [("name", "string"), ("position", "coordinates"), ("end_position", "coordinates")] + + +class ChargingAlien(Enemy): + # Simplistic charging of the protagonist + is_moving = False + + def __init__(self, space, world, position, attack_range=100): + super(ChargingAlien, self).__init__(space, world, position) + self._range = attack_range + + def _setup_physics(self, space, position): + self._body = make_body(100, pymunk.inf, position, 0.8) + + self._shape = pymunk.Circle(self._body, 30) + + self._shape.elasticity = 1.0 + self._shape.friction = 0.05 + self._shape.collision_type = COLLISION_TYPE_ENEMY + self._physicser = SingleShapePhysicser(space, self._shape) + self.impulse_factor = 300 + self.angle = 0 + + def _setup_renderer(self): + self.renderer = render.FacingSelectionRenderer({ + 'left': render.TimedAnimatedRenderer( + [self._get_image('alien_B_1.png'), + self._get_image('alien_B_2.png')], 3), + 'right': render.TimedAnimatedRenderer( + [self._get_image('alien_B_1.png', FLIP_H), + self._get_image('alien_B_2.png', FLIP_H)], 3), + }) + + def get_render_angle(self): + # No image rotation when rendering, please. + return 0 + + def get_facing_direction(self): + # Enemies can face left or right. + if - math.pi / 2 < self.angle <= math.pi / 2: + return 'right' + else: + return 'left' + + def set_direction(self, dx, dy): + self.angle = pymunk.Vec2d((dx, dy)).angle + self._body.apply_impulse( + (dx * self.impulse_factor, dy * self.impulse_factor)) + + def animate(self): + # Calculate the step every frame + # Distance to the protagonist + pos = self._body.position + target = self.world.protagonist.get_shape().body.position + if pos.get_distance(target) > self._range: + # stop + self.is_moving = False + return + self.is_moving = True + x_step = 0 + y_step = 0 + if (target[0] < pos[0]): + x_step = max(-1, target[0] - pos[0]) + elif (target[0] > pos[0]): + x_step = min(1, target[0] - pos[0]) + if abs(x_step) < 0.5: + x_step = 0 + if (target[1] < pos[1]): + y_step = max(-1, target[1] - pos[1]) + elif (target[1] > pos[1]): + y_step = min(1, target[1] - pos[1]) + if abs(y_step) < 0.5: + y_step = 0 + self.set_direction(x_step, y_step) + super(ChargingAlien, self).animate() + + def collide_with_protagonist(self, protagonist): + protagonist.lose_health(20) + + @classmethod + def requires(cls): + return [("name", "string"), ("position", "coordinates"), + ("attack_range", "distance")]