annotate mamba/snake.py @ 153:9c47bf162ea1

snake has plastic surgery
author Adrianna Pińska <adrianna.pinska@gmail.com>
date Tue, 13 Sep 2011 22:39:37 +0200
parents 20b2cedf0f1d
children e0573297b17c
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
145
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
5 #from pygame.draw import lines
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
6 from pygame.draw import rect
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
7
128
646bb61c9ea6 The snake is a li(n)e!
Simon Cross <hodgestar@gmail.com>
parents: 125
diff changeset
8 from mamba.sprites import BaseSprite, tile_sizify
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
9 from mamba import mutators
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
11
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
12 class Snake(object):
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
13
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
14 UP, DOWN, LEFT, RIGHT = [(0, -1), (0, 1), (-1, 0), (1, 0)]
129
c533b7c9cbe8 Fatter snake.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
15 SPEED = 60.0 # pixels / s
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
16
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
17 def __init__(self, tile_pos, orientation):
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
18 self.segments = self.create_segments(tile_pos, orientation)
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
19 self.segment_group = Group()
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
20 self.segment_group.add(*self.segments)
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
21 self.set_orientation(orientation)
128
646bb61c9ea6 The snake is a li(n)e!
Simon Cross <hodgestar@gmail.com>
parents: 125
diff changeset
22 self.pos = tile_sizify(tile_pos)
145
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
23 self.length = 80
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
24 self.xs = self.snake_length(self.length)
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
25 self.ys = self.snake_length(self.length)
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
26
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
27 head = property(fget=lambda self: self.segments[0])
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
28 tail = property(fget=lambda self: self.segments[-1])
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
29
145
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
30 def snake_length(self, size=10):
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
31 result = []
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
32 for i in range(size):
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
33 result.append(0)
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
34 return result
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
35
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
36 def create_segments(self, tile_pos, orientation):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
37 x, y = tile_pos
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
38 dx, dy = orientation
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
39 return [Head((x, y)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
40 Body((x + dx, y + dy)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
41 Tail((x + 2 * dx, y + 2 * dy)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
42 ]
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
43
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
44 def draw(self, surface):
128
646bb61c9ea6 The snake is a li(n)e!
Simon Cross <hodgestar@gmail.com>
parents: 125
diff changeset
45 # self.segment_group.draw(surface)
129
c533b7c9cbe8 Fatter snake.
Simon Cross <hodgestar@gmail.com>
parents: 128
diff changeset
46 (x, y), l = self.pos, self.length
145
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
47 #lines(surface, (0, 0, 255), False, [(x, y), (x + l, y)], 20)
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
48 for i in range(0, len(self.xs)):
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
49 rect(surface, (0, 0, 255), [(self.xs[i], self.ys[i]), (20, 20)])
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
50
122
45dd79e9ba1b Rudimentary FPS and clock ticking.
Simon Cross <hodgestar@gmail.com>
parents: 119
diff changeset
51 def update(self, dt):
128
646bb61c9ea6 The snake is a li(n)e!
Simon Cross <hodgestar@gmail.com>
parents: 125
diff changeset
52 x, y = self.pos
646bb61c9ea6 The snake is a li(n)e!
Simon Cross <hodgestar@gmail.com>
parents: 125
diff changeset
53 ox, oy = self.orientation
646bb61c9ea6 The snake is a li(n)e!
Simon Cross <hodgestar@gmail.com>
parents: 125
diff changeset
54 ds = self.SPEED * dt
646bb61c9ea6 The snake is a li(n)e!
Simon Cross <hodgestar@gmail.com>
parents: 125
diff changeset
55 self.pos = (x + ox * ds, y + oy * ds)
119
119c0fb758c2 Move key handling into GameWidget and GameWidget into widgets.game.
Simon Cross <hodgestar@gmail.com>
parents: 118
diff changeset
56
145
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
57 for i in reversed(xrange(1, len(self.xs))):
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
58 self.xs[i] = self.xs[i - 1]
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
59 self.ys[i] = self.ys[i - 1]
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
60 self.xs[0] = self.pos[0]
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
61 self.ys[0] = self.pos[1]
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
62
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
63 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
64 self.orientation = orientation
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
65 #self.orientation = orientation
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
66 #for segment in self.segments:
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
67 # segment.set_orientation(self)
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
68
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
69
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
70 class Segment(BaseSprite):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
71
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
72 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
73 BLUE = mutators.BLUE
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
74 RED = mutators.RED
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
75 YELLOW = mutators.YELLOW
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
76
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
77 _detail_mutators = ()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
78
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
79 def __init__(self, image_name, tile_pos):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
80 super(Segment, self).__init__()
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
81 self.set_base_image(image_name)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
82 self._colour_overlay = self.GREEN
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
83 self._orientation = Snake.UP
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
84
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
85 self.make_images()
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
86 self.update_image()
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
87 self.set_tile_pos(tile_pos)
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
88
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
89 def set_base_image(self, image_name):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
90 self._base_image = "/".join(["snake", image_name])
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
91
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
92 def make_images(self):
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
93 self._images = {}
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
94 for orientation, muts in [
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
95 (Snake.RIGHT, (mutators.RIGHT,)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
96 (Snake.LEFT, (mutators.LEFT,)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
97 (Snake.UP, (mutators.UP,)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
98 (Snake.DOWN, (mutators.DOWN,)),
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
99 ]:
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
100 all_muts = (self._colour_overlay,) + self._detail_mutators + muts
141
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 131
diff changeset
101 self._images[orientation] = self.load_image(self._base_image,
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 131
diff changeset
102 all_muts)
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
103
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
104 def update_image(self):
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
105 self.image = self._images[self._orientation]
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
106
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
107 def set_orientation(self, orientation):
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
108 self._orientation = orientation
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
109 self.update_image()
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
110
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
111 def set_colour(self, colour_overlay):
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
112 self._colour_overlay = colour_overlay
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
113 self.make_images()
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
114 self.update_image()
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
115
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
116
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
117 class Head(Segment):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
118 CLOSED = "snake-head"
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
119 OPEN = "snake-head-mouth-open-r"
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
120 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
121 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
122
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
123 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
124 self._detail_mutators = (self.EYE,)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
125 super(Head, self).__init__(self.CLOSED, tile_pos)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
126
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
127 def mouth_open(self):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
128 self.set_base_image(self.OPEN)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
129 self.make_images()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
130 self.update_image()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
131
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
132 def mouth_closed(self):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
133 self.set_base_image(self.CLOSED)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
134 self.make_images()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
135 self.update_image()
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
136
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
137 def tongue_out(self):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
138 self._detail_mutators = (self.EYE, self.TONGUE)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
139 self.make_images()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
140 self.update_image()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
141
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
142 def tongue_in(self):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
143 self._detail_mutators = (self.EYE,)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
144 self.make_images()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
145 self.update_image()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
146
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
147
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
148 class Body(Segment):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
149 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
150 super(Body, self).__init__("snake-body", tile_pos)
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
151
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
152
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
153 class Tail(Segment):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
154 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
155 super(Tail, self).__init__("snake-tail", tile_pos)