Mercurial > skaapsteker
annotate skaapsteker/sprites/player.py @ 266:be516ca5e3b8
Add sprinting
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Fri, 08 Apr 2011 15:34:02 +0200 |
parents | 44cd7cfd2de3 |
children | c24588c7ba09 |
rev | line source |
---|---|
90 | 1 """Class for dealing with the player""" |
2 | |
3 import pygame.transform | |
167
f7fb2ee24c70
Twiddle player animation behaviour
Neil Muller <drnlmuller@gmail.com>
parents:
160
diff
changeset
|
4 import time |
90 | 5 |
248 | 6 from ..sprites.base import TILE_SIZE, PC_LAYER, MONSTER_LAYER |
7 from ..physics import Sprite | |
8 from ..constants import Layers | |
9 from ..data import get_files, load_image | |
10 from ..engine import PlayerDied | |
90 | 11 |
12 | |
13 class Player(Sprite): | |
14 | |
97
a1d95c6152a0
Shiny new collision detection. Read code for usage information.
Simon Cross <hodgestar@gmail.com>
parents:
90
diff
changeset
|
15 collision_layer = PC_LAYER |
100
3eafceff6293
Have monsters also collide with players as an interim solution while I relax, eat dinner and think about the best way to use the new collision layers.
Simon Cross <hodgestar@gmail.com>
parents:
97
diff
changeset
|
16 collides_with = set([MONSTER_LAYER]) |
116
69a97094417a
Hook up per-tick sprite animations.
Simon Cross <hodgestar@gmail.com>
parents:
115
diff
changeset
|
17 wants_updates = True |
97
a1d95c6152a0
Shiny new collision detection. Read code for usage information.
Simon Cross <hodgestar@gmail.com>
parents:
90
diff
changeset
|
18 |
266 | 19 _max_sprint_time = 2 |
20 | |
263 | 21 def __init__(self, the_world, soundsystem): |
90 | 22 Sprite.__init__(self) |
23 self.image = None | |
122
51bcc909873d
Saner, buggier collision rectangles
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
24 self.rect = None |
90 | 25 self._image_dict = {} |
263 | 26 self._soundsystem = soundsystem |
27 self._soundsystem.load_sound('yelp', 'sounds/yelp.ogg') | |
120 | 28 self._animation_frame = 0.0 |
167
f7fb2ee24c70
Twiddle player animation behaviour
Neil Muller <drnlmuller@gmail.com>
parents:
160
diff
changeset
|
29 self._last_time = time.time() |
90 | 30 # State flags and such |
204
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
31 self.attacking = 0 |
90 | 32 self.running = False |
266 | 33 self.sprinting = False |
90 | 34 self.jumping = False |
35 self.flying = False | |
36 self._load_images() | |
37 # We muck with these in load for convience, so ensure they're right | |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
38 self.the_world = the_world |
90 | 39 self.set_facing('left') |
40 self.set_image() | |
41 self.set_pos((0, 0)) | |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
42 self._collisions_seen = 0 |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
43 self._last_collide = [] |
90 | 44 self._layer = Layers.PLAYER |
45 | |
46 def set_image(self): | |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
47 key = self._make_key(len(self.the_world.fox.tails)) |
120 | 48 images = self._image_dict[key] |
49 if self._animation_frame >= len(images): | |
50 self._animation_frame = 0.0 | |
122
51bcc909873d
Saner, buggier collision rectangles
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
51 if self.rect: |
151
06be025c821c
Use midbottom, rather than bottomleft, when changing fox frames
Neil Muller <drnlmuller@gmail.com>
parents:
149
diff
changeset
|
52 cur_pos = self.collide_rect.midbottom |
122
51bcc909873d
Saner, buggier collision rectangles
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
53 else: |
51bcc909873d
Saner, buggier collision rectangles
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
54 cur_pos = (0, 0) |
172
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
55 # TODO: can save a lot of calculation here by caching collision rects |
149
5b4d73d301a1
Don't change image if it will introduce new collisions
Neil Muller <drnlmuller@gmail.com>
parents:
148
diff
changeset
|
56 cand_image = images[int(self._animation_frame)] |
172
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
57 cand_collide_rect = cand_image.get_bounding_rect(1).inflate(-2,-2) |
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
58 cand_rect = cand_image.get_rect() |
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
59 cand_rect_offset = cand_rect.centerx - cand_collide_rect.centerx, cand_rect.bottom - cand_collide_rect.bottom |
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
60 cand_rect.midbottom = cur_pos[0] + cand_rect_offset[0], cur_pos[1] + cand_rect_offset[1] |
151
06be025c821c
Use midbottom, rather than bottomleft, when changing fox frames
Neil Muller <drnlmuller@gmail.com>
parents:
149
diff
changeset
|
61 cand_collide_rect.midbottom = cur_pos |
204
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
62 # We always allow the attacking animation frames |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
63 if not self.check_collide_rect(cand_collide_rect, cand_rect, cand_image) and not self.attacking: |
149
5b4d73d301a1
Don't change image if it will introduce new collisions
Neil Muller <drnlmuller@gmail.com>
parents:
148
diff
changeset
|
64 return |
172
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
65 self.image = cand_image |
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
66 self.collide_rect = cand_collide_rect |
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
67 self.rect = cand_rect |
bf144d817113
if year in range(1980, 1990): continue # how can we sleep while the kitsune is stuck to the floor?
Simon Cross <hodgestar@gmail.com>
parents:
167
diff
changeset
|
68 self.rect_offset = cand_rect_offset |
144
6b488e1351a5
Buggy ground implementation. Make the world less bouncy
Neil Muller <drnlmuller@gmail.com>
parents:
122
diff
changeset
|
69 self.init_pos() |
90 | 70 |
116
69a97094417a
Hook up per-tick sprite animations.
Simon Cross <hodgestar@gmail.com>
parents:
115
diff
changeset
|
71 def update(self): |
120 | 72 v_x, v_y = self.velocity |
167
f7fb2ee24c70
Twiddle player animation behaviour
Neil Muller <drnlmuller@gmail.com>
parents:
160
diff
changeset
|
73 # Never animate slower than !7 fps, never faster than ~15 fps |
204
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
74 if self.attacking > 0: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
75 if self._last_time: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
76 if time.time() - self._last_time > 0.15: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
77 self._animation_frame += 1 |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
78 self.attacking -= 1 |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
79 self._last_time = time.time() |
167
f7fb2ee24c70
Twiddle player animation behaviour
Neil Muller <drnlmuller@gmail.com>
parents:
160
diff
changeset
|
80 else: |
f7fb2ee24c70
Twiddle player animation behaviour
Neil Muller <drnlmuller@gmail.com>
parents:
160
diff
changeset
|
81 self._last_time = time.time() |
204
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
82 else: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
83 old_frame = self._animation_frame |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
84 self._animation_frame += abs(v_x) / 300 |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
85 time_diff = time.time() - self._last_time |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
86 if int(self._animation_frame) - int(old_frame) > 0: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
87 # Check time diff |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
88 if time_diff < 0.10: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
89 # Delay animation frame jump |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
90 self._animation_frame -= abs(v_x) / 300 |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
91 else: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
92 self._last_time = time.time() |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
93 elif time_diff > 0.20: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
94 # Force animation frame jump |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
95 self._animation_frame = old_frame + 1 |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
96 self._last_time = time.time() |
266 | 97 if self.sprinting: |
98 if (time.time() - self._sprint_start_time) > self._max_sprint_time: | |
99 self.sprinting = False | |
167
f7fb2ee24c70
Twiddle player animation behaviour
Neil Muller <drnlmuller@gmail.com>
parents:
160
diff
changeset
|
100 if abs(v_x) < 80: |
148
0474df61d5b1
Clamp very slow horizontal motion
Neil Muller <drnlmuller@gmail.com>
parents:
147
diff
changeset
|
101 # Clamp when we're not moving at least 5 pixel / s |
0474df61d5b1
Clamp very slow horizontal motion
Neil Muller <drnlmuller@gmail.com>
parents:
147
diff
changeset
|
102 self.velocity = (0, v_y) |
160 | 103 self.running = not self.on_solid # if you're not on something you can't stand |
120 | 104 else: |
176
57a78f19c673
Hack player.py to have platformer physics
Neil Muller <drnlmuller@gmail.com>
parents:
172
diff
changeset
|
105 self.velocity = (0, v_y) # Standard platformer physics |
120 | 106 self.running = True |
107 self.set_image() | |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
108 if self._collisions_seen > 2 * len(self._last_collide): |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
109 # Can we find a position "nearby" that reduces the collision |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
110 # surface |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
111 best_move = (0, 0) |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
112 clip_area = 0 |
200
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
113 for obj in self._last_collide[:]: |
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
114 if not obj.collide_rect.colliderect(self.collide_rect): |
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
115 # Prune stale objects from the list |
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
116 self._last_collide.remove(obj) |
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
117 continue |
188
30a5f7cf670a
Hack'ish logic to move out of colliding with floors better
Neil Muller <drnlmuller@gmail.com>
parents:
187
diff
changeset
|
118 clip = obj.collide_rect.clip(self.collide_rect) |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
119 clip_area += clip.width * clip.height |
188
30a5f7cf670a
Hack'ish logic to move out of colliding with floors better
Neil Muller <drnlmuller@gmail.com>
parents:
187
diff
changeset
|
120 if (obj.floor or obj.block) and \ |
200
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
121 clip.width > TILE_SIZE[0] / 2 and \ |
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
122 self.collide_rect.bottom < obj.collide_rect.top + TILE_SIZE[1] / 3: |
188
30a5f7cf670a
Hack'ish logic to move out of colliding with floors better
Neil Muller <drnlmuller@gmail.com>
parents:
187
diff
changeset
|
123 delta = self.rect.bottom - self.collide_rect.bottom |
30a5f7cf670a
Hack'ish logic to move out of colliding with floors better
Neil Muller <drnlmuller@gmail.com>
parents:
187
diff
changeset
|
124 self.collide_rect.bottom = obj.collide_rect.top - 1 |
30a5f7cf670a
Hack'ish logic to move out of colliding with floors better
Neil Muller <drnlmuller@gmail.com>
parents:
187
diff
changeset
|
125 self.rect.bottom = self.collide_rect.bottom + delta |
200
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
126 self.init_pos() |
4e3f9cb49489
Fix bug in jump to tile top logic
Neil Muller <drnlmuller@gmail.com>
parents:
192
diff
changeset
|
127 return # Jump out of this case |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
128 min_area = clip_area |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
129 for attempt in [(0, 2), (2, 0), (-2, 0), (2, 2), (-2, 2)]: |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
130 clip_area = 0 |
188
30a5f7cf670a
Hack'ish logic to move out of colliding with floors better
Neil Muller <drnlmuller@gmail.com>
parents:
187
diff
changeset
|
131 for obj in self._last_collide: |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
132 cand_rect = self.collide_rect.move(attempt) |
188
30a5f7cf670a
Hack'ish logic to move out of colliding with floors better
Neil Muller <drnlmuller@gmail.com>
parents:
187
diff
changeset
|
133 clip = obj.collide_rect.clip(cand_rect) |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
134 clip_area += clip.width * clip.height |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
135 if clip_area < min_area: |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
136 min_area = clip_area |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
137 best_move = attempt |
253
dff6287b55b7
Prefer downward moves if all things are equal to reduce 'holding oneself against the wall in mid-air' options
Neil Muller <drnlmuller@gmail.com>
parents:
248
diff
changeset
|
138 elif clip_area == min_area and attempt[1] > best_move[1]: |
dff6287b55b7
Prefer downward moves if all things are equal to reduce 'holding oneself against the wall in mid-air' options
Neil Muller <drnlmuller@gmail.com>
parents:
248
diff
changeset
|
139 # Of equal choices, prefer that which moves us downwards |
dff6287b55b7
Prefer downward moves if all things are equal to reduce 'holding oneself against the wall in mid-air' options
Neil Muller <drnlmuller@gmail.com>
parents:
248
diff
changeset
|
140 best_move = attempt |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
141 self.collide_rect.move_ip(best_move) |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
142 self.rect.move_ip(best_move) |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
143 self.init_pos() |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
144 self._last_collide = [] |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
145 self._collisions_seen = 0 |
116
69a97094417a
Hook up per-tick sprite animations.
Simon Cross <hodgestar@gmail.com>
parents:
115
diff
changeset
|
146 |
90 | 147 def set_facing(self, new_facing): |
148 self.facing = new_facing | |
149 | |
149
5b4d73d301a1
Don't change image if it will introduce new collisions
Neil Muller <drnlmuller@gmail.com>
parents:
148
diff
changeset
|
150 def collided(self, other): |
210 | 151 if self.attacking and hasattr(other, 'damage'): |
152 # FIXME: Check if we're facing the right way | |
153 other.damage(5) | |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
154 if other not in self._last_collide: |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
155 self._last_collide.append(other) |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
156 self._collide_pos = self.collide_rect.midbottom |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
157 self._collisions_seen = 0 |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
158 else: |
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
159 self._collisions_seen += 1 |
202
a11325bc5ff0
Sprite refactoring stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
200
diff
changeset
|
160 if hasattr(other, 'collided_player'): |
208
c72d9bf911fb
Add start of player damage
Neil Muller <drnlmuller@gmail.com>
parents:
206
diff
changeset
|
161 other.collided_player(self) |
244
5bbf90e6a94b
Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents:
212
diff
changeset
|
162 print 'Health', self.the_world.fox.cur_health |
208
c72d9bf911fb
Add start of player damage
Neil Muller <drnlmuller@gmail.com>
parents:
206
diff
changeset
|
163 |
209 | 164 |
208
c72d9bf911fb
Add start of player damage
Neil Muller <drnlmuller@gmail.com>
parents:
206
diff
changeset
|
165 def damage(self, damage): |
244
5bbf90e6a94b
Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents:
212
diff
changeset
|
166 self.the_world.fox.cur_health -= damage |
263 | 167 self._soundsystem.play_sound('yelp') |
244
5bbf90e6a94b
Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents:
212
diff
changeset
|
168 if self.the_world.fox.cur_health <= 0: |
5bbf90e6a94b
Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents:
212
diff
changeset
|
169 PlayerDied.post() |
187
92ab784ecf5a
Repel fx from longstanding collisions
Neil Muller <drnlmuller@gmail.com>
parents:
177
diff
changeset
|
170 |
244
5bbf90e6a94b
Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents:
212
diff
changeset
|
171 def restore(self): |
5bbf90e6a94b
Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents:
212
diff
changeset
|
172 """Restore player to max health (for restarting levels, etc.)""" |
5bbf90e6a94b
Add minimal support for player death
Neil Muller <drnlmuller@gmail.com>
parents:
212
diff
changeset
|
173 self.the_world.fox.cur_health = self.the_world.fox.max_health |
122
51bcc909873d
Saner, buggier collision rectangles
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
174 |
90 | 175 def set_pos(self, pos): |
202
a11325bc5ff0
Sprite refactoring stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
200
diff
changeset
|
176 self.rect.midbottom = pos[0] * TILE_SIZE[0] + self.rect_offset[0], (pos[1] + 1) * TILE_SIZE[1] + self.rect_offset[1] |
152
60138b935bc0
Make enemies block by default, so we can jump off them
Neil Muller <drnlmuller@gmail.com>
parents:
151
diff
changeset
|
177 self.collide_rect.midbottom = pos[0] * TILE_SIZE[0], pos[1] * TILE_SIZE[1] |
90 | 178 |
102
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
179 def action_left(self): |
115 | 180 if self.facing != 'left': |
181 self.facing = 'left' | |
182 self.set_image() | |
266 | 183 if self.sprinting: |
184 self.deltav((-900.0, 0.0)) | |
185 else: | |
186 self.deltav((-450.0, 0.0)) | |
187 | |
188 def action_double_left(self): | |
189 # FIXME: Tie this to the tails | |
190 if self.sprinting: | |
191 return | |
192 self.sprinting = True | |
193 self._sprint_start_time = time.time() | |
194 | |
195 def action_double_down(self): | |
196 print 'double down tap' | |
197 | |
198 def action_double_right(self): | |
199 if self.sprinting: | |
200 return | |
201 self.sprinting = True | |
202 self._sprint_start_time = time.time() | |
90 | 203 |
102
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
204 def action_right(self): |
115 | 205 if self.facing != 'right': |
206 self.facing = 'right' | |
207 self.set_image() | |
266 | 208 if self.sprinting: |
209 self.deltav((900.0, 0.0)) | |
210 else: | |
211 self.deltav((450.0, 0.0)) | |
212 | |
102
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
213 |
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
214 def action_up(self): |
152
60138b935bc0
Make enemies block by default, so we can jump off them
Neil Muller <drnlmuller@gmail.com>
parents:
151
diff
changeset
|
215 if self.on_solid: |
177
88a78fb9fa82
Tweak some constants to make player motion more comfortable.
Jeremy Thurgood <firxen@gmail.com>
parents:
176
diff
changeset
|
216 self.deltav((0.0, -self.terminal_velocity[1])) |
152
60138b935bc0
Make enemies block by default, so we can jump off them
Neil Muller <drnlmuller@gmail.com>
parents:
151
diff
changeset
|
217 self.on_solid = False |
102
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
218 |
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
219 def action_down(self): |
103
aaef228b6358
Run kitsune, run! And by the running of the kitsune gravity is restored to normal.
Simon Cross <hodgestar@gmail.com>
parents:
102
diff
changeset
|
220 self.deltav((0.0, 100.0)) |
102
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
221 |
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
222 def action_fire1(self): |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
223 # FIXME: Use the correct tail properties for this |
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
224 if len(self.the_world.fox.tails) < 2: |
204
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
225 # Only have a bite attack |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
226 print 'attacking' |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
227 self.attacking = 2 |
102
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
228 print "F1" |
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
229 |
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
230 def action_fire2(self): |
2e913a89e69d
Link up key presses to calls to action functions on player and to quitting level.
Simon Cross <hodgestar@gmail.com>
parents:
100
diff
changeset
|
231 print "F2" |
90 | 232 |
233 def _get_action(self): | |
204
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
234 if self.attacking: |
0f9715a2f07b
Make fire 1 do the attacking animation
Neil Muller <drnlmuller@gmail.com>
parents:
203
diff
changeset
|
235 return 'attacking' |
266 | 236 if self.sprinting and self.running: |
237 return 'sprinting' | |
90 | 238 if self.running: |
239 return 'running' | |
240 if self.jumping: | |
241 return 'jumpin' | |
242 return 'standing' | |
243 | |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
244 def _make_key(self, tails, action=None): |
90 | 245 if action is None: |
246 action = self._get_action() | |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
247 if tails >= 4: |
90 | 248 tails = 4 |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
249 elif tails >= 2: |
90 | 250 tails = 2 |
251 return '%s %s %d' % (action, self.facing, tails) | |
252 | |
253 def _load_images(self): | |
158 | 254 for action in ['standing', 'running', 'jumping', 'attacking']: |
90 | 255 for tails in [0, 1, 2, 4]: |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
256 directory = 'sprites/kitsune_%s/kitsune_%s_%dtail' % (action, action, tails) |
90 | 257 for facing in ['left', 'right']: |
258 self.facing = facing | |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
259 key = self._make_key(tails, action) |
90 | 260 self._image_dict[key] = [] |
261 for image_file in get_files(directory): | |
262 if image_file.startswith('.'): | |
263 # Skip extra junk for now | |
264 continue | |
206
e2acf4663065
Move fox properties to the world
Neil Muller <drnlmuller@gmail.com>
parents:
204
diff
changeset
|
265 image = load_image('%s/%s' % (directory, image_file)) |
266 | 266 if action == 'running': |
267 sprint_key = self._make_key(tails, 'sprinting') | |
268 if sprint_key not in self._image_dict: | |
269 self._image_dict[sprint_key] = [] | |
270 shockwave = load_image('sprites/kitsune_shockwave.png') | |
271 if facing == 'right': | |
272 shockwave = pygame.transform.flip(shockwave, True, False) | |
90 | 273 if facing == 'right': |
274 image = pygame.transform.flip(image, True, False) | |
275 self._image_dict[key].append(image) | |
266 | 276 if action == 'running': |
277 sprint_image = image.copy() | |
278 sprint_image.blit(shockwave, (0, 0)) | |
279 self._image_dict[sprint_key].append(sprint_image) | |
209 | 280 |
281 | |
282 def take_item(self, item): | |
283 my_item = self.the_world.fox.item | |
284 if my_item is not None: | |
285 print "I already have", my_item | |
286 return | |
287 getattr(self.the_world.items, item.name).level = "gone" | |
288 self.the_world.fox.item = item.name | |
289 item.kill() | |
290 print "took", item |