Mercurial > mamba
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 |
rev | line source |
---|---|
78 | 1 """The player snake object.""" |
2 | |
110 | 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 | 7 |
128 | 8 from mamba.sprites import BaseSprite, tile_sizify |
98 | 9 from mamba import mutators |
78 | 10 |
11 | |
110 | 12 class Snake(object): |
78 | 13 |
110 | 14 UP, DOWN, LEFT, RIGHT = [(0, -1), (0, 1), (-1, 0), (1, 0)] |
129 | 15 SPEED = 60.0 # pixels / s |
78 | 16 |
17 def __init__(self, tile_pos, orientation): | |
110 | 18 self.segments = self.create_segments(tile_pos, orientation) |
19 self.segment_group = Group() | |
20 self.segment_group.add(*self.segments) | |
78 | 21 self.set_orientation(orientation) |
128 | 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 | 26 |
110 | 27 head = property(fget=lambda self: self.segments[0]) |
28 tail = property(fget=lambda self: self.segments[-1]) | |
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 | 36 def create_segments(self, tile_pos, orientation): |
37 x, y = tile_pos | |
38 dx, dy = orientation | |
39 return [Head((x, y)), | |
40 Body((x + dx, y + dy)), | |
41 Tail((x + 2 * dx, y + 2 * dy)), | |
42 ] | |
43 | |
44 def draw(self, surface): | |
128 | 45 # self.segment_group.draw(surface) |
129 | 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 | 50 |
122
45dd79e9ba1b
Rudimentary FPS and clock ticking.
Simon Cross <hodgestar@gmail.com>
parents:
119
diff
changeset
|
51 def update(self, dt): |
128 | 52 x, y = self.pos |
53 ox, oy = self.orientation | |
54 ds = self.SPEED * dt | |
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 | 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 | 65 #self.orientation = orientation |
66 #for segment in self.segments: | |
67 # segment.set_orientation(self) | |
98 | 68 |
69 | |
110 | 70 class Segment(BaseSprite): |
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 | 77 _detail_mutators = () |
78 | |
110 | 79 def __init__(self, image_name, tile_pos): |
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 | 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 | 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 | 92 def make_images(self): |
110 | 93 self._images = {} |
94 for orientation, muts in [ | |
95 (Snake.RIGHT, (mutators.RIGHT,)), | |
96 (Snake.LEFT, (mutators.LEFT,)), | |
97 (Snake.UP, (mutators.UP,)), | |
98 (Snake.DOWN, (mutators.DOWN,)), | |
99 ]: | |
131 | 100 all_muts = (self._colour_overlay,) + self._detail_mutators + muts |
141 | 101 self._images[orientation] = self.load_image(self._base_image, |
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 | 106 |
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 | 112 self._colour_overlay = colour_overlay |
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 | 115 |
116 | |
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 | 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 | 136 |
131 | 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 | 139 self.make_images() |
140 self.update_image() | |
141 | |
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 | 144 self.make_images() |
145 self.update_image() | |
146 | |
110 | 147 |
148 class Body(Segment): | |
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 | 151 |
152 | |
153 class Tail(Segment): | |
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) |