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")]