Mercurial > mamba
comparison mamba/widgets/level.py @ 555:c014f5023cd2
Test run replays
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Thu, 22 Sep 2011 17:32:38 +0200 |
parents | b308ebaa96f3 |
children | 03c0f1f5488c |
comparison
equal
deleted
inserted
replaced
554:b308ebaa96f3 | 555:c014f5023cd2 |
---|---|
3 from pygame.key import set_repeat | 3 from pygame.key import set_repeat |
4 | 4 |
5 from mamba.widgets.base import Widget | 5 from mamba.widgets.base import Widget |
6 from mamba.constants import TILE_SIZE | 6 from mamba.constants import TILE_SIZE |
7 from mamba.snake import Snake | 7 from mamba.snake import Snake |
8 from mamba.engine import FlipArrowsEvent | 8 from mamba.engine import FlipArrowsEvent, ReplayEvent |
9 | 9 |
10 | 10 |
11 class EditLevelWidget(Widget): | 11 class EditLevelWidget(Widget): |
12 def __init__(self, level, offset=(0, 0)): | 12 def __init__(self, level, offset=(0, 0)): |
13 self.level = level | 13 self.level = level |
20 super(EditLevelWidget, self).__init__(level_rect) | 20 super(EditLevelWidget, self).__init__(level_rect) |
21 self.add_callback(MOUSEBUTTONDOWN, self.place_tile) | 21 self.add_callback(MOUSEBUTTONDOWN, self.place_tile) |
22 self.add_callback(MOUSEBUTTONUP, self.end_draw) | 22 self.add_callback(MOUSEBUTTONUP, self.end_draw) |
23 self.add_callback(MOUSEMOTION, self.draw_tiles) | 23 self.add_callback(MOUSEMOTION, self.draw_tiles) |
24 self.add_callback(FlipArrowsEvent, self.flip_arrows) | 24 self.add_callback(FlipArrowsEvent, self.flip_arrows) |
25 self.add_callback(ReplayEvent, self.handle_replay) | |
25 self.snake = None | 26 self.snake = None |
26 self.snake_alive = False | 27 self.snake_alive = False |
28 self.replay_data = [] | |
29 self.last_run = [] | |
30 self.replay_pos = 0 | |
31 | |
32 def get_replay(self): | |
33 return self.replay_data[:] | |
34 | |
35 def replay(self, run=None): | |
36 if run is None: | |
37 # We exclude the last couple of steps, so we don't redo | |
38 # the final crash in this run | |
39 run = self.last_run[:-4] | |
40 if len(run) > 0: | |
41 self.start_test() | |
42 ReplayEvent.post(run, 0) | |
43 | |
44 def handle_replay(self, ev, widget): | |
45 self.apply_action(ev.run[ev.replay_pos]) | |
46 if ev.replay_pos < len(ev.run) - 1: | |
47 ReplayEvent.post(ev.run, ev.replay_pos + 1) | |
27 | 48 |
28 def start_test(self): | 49 def start_test(self): |
29 self.level.update_tiles_ascii() | 50 self.level.update_tiles_ascii() |
51 self.last_run = self.replay_data | |
52 self.replay_data = [] | |
30 self.level.restart() | 53 self.level.restart() |
31 tile_pos, orientation = self.level.get_entry() | 54 tile_pos, orientation = self.level.get_entry() |
32 self.snake = Snake(tile_pos, orientation) | 55 self.snake = Snake(tile_pos, orientation) |
33 set_repeat(40, 100) | 56 set_repeat(40, 100) |
34 self.snake_alive = True | 57 self.snake_alive = True |
60 | 83 |
61 def get_sprite(self, sprite_id): | 84 def get_sprite(self, sprite_id): |
62 return self.level.extra_sprites[sprite_id] | 85 return self.level.extra_sprites[sprite_id] |
63 | 86 |
64 def apply_action(self, orientation): | 87 def apply_action(self, orientation): |
88 self.replay_data.append(orientation) | |
65 if not self.snake or not self.snake_alive: | 89 if not self.snake or not self.snake_alive: |
66 return | 90 return |
67 # We choose numbers that are close to, but not exactly, move 0.5 tiles | 91 # We choose numbers that are close to, but not exactly, move 0.5 tiles |
68 # to avoid a couple of rounding corner cases in the snake code | 92 # to avoid a couple of rounding corner cases in the snake code |
69 if orientation is None or orientation == self.snake.orientation: | 93 if orientation is None or orientation == self.snake.orientation: |