annotate mamba/snake.py @ 177:e0573297b17c

Snake that moves (my god that was an epic struggle).
author Simon Cross <hodgestar@gmail.com>
date Wed, 14 Sep 2011 01:45:41 +0200
parents 9c47bf162ea1
children 74f8d8cbc51d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """The player snake object."""
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
3 from pygame.sprite import Group
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
4 from pygame.locals import BLEND_MULT
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
5
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
6 from mamba.constants import TILE_SIZE
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
7 from mamba.sprites import BaseSprite
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
8 from mamba import mutators
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
9
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
11 class Snake(object):
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
12
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
13 UP, DOWN, LEFT, RIGHT = [(0, -1), (0, 1), (-1, 0), (1, 0)]
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
14
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
15 def __init__(self, tile_pos, orientation):
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
16 self.segments = self.create_segments(tile_pos, orientation)
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
17 self.segment_group = Group()
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
18 self.segment_group.add(*self.segments)
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
19 self.set_orientation(orientation)
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
20 self.speed = 60.0 # pixel / s
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
21 self.frac_ds = 0.0
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
22 self.segments = self.create_segments(tile_pos, orientation)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
23 self.segment_group = Group(reversed(self.segments))
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
24
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
25 head = property(fget=lambda self: self.segments[0])
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
26 tail = property(fget=lambda self: self.segments[-1])
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
27
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
28 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
29 tx, ty = tile_pos
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
30 dx, dy = orientation
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
31 return [Head((tx, ty)),
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
32 Body((tx + dx, ty + dy)),
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
33 Tail((tx + 2 * dx, ty + 2 * dy)),
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
34 ]
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
35
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
36 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
37 self.segment_group.draw(surface)
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
38
122
45dd79e9ba1b Rudimentary FPS and clock ticking.
Simon Cross <hodgestar@gmail.com>
parents: 119
diff changeset
39 def update(self, dt):
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
40 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
41 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
42 ds = int(ds)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
43 while True:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
44 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
45 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
46 if not shifted:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
47 break
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
48 self.head.set_orientation(self.orientation)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
49 for segment in self.segments[1:]:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
50 old_tile_state = segment.get_tile_state()
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
51 segment.shift_tile(tile_state)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
52 tile_state = old_tile_state
119
119c0fb758c2 Move key handling into GameWidget and GameWidget into widgets.game.
Simon Cross <hodgestar@gmail.com>
parents: 118
diff changeset
53
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
54 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
55 segment.shift_pixels(ds)
145
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
56
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
57 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
58 self.orientation = orientation
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
59
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
60
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
61 class Segment(BaseSprite):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
62
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
63 GREEN = mutators.Overlay("tiles/common/snake/green.png", BLEND_MULT)
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
64 BLUE = mutators.BLUE
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
65 RED = mutators.RED
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
66 YELLOW = mutators.YELLOW
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
67
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
68 _detail_mutators = ()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
69
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
70 def __init__(self, image_name, tile_pos):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
71 super(Segment, self).__init__()
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
72 self.set_base_image(image_name)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
73 self._colour_overlay = self.GREEN
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
74 self.orientation = Snake.UP
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
75
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
76 self.make_images()
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
77 self.update_image()
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
78 self.set_tile_pos(tile_pos)
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
79
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
80 def set_base_image(self, image_name):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
81 self._base_image = "/".join(["snake", image_name])
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
82
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
83 def make_images(self):
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
84 self._images = {}
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
85 for orientation, muts in [
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
86 (Snake.RIGHT, (mutators.RIGHT,)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
87 (Snake.LEFT, (mutators.LEFT,)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
88 (Snake.UP, (mutators.UP,)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
89 (Snake.DOWN, (mutators.DOWN,)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
90 ]:
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
91 all_muts = (self._colour_overlay,) + self._detail_mutators + muts
141
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 131
diff changeset
92 self._images[orientation] = self.load_image(self._base_image,
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 131
diff changeset
93 all_muts)
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
94
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
95 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
96 self.image = self._images[self.orientation]
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
97
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
98 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
99 self.orientation = orientation
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
100 self.update_image()
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
101
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
102 def set_colour(self, colour_overlay):
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
103 self._colour_overlay = colour_overlay
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
104 self.make_images()
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
105 self.update_image()
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
106
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
107 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
108 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
109
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
110 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
111 """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
112
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
113 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
114 """
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
115 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
116 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
117 self.orientation = orientation
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
118
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
119 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
120 """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
121 dx, dy = self.orientation
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
122 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
123 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
124
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
125
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
126 class Head(Segment):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
127 CLOSED = "snake-head"
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
128 OPEN = "snake-head-mouth-open-r"
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
129 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
130 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
131
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
132 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
133 self._detail_mutators = (self.EYE,)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
134 super(Head, self).__init__(self.CLOSED, tile_pos)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
135
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
136 def mouth_open(self):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
137 self.set_base_image(self.OPEN)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
138 self.make_images()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
139 self.update_image()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
140
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
141 def mouth_closed(self):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
142 self.set_base_image(self.CLOSED)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
143 self.make_images()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
144 self.update_image()
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
145
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
146 def tongue_out(self):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
147 self._detail_mutators = (self.EYE, self.TONGUE)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
148 self.make_images()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
149 self.update_image()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
150
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
151 def tongue_in(self):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
152 self._detail_mutators = (self.EYE,)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
153 self.make_images()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
154 self.update_image()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
155
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
156 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
157 """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
158 orientation.
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
159 """
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
160 dx, dy = self.orientation
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
161 TX, TY = TILE_SIZE
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
162 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
163 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
164 # 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
165 # (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
166 if dx != 0:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
167 newdx = rx + ds * dx
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
168 newtx = newdx / TX
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
169 if newtx > tx:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
170 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
171 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
172 return True, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
173 elif newtx < tx - 1:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
174 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
175 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
176 return True, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
177 else:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
178 newdy = ry + ds * dy
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
179 newty = newdy / TY
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
180 if newty > ty:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
181 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
182 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
183 return True, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
184 elif newty < ty - 1:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
185 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
186 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
187 return True, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
188 return False, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
189
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
190
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
191 class Body(Segment):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
192 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
193 super(Body, self).__init__("snake-body", tile_pos)
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
194
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
195
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
196 class Tail(Segment):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
197 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
198 super(Tail, self).__init__("snake-tail", tile_pos)