Mercurial > mamba
changeset 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 | d920768357de |
children | 498c1d659a94 |
files | mamba/snake.py |
diffstat | 1 files changed, 34 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/mamba/snake.py Wed Sep 14 19:55:15 2011 +0200 +++ b/mamba/snake.py Wed Sep 14 20:14:41 2011 +0200 @@ -12,6 +12,7 @@ def __init__(self, tile_pos, orientation): self.segments = self.create_segments(tile_pos, orientation) + self.pending_segments = [] # segments waiting to be added self.segment_group = Group() self.segment_group.add(*reversed(self.segments)) self.set_orientation(orientation) @@ -30,6 +31,29 @@ segments.append(cls((tx, ty))) return segments + def add_segment(self, segment=None): + if segment is None: + segment = Body((0, 0)) + self.pending_segments.append(segment) + + def remove_segment(self, segment=None): + if segment is None: + if len(self.segments) < 3: + return + segment = self.segments[-2] + try: + idx = self.segments.index(segment) + except IndexError: + return + self.shiftup_segments(idx, segment.get_tile_state()) + del self.segments[idx] + + def shiftup_segments(self, idx, state): + for segment in self.segments[idx:]: + next_state = segment.get_tile_state() + segment.shift_tile(state) + state = next_state + def draw(self, surface): self.segment_group.draw(surface) @@ -42,26 +66,27 @@ shifted, ds = self.head.shift_head(ds) if not shifted: break - self.head.set_orientation(self.orientation) - for segment in self.segments[1:]: - old_tile_state = segment.get_tile_state() - segment.shift_tile(tile_state) - tile_state = old_tile_state + self.shiftup_segments(1, tile_state) + if not self.check_uturn(): + self.head.set_orientation(self.orientation) for segment in self.segments: segment.shift_pixels(ds) world.interact(segment) - def set_orientation(self, orientation): + def check_uturn(self): if len(self.segments) > 1: neck_x, neck_y = self.segments[1].tile_pos head_x, head_y = self.head.tile_pos - if (head_x + orientation[0] == neck_x and - head_y + orientation[1] == neck_y): + if (head_x + self.orientation[0] == neck_x and + head_y + self.orientation[1] == neck_y): # Don't allow the snake to go back on itself # immediately. More creative self-inflicted # deaths are allowed though. - return + return True + return False + + def set_orientation(self, orientation): self.orientation = orientation def crash(self):