changeset 205:51f979ddddbb

Munge in interior wall drawing
author Neil Muller <drnlmuller@gmail.com>
date Tue, 03 Sep 2013 23:31:54 +0200
parents 687459429550
children 42c565c5ce76
files tools/area_editor.py
diffstat 1 files changed, 40 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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(