Changeset 278:e72025e9aa07 for nagslang


Ignore:
Timestamp:
Sep 5, 2013, 11:34:37 AM (7 years ago)
Author:
Neil Muller <drnlmuller@…>
Branch:
default
Message:

simple slow charging alien

File:
1 edited

Legend:

Unmodified
Added
Removed
  • nagslang/enemies.py

    r277 r278  
    135135        return [("name", "string"), ("position", "coordinates"),
    136136                ("end_position", "coordinates")]
     137
     138
     139class ChargingAlien(Enemy):
     140    # Simplistic charging of the protagonist
     141    is_moving = False
     142
     143    def __init__(self, space, world, position, attack_range=100):
     144        super(ChargingAlien, self).__init__(space, world, position)
     145        self._range = attack_range
     146
     147    def _setup_physics(self, space, position):
     148        self._body = make_body(100, pymunk.inf, position, 0.8)
     149
     150        self._shape = pymunk.Circle(self._body, 30)
     151
     152        self._shape.elasticity = 1.0
     153        self._shape.friction = 0.05
     154        self._shape.collision_type = COLLISION_TYPE_ENEMY
     155        self._physicser = SingleShapePhysicser(space, self._shape)
     156        self.impulse_factor = 300
     157        self.angle = 0
     158
     159    def _setup_renderer(self):
     160        self.renderer = render.FacingSelectionRenderer({
     161            'left': render.TimedAnimatedRenderer(
     162                [self._get_image('alien_B_1.png'),
     163                 self._get_image('alien_B_2.png')], 3),
     164            'right': render.TimedAnimatedRenderer(
     165                [self._get_image('alien_B_1.png', FLIP_H),
     166                 self._get_image('alien_B_2.png', FLIP_H)], 3),
     167        })
     168
     169    def get_render_angle(self):
     170        # No image rotation when rendering, please.
     171        return 0
     172
     173    def get_facing_direction(self):
     174        # Enemies can face left or right.
     175        if - math.pi / 2 < self.angle <= math.pi / 2:
     176            return 'right'
     177        else:
     178            return 'left'
     179
     180    def set_direction(self, dx, dy):
     181        self.angle = pymunk.Vec2d((dx, dy)).angle
     182        self._body.apply_impulse(
     183            (dx * self.impulse_factor, dy * self.impulse_factor))
     184
     185    def animate(self):
     186        # Calculate the step every frame
     187        # Distance to the protagonist
     188        pos = self._body.position
     189        target = self.world.protagonist.get_shape().body.position
     190        if pos.get_distance(target) > self._range:
     191            # stop
     192            self.is_moving = False
     193            return
     194        self.is_moving = True
     195        x_step = 0
     196        y_step = 0
     197        if (target[0] < pos[0]):
     198            x_step = max(-1, target[0] - pos[0])
     199        elif (target[0] > pos[0]):
     200            x_step = min(1, target[0] - pos[0])
     201        if abs(x_step) < 0.5:
     202            x_step = 0
     203        if (target[1] < pos[1]):
     204            y_step = max(-1, target[1] - pos[1])
     205        elif (target[1] > pos[1]):
     206            y_step = min(1, target[1] - pos[1])
     207        if abs(y_step) < 0.5:
     208            y_step = 0
     209        self.set_direction(x_step, y_step)
     210        super(ChargingAlien, self).animate()
     211
     212    def collide_with_protagonist(self, protagonist):
     213        protagonist.lose_health(20)
     214
     215    @classmethod
     216    def requires(cls):
     217        return [("name", "string"), ("position", "coordinates"),
     218                ("attack_range", "distance")]
Note: See TracChangeset for help on using the changeset viewer.