# HG changeset patch # User Neil Muller # Date 1378243914 -7200 # Node ID 51f979ddddbbab292d935d7130ea1c4c6ff61836 # Parent 6874594295508a8f9e76b7eb5dd31cd8c8293abd Munge in interior wall drawing diff -r 687459429550 -r 51f979ddddbb tools/area_editor.py --- a/tools/area_editor.py Tue Sep 03 23:14:48 2013 +0200 +++ b/tools/area_editor.py Tue Sep 03 23:31:54 2013 +0200 @@ -62,13 +62,10 @@ point = self.point_to_pymunk(self.round_point(pos)) self.polygons[poly_index].append(point) else: - add_pos = self.fix_angle(poly_index, pos) + add_pos = self.fix_poly_angle(poly_index, pos) self.polygons[poly_index].append(add_pos) - def fix_angle(self, index, pos): - # Last point - point1 = self.point_to_pygame(self.polygons[index][-1]) - pos = self.round_point(pos) + def _fix_angle(self, point1, pos): # We want the line (point1 to pos) to be an angle of # 0, 45, 90, 135, 180, 225, 270, 305 # However, we only need to consider half the circle @@ -89,6 +86,17 @@ min_dist = dist return self.point_to_pymunk(new_pos) + def fix_line_angle(self, start_pos, pos): + start_pos = self.round_point(start_pos) + pos = self.round_point(pos) + return self._fix_angle(start_pos, pos) + + def fix_poly_angle(self, index, pos): + # Last point + point1 = self.point_to_pygame(self.polygons[index][-1]) + pos = self.round_point(pos) + return self._fix_angle(point1, pos) + def delete_point(self, index): if index in self.polygons and len(self.polygons[index]) > 0: self.polygons[index].pop() @@ -102,7 +110,7 @@ # Too small return False first = self.polygons[index][0] - if self.fix_angle(index, self.point_to_pygame(first)) == first: + if self.fix_poly_angle(index, self.point_to_pygame(first)) == first: self.add_point(index, self.point_to_pygame(first)) return True candidates = [(first[0] + 10 * i, first[1]) for @@ -116,7 +124,7 @@ min_dist = 99999 poss = None for cand in candidates: - if self.fix_angle(index, self.point_to_pygame(cand)) == cand: + if self.fix_poly_angle(index, self.point_to_pygame(cand)) == cand: dist = (first[0] - cand[0]) ** 2 + (first[1] - cand[1]) ** 2 if dist < min_dist: poss = cand @@ -126,7 +134,12 @@ return True return False - def draw(self, mouse_pos, mouse_poly, filled): + def add_line(self, start_pos, end_pos): + endpoint = self.fix_line_angle(start_pos, end_pos) + startpoint = self.point_to_pymunk(self.round_point(start_pos)) + self.lines.append([startpoint, endpoint]) + + def draw(self, mouse_pos, mouse_poly, filled, draw_cand_line, start_pos): self._draw_background(True) # Draw polygons as needed for the editor if filled: @@ -137,13 +150,18 @@ pointlist = [self.point_to_pygame(p) for p in polygon] pygame.draw.lines(self._surface, color, False, pointlist, 2) if index == mouse_poly and mouse_pos: - endpoint = self.fix_angle(index, mouse_pos) + endpoint = self.fix_poly_angle(index, mouse_pos) pygame.draw.line(self._surface, color, self.point_to_pygame(polygon[-1]), self.point_to_pygame(endpoint)) for line in self.lines: pointlist = [self.point_to_pygame(p) for p in line] pygame.draw.lines(self._surface, LINE_COLOR, False, pointlist, 2) + if draw_cand_line and start_pos and mouse_pos: + endpoint = self.fix_line_angle(start_pos, mouse_pos) + pointlist = [self.round_point(start_pos), + self.point_to_pygame(endpoint)] + pygame.draw.lines(self._surface, LINE_COLOR, False, pointlist, 1) return self._surface.copy() @@ -161,6 +179,7 @@ self._draw_objects = False self._draw_enemies = False self._draw_lines = False + self._start_pos = None def _level_coordinates(self, pos): # Move positions to level values @@ -195,9 +214,13 @@ and len(self.level.polygons[self.cur_poly])): # We have an active polygon mouse_pos = self._level_coordinates(self.mouse_pos) + elif self._draw_lines: + # Interior wall mode + mouse_pos = self._level_coordinates(self.mouse_pos) else: mouse_pos = None - level_surface = level.draw(mouse_pos, self.cur_poly, self.filled_mode) + level_surface = level.draw(mouse_pos, self.cur_poly, self.filled_mode, + self._draw_lines, self._start_pos) if self._draw_objects: for thing in self.level.drawables: if not isinstance(thing, Enemy): @@ -219,6 +242,7 @@ self.cur_poly = None self._draw_lines = True self.filled_mode = False + self._start_pos = None def key_down(self, ev): if ev.key == pgl.K_LEFT: @@ -252,7 +276,7 @@ def mouse_move(self, ev): old_pos = self.mouse_pos self.mouse_pos = ev.pos - if self.cur_poly and old_pos != self.mouse_pos: + if old_pos != self.mouse_pos and (self.cur_poly or self._draw_lines): self.invalidate() def mouse_drag(self, ev): @@ -267,7 +291,11 @@ def mouse_down(self, ev): if ev.button == 1: if self._draw_lines: - pass + if self._start_pos is None: + self._start_pos = ev.pos + else: + self.level.add_line(self._start_pos, ev.pos) + self._start_pos = None else: print "Click: %r" % ( self.level.point_to_pymunk(