annotate nagslang/enemies.py @ 168:ce8d4fc3baf4

A patrolling alien
author Neil Muller <drnlmuller@gmail.com>
date Tue, 03 Sep 2013 14:39:38 +0200
parents
children 42e8993c31fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
168
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
1 import pymunk
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
2 import pymunk.pygame_util
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
3
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
4 from nagslang.constants import COLLISION_TYPE_ENEMY, ZORDER_MID
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5 from nagslang.game_object import (
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
6 GameObject, SingleShapePhysicser, AnimatedFacingImageRenderer, make_body)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
7 from nagslang.mutators import FLIP_H
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
8 from nagslang.resources import resources
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
9
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
10
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
11 class Enemy(GameObject):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
12 """A base class for mobile enemies"""
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
14 def __init__(self, space, position):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
15 self._setup_physics(space, position)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
16 self._setup_renderer()
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
17
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
18 super(Enemy, self).__init__(
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
19 self._physicser, self.renderer)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
20 self.zorder = ZORDER_MID
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
21
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
22 def _get_image(self, name, *transforms):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
23 return resources.get_image('creatures', name, transforms=transforms)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
24
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
25 def _setup_physics(self, space, position):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
26 raise NotImplementedError
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
27
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
28 def _setup_renderer(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
29 raise NotImplementedError
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
30
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
31 def attack(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
32 raise NotImplementedError
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
33
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
34
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
35 class PatrollingAlien(Enemy):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
36
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
37 def __init__(self, space, position, end_position):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
38 # An enemy that patrols between the two points
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
39 super(PatrollingAlien, self).__init__(space, position)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
40 self._start_pos = position
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
41 self._end_pos = end_position
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
42 self._direction = 'away'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
43
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
44 def _setup_physics(self, space, position):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
45 self._body = make_body(5, pymunk.inf, position, 0.8)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
46
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
47 self._shape = pymunk.Circle(self._body, 30)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
48
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
49 self._shape.elasticity = 1.0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
50 self._shape.friction = 10.0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
51 self._shape.collision_type = COLLISION_TYPE_ENEMY
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
52 self._physicser = SingleShapePhysicser(space, self._shape)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
53 self.impulse_factor = 50
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
54 self.angle = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
55
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
56 def _setup_renderer(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
57 self.renderer = AnimatedFacingImageRenderer(
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
58 (self._get_image('alien_A_1.png'),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
59 self._get_image('alien_A_1.png'),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
60 self._get_image('alien_A_1.png'),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
61 self._get_image('alien_A_1.png'),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
62 self._get_image('alien_A_1.png'),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
63 self._get_image('alien_A_1.png'),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
64 self._get_image('alien_A_2.png'),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
65 self._get_image('alien_A_2.png'),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
66 self._get_image('alien_A_2.png')),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
67 (self._get_image('alien_A_1.png', FLIP_H),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
68 self._get_image('alien_A_1.png', FLIP_H),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
69 self._get_image('alien_A_1.png', FLIP_H),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
70 self._get_image('alien_A_1.png', FLIP_H),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
71 self._get_image('alien_A_1.png', FLIP_H),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
72 self._get_image('alien_A_1.png', FLIP_H),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
73 self._get_image('alien_A_2.png', FLIP_H),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
74 self._get_image('alien_A_2.png', FLIP_H),
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
75 self._get_image('alien_A_2.png', FLIP_H)))
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
76 # We're always animated
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
77 self.renderer.start()
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
78
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
79 def get_render_angle(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
80 return self.angle
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
81
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
82 def _switch_direction(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
83 if self._direction == 'away':
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
84 self._direction = 'towards'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
85 else:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
86 self._direction = 'away'
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
87
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
88 def set_direction(self, dx, dy):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
89 self.angle = pymunk.Vec2d((dx, dy)).angle
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
90 self._body.apply_impulse(
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
91 (dx * self.impulse_factor, dy * self.impulse_factor))
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
92
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
93 def animate(self):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
94 # Calculate the step every frame
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
95 if self._direction == 'away':
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
96 target = self._end_pos
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
97 else:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
98 target = self._start_pos
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
99 x_step = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
100 y_step = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
101 if (target[0] < self._body.position[0]):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
102 x_step = max(-1, target[0] - self._body.position[0])
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
103 elif (target[0] > self._body.position[0]):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
104 x_step = min(1, target[0] - self._body.position[0])
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
105 if abs(x_step) < 0.5:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
106 x_step = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
107 if (target[1] < self._body.position[1]):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
108 y_step = max(-1, target[1] - self._body.position[1])
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
109 elif (target[1] > self._body.position[1]):
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
110 y_step = min(1, target[1] - self._body.position[1])
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
111 if abs(y_step) < 0.5:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
112 y_step = 0
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
113 if abs(x_step) < 1 and abs(y_step) < 1:
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
114 self._switch_direction()
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
115 self.set_direction(x_step, y_step)
ce8d4fc3baf4 A patrolling alien
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
116 super(PatrollingAlien, self).animate()