Mercurial > mamba
annotate mamba/snake.py @ 201:78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Wed, 14 Sep 2011 20:14:41 +0200 |
parents | 986e72d2cb4d |
children | 498c1d659a94 |
rev | line source |
---|---|
78 | 1 """The player snake object.""" |
2 | |
188
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
3 from pygame.sprite import Group, spritecollide |
110 | 4 |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
5 from mamba.constants import TILE_SIZE, UP, DOWN, LEFT, RIGHT |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
6 from mamba.sprites import BaseSprite |
186 | 7 from mamba.engine import SnakeDiedEvent |
98 | 8 from mamba import mutators |
78 | 9 |
10 | |
110 | 11 class Snake(object): |
78 | 12 |
13 def __init__(self, tile_pos, orientation): | |
110 | 14 self.segments = self.create_segments(tile_pos, orientation) |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
15 self.pending_segments = [] # segments waiting to be added |
110 | 16 self.segment_group = Group() |
178 | 17 self.segment_group.add(*reversed(self.segments)) |
78 | 18 self.set_orientation(orientation) |
178 | 19 self.speed = 120.0 # pixel / s |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
20 self.frac_ds = 0.0 |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
21 self.mutation = None |
78 | 22 |
110 | 23 head = property(fget=lambda self: self.segments[0]) |
24 tail = property(fget=lambda self: self.segments[-1]) | |
25 | |
26 def create_segments(self, tile_pos, orientation): | |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
27 tx, ty = tile_pos |
110 | 28 dx, dy = orientation |
178 | 29 segments = [] |
30 for cls in [Head] + [Body] * 10 + [Tail]: | |
31 segments.append(cls((tx, ty))) | |
32 return segments | |
110 | 33 |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
34 def add_segment(self, segment=None): |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
35 if segment is None: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
36 segment = Body((0, 0)) |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
37 self.pending_segments.append(segment) |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
38 |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
39 def remove_segment(self, segment=None): |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
40 if segment is None: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
41 if len(self.segments) < 3: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
42 return |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
43 segment = self.segments[-2] |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
44 try: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
45 idx = self.segments.index(segment) |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
46 except IndexError: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
47 return |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
48 self.shiftup_segments(idx, segment.get_tile_state()) |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
49 del self.segments[idx] |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
50 |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
51 def shiftup_segments(self, idx, state): |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
52 for segment in self.segments[idx:]: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
53 next_state = segment.get_tile_state() |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
54 segment.shift_tile(state) |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
55 state = next_state |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
56 |
110 | 57 def draw(self, surface): |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
58 self.segment_group.draw(surface) |
98 | 59 |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
60 def update(self, dt, world): |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
61 ds = dt * self.speed + self.frac_ds |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
62 ds, self.frac_ds = divmod(ds, 1) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
63 ds = int(ds) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
64 while True: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
65 tile_state = self.head.get_tile_state() |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
66 shifted, ds = self.head.shift_head(ds) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
67 if not shifted: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
68 break |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
69 self.shiftup_segments(1, tile_state) |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
70 if not self.check_uturn(): |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
71 self.head.set_orientation(self.orientation) |
119
119c0fb758c2
Move key handling into GameWidget and GameWidget into widgets.game.
Simon Cross <hodgestar@gmail.com>
parents:
118
diff
changeset
|
72 |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
73 for segment in self.segments: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
74 segment.shift_pixels(ds) |
188
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
75 world.interact(segment) |
145
20b2cedf0f1d
Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents:
141
diff
changeset
|
76 |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
77 def check_uturn(self): |
198
2876658d0b98
Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents:
195
diff
changeset
|
78 if len(self.segments) > 1: |
2876658d0b98
Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents:
195
diff
changeset
|
79 neck_x, neck_y = self.segments[1].tile_pos |
2876658d0b98
Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents:
195
diff
changeset
|
80 head_x, head_y = self.head.tile_pos |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
81 if (head_x + self.orientation[0] == neck_x and |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
82 head_y + self.orientation[1] == neck_y): |
198
2876658d0b98
Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents:
195
diff
changeset
|
83 # Don't allow the snake to go back on itself |
2876658d0b98
Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents:
195
diff
changeset
|
84 # immediately. More creative self-inflicted |
2876658d0b98
Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents:
195
diff
changeset
|
85 # deaths are allowed though. |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
86 return True |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
87 return False |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
88 |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
89 def set_orientation(self, orientation): |
119
119c0fb758c2
Move key handling into GameWidget and GameWidget into widgets.game.
Simon Cross <hodgestar@gmail.com>
parents:
118
diff
changeset
|
90 self.orientation = orientation |
98 | 91 |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
92 def crash(self): |
186 | 93 SnakeDiedEvent.post() |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
94 |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
95 def mutate(self, mutation): |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
96 self.mutation = mutation |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
97 |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
98 def can_swim(self): |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
99 return self.mutation == 'amphibious' |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
100 |
98 | 101 |
110 | 102 class Segment(BaseSprite): |
103 | |
195
d488731886dc
Wean colour overlays off image colour patches.
Simon Cross <hodgestar@gmail.com>
parents:
188
diff
changeset
|
104 GREEN = mutators.SNAKE_GREEN |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
105 BLUE = mutators.BLUE |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
106 RED = mutators.RED |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
107 YELLOW = mutators.YELLOW |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
108 |
131 | 109 _detail_mutators = () |
110 | |
182
0a955d2536f0
Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents:
181
diff
changeset
|
111 is_head = False |
0a955d2536f0
Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents:
181
diff
changeset
|
112 |
110 | 113 def __init__(self, image_name, tile_pos): |
114 super(Segment, self).__init__() | |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
115 self.set_base_image(image_name) |
131 | 116 self._colour_overlay = self.GREEN |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
117 self.orientation = UP |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
118 |
131 | 119 self.make_images() |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
120 self.update_image() |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
121 self.set_tile_pos(tile_pos) |
188
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
122 self.on_tiles = [] |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
123 |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
124 def filter_collisions(self, group): |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
125 collide = [] |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
126 tiles = spritecollide(self, group, False) |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
127 for tile in tiles: |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
128 if tile not in self.on_tiles: |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
129 collide.append(tile) |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
130 self.on_tiles = tiles |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
131 return collide |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
132 |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
133 def set_base_image(self, image_name): |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
134 self._base_image = "/".join(["snake", image_name]) |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
135 |
131 | 136 def make_images(self): |
110 | 137 self._images = {} |
138 for orientation, muts in [ | |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
139 (RIGHT, (mutators.RIGHT,)), |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
140 (LEFT, (mutators.LEFT,)), |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
141 (UP, (mutators.UP,)), |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
142 (DOWN, (mutators.DOWN,)), |
110 | 143 ]: |
131 | 144 all_muts = (self._colour_overlay,) + self._detail_mutators + muts |
141 | 145 self._images[orientation] = self.load_image(self._base_image, |
146 all_muts) | |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
147 |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
148 def update_image(self): |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
149 self.image = self._images[self.orientation] |
110 | 150 |
151 def set_orientation(self, orientation): | |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
152 self.orientation = orientation |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
153 self.update_image() |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
154 |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
155 def set_colour(self, colour_overlay): |
131 | 156 self._colour_overlay = colour_overlay |
157 self.make_images() | |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
158 self.update_image() |
110 | 159 |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
160 def get_tile_state(self): |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
161 return self.tile_pos, self.orientation |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
162 |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
163 def shift_tile(self, tile_state): |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
164 """Shift this segment to the tile the other one was on. |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
165 |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
166 Also reset the position to be the center of the tile. |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
167 """ |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
168 tile_pos, orientation = tile_state |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
169 self.set_tile_pos(tile_pos) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
170 self.orientation = orientation |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
171 |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
172 def shift_pixels(self, distance): |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
173 """Shift this segment a number of pixels.""" |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
174 dx, dy = self.orientation |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
175 dx, dy = distance * dx, distance * dy |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
176 self.rect = self.rect.move(dx, dy) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
177 |
110 | 178 |
179 class Head(Segment): | |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
180 CLOSED = "snake-head" |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
181 OPEN = "snake-head-mouth-open-r" |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
182 EYE = mutators.Overlay("tiles/common/snake/snake-head-eye-r.png") |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
183 TONGUE = mutators.Overlay("tiles/common/snake/snake-head-tongue-r.png") |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
184 |
182
0a955d2536f0
Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents:
181
diff
changeset
|
185 is_head = True |
0a955d2536f0
Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents:
181
diff
changeset
|
186 |
110 | 187 def __init__(self, tile_pos): |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
188 self._detail_mutators = (self.EYE,) |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
189 super(Head, self).__init__(self.CLOSED, tile_pos) |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
190 |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
191 def mouth_open(self): |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
192 self.set_base_image(self.OPEN) |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
193 self.make_images() |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
194 self.update_image() |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
195 |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
196 def mouth_closed(self): |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
197 self.set_base_image(self.CLOSED) |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
198 self.make_images() |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
199 self.update_image() |
110 | 200 |
131 | 201 def tongue_out(self): |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
202 self._detail_mutators = (self.EYE, self.TONGUE) |
131 | 203 self.make_images() |
204 self.update_image() | |
205 | |
206 def tongue_in(self): | |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
207 self._detail_mutators = (self.EYE,) |
131 | 208 self.make_images() |
209 self.update_image() | |
210 | |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
211 def shift_head(self, ds): |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
212 """Shift the head a number of pixels in the direction of it |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
213 orientation. |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
214 """ |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
215 dx, dy = self.orientation |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
216 TX, TY = TILE_SIZE |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
217 rx, ry = self.rect.left, self.rect.top |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
218 tx, ty = self.tile_pos |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
219 # WARNING: Tri-state logic ahead |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
220 # (Tri-state logic is the mamba's natural habitat) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
221 if dx != 0: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
222 newdx = rx + ds * dx |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
223 newtx = newdx / TX |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
224 if newtx > tx: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
225 self.set_tile_pos((tx + 1, ty)) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
226 ds = newdx - self.rect.left |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
227 return True, ds |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
228 elif newtx < tx - 1: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
229 self.set_tile_pos((tx - 1, ty)) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
230 ds = self.rect.left - newdx |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
231 return True, ds |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
232 else: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
233 newdy = ry + ds * dy |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
234 newty = newdy / TY |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
235 if newty > ty: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
236 self.set_tile_pos((tx, ty + 1)) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
237 ds = newdy - self.rect.top |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
238 return True, ds |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
239 elif newty < ty - 1: |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
240 self.set_tile_pos((tx, ty - 1)) |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
241 ds = self.rect.top - newdy |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
242 return True, ds |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
243 return False, ds |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
244 |
110 | 245 |
246 class Body(Segment): | |
247 def __init__(self, tile_pos): | |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
248 super(Body, self).__init__("snake-body", tile_pos) |
110 | 249 |
250 | |
251 class Tail(Segment): | |
252 def __init__(self, tile_pos): | |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
253 super(Tail, self).__init__("snake-tail", tile_pos) |