comparison tools/area_editor.py @ 458:0f8945232e54

Move whole polygons.
author Simon Cross <hodgestar@gmail.com>
date Sat, 07 Sep 2013 15:39:49 +0200
parents 707d06a77f39
children 41ebc538109c
comparison
equal deleted inserted replaced
445:79ba44e04b57 458:0f8945232e54
124 startpoint = self.point_to_pymunk(start_pos) 124 startpoint = self.point_to_pymunk(start_pos)
125 endpoint = self.point_to_pymunk(end_pos) 125 endpoint = self.point_to_pymunk(end_pos)
126 self.lines.append([startpoint, endpoint]) 126 self.lines.append([startpoint, endpoint])
127 127
128 def draw(self, mouse_pos, mouse_poly, filled, draw_cand_line, start_pos, 128 def draw(self, mouse_pos, mouse_poly, filled, draw_cand_line, start_pos,
129 move_point_mode, move_point, zoom_factor): 129 move_point_mode, move_poly_mode, move_point, zoom_factor):
130 self._draw_background(True) 130 self._draw_background(True)
131 # Draw polygons as needed for the editor 131 # Draw polygons as needed for the editor
132 line_width = int(2 * zoom_factor) 132 line_width = int(2 * zoom_factor)
133 if filled: 133 if filled:
134 self._draw_exterior(True) 134 self._draw_exterior(True)
135 for index, polygon in self.polygons.items(): 135 for index, polygon in self.polygons.items():
136 color = POLY_COLORS.get(index, pygame.color.THECOLORS['black']) 136 color = POLY_COLORS.get(index, pygame.color.THECOLORS['black'])
137 if move_point_mode and index == self._move_poly: 137 if move_point_mode and index == self._move_poly and move_point:
138 pointlist = [p for p in polygon] 138 pointlist = [p for p in polygon]
139 pointlist = [self.point_to_pygame(p) if p != move_point else 139 pointlist = [self.point_to_pygame(p) if p != move_point else
140 mouse_pos for p in pointlist] 140 mouse_pos for p in pointlist]
141 pygame.draw.lines(self._surface, color, False, pointlist,
142 line_width)
143 break
144 if move_poly_mode and index == self._move_poly and move_point:
145 pointlist = [p for p in self.translate_poly(
146 polygon, move_point, mouse_pos)]
141 pygame.draw.lines(self._surface, color, False, pointlist, 147 pygame.draw.lines(self._surface, color, False, pointlist,
142 line_width) 148 line_width)
143 break 149 break
144 if len(polygon) > 1: 150 if len(polygon) > 1:
145 pointlist = [self.point_to_pygame(p) for p in polygon] 151 pointlist = [self.point_to_pygame(p) for p in polygon]
236 if dist < mindist: 242 if dist < mindist:
237 mindist = dist 243 mindist = dist
238 move_point = point 244 move_point = point
239 self._move_poly = None 245 self._move_poly = None
240 return move_point 246 return move_point
247
248 def translate_poly(self, poly, move_point, mouse_point):
249 print "Translate!"
250 dx = mouse_point[0] - move_point[0]
251 dy = mouse_point[1] - move_point[1]
252 new_poly = [(p[0] + dx, p[1] + dy) for p in poly]
253 return new_poly
254
255 def replace_poly(self, old_point, new_point):
256 print "Replace!", self._move_poly
257 new_point = self.point_to_pymunk(new_point)
258 if self._move_poly:
259 self.polygons[self._move_poly] = self.translate_poly(
260 self.polygons[self._move_poly], old_point, new_point)
241 261
242 def replace_vertex(self, old_point, new_point): 262 def replace_vertex(self, old_point, new_point):
243 new_point = self.point_to_pymunk(new_point) 263 new_point = self.point_to_pymunk(new_point)
244 if self._move_poly: 264 if self._move_poly:
245 new_polygon = [p if p != old_point else new_point for p in 265 new_polygon = [p if p != old_point else new_point for p in
415 self.grid_size = 1 435 self.grid_size = 1
416 self.sel_mode = False 436 self.sel_mode = False
417 self._start_pos = None 437 self._start_pos = None
418 self._parent = parent 438 self._parent = parent
419 self._move_point_mode = False 439 self._move_point_mode = False
440 self._move_poly_mode = False
420 self._move_point = False 441 self._move_point = False
421 self._zoom_factor = 1.0 442 self._zoom_factor = 1.0
422 443
423 def _level_coordinates(self, pos): 444 def _level_coordinates(self, pos):
424 # Move positions to level values 445 # Move positions to level values
478 mouse_pos = self.snap_to_grid(mouse_pos) 499 mouse_pos = self.snap_to_grid(mouse_pos)
479 elif self._draw_lines: 500 elif self._draw_lines:
480 # Interior wall mode 501 # Interior wall mode
481 mouse_pos = self._level_coordinates(self.mouse_pos) 502 mouse_pos = self._level_coordinates(self.mouse_pos)
482 mouse_pos = self.snap_to_grid(mouse_pos) 503 mouse_pos = self.snap_to_grid(mouse_pos)
483 elif self._move_point_mode: 504 elif self._move_point_mode or self._move_poly_mode:
484 mouse_pos = self._level_coordinates(self.mouse_pos) 505 mouse_pos = self._level_coordinates(self.mouse_pos)
485 mouse_pos = self.snap_to_grid(mouse_pos) 506 mouse_pos = self.snap_to_grid(mouse_pos)
486 else: 507 else:
487 mouse_pos = None 508 mouse_pos = None
488 level_surface = level.draw(mouse_pos, self.cur_poly, self.filled_mode, 509 level_surface = level.draw(mouse_pos, self.cur_poly, self.filled_mode,
489 self._draw_lines, self._start_pos, 510 self._draw_lines, self._start_pos,
490 self._move_point_mode, self._move_point, 511 self._move_point_mode, self._move_poly_mode,
512 self._move_point,
491 self._zoom_factor) 513 self._zoom_factor)
492 if self._draw_objects: 514 if self._draw_objects:
493 for thing in self.level.drawables: 515 for thing in self.level.drawables:
494 if not isinstance(thing, ne.Enemy): 516 if not isinstance(thing, ne.Enemy):
495 thing.render(level_surface) 517 thing.render(level_surface)
518 self._parent.reset_lit_buttons() 540 self._parent.reset_lit_buttons()
519 self._draw_lines = True 541 self._draw_lines = True
520 self.filled_mode = False 542 self.filled_mode = False
521 self._start_pos = None 543 self._start_pos = None
522 self._move_point_mode = False 544 self._move_point_mode = False
545 self._move_poly_mode = False
523 546
524 def key_down(self, ev): 547 def key_down(self, ev):
525 if ev.key == pgl.K_LEFT: 548 if ev.key == pgl.K_LEFT:
526 self._move_view((-10, 0)) 549 self._move_view((-10, 0))
527 elif ev.key == pgl.K_RIGHT: 550 elif ev.key == pgl.K_RIGHT:
539 elif ev.key == pgl.K_f: 562 elif ev.key == pgl.K_f:
540 self.set_filled() 563 self.set_filled()
541 elif ev.key == pgl.K_c: 564 elif ev.key == pgl.K_c:
542 self.close_poly() 565 self.close_poly()
543 566
567 def set_move_poly_mode(self):
568 self._draw_lines = False
569 self._move_point_mode = False
570 self._move_poly_mode = True
571 self.filled_mode = False
572 self._parent.reset_lit_buttons()
573 self._move_point = None
574
544 def set_move_mode(self): 575 def set_move_mode(self):
545 self._draw_lines = False 576 self._draw_lines = False
546 self._move_point_mode = True 577 self._move_point_mode = True
578 self._move_poly_mode = False
547 self.filled_mode = False 579 self.filled_mode = False
548 self._parent.reset_lit_buttons() 580 self._parent.reset_lit_buttons()
549 self._move_point = None 581 self._move_point = None
550 582
551 def set_filled(self): 583 def set_filled(self):
554 self.cur_poly = None 586 self.cur_poly = None
555 self._parent.reset_lit_buttons() 587 self._parent.reset_lit_buttons()
556 self.filled_mode = True 588 self.filled_mode = True
557 self._draw_lines = False 589 self._draw_lines = False
558 self._move_point_mode = False 590 self._move_point_mode = False
591 self._move_poly_mode = False
559 else: 592 else:
560 alert('Not all polygons closed, so not filling') 593 alert('Not all polygons closed, so not filling')
561 594
562 def mouse_move(self, ev): 595 def mouse_move(self, ev):
563 old_pos = self.mouse_pos 596 old_pos = self.mouse_pos
564 self.mouse_pos = ev.pos 597 self.mouse_pos = ev.pos
565 if old_pos != self.mouse_pos and (self.cur_poly or self._draw_lines 598 if old_pos != self.mouse_pos and (self.cur_poly or self._draw_lines
566 or self._move_point_mode): 599 or self._move_point_mode
600 or self._move_poly_mode):
567 self.invalidate() 601 self.invalidate()
568 602
569 def mouse_drag(self, ev): 603 def mouse_drag(self, ev):
570 if self._mouse_drag: 604 if self._mouse_drag:
571 old_pos = self.mouse_pos 605 old_pos = self.mouse_pos
576 self.invalidate() 610 self.invalidate()
577 611
578 def mouse_down(self, ev): 612 def mouse_down(self, ev):
579 corrected_pos = self._level_coordinates(ev.pos) 613 corrected_pos = self._level_coordinates(ev.pos)
580 snapped_pos = self.snap_to_grid(corrected_pos) 614 snapped_pos = self.snap_to_grid(corrected_pos)
615 print self._move_poly_mode, ev.button, self._move_point
581 if self.sel_mode and ev.button == 1: 616 if self.sel_mode and ev.button == 1:
582 obj = self.level.find_obj_at_pos(corrected_pos) 617 obj = self.level.find_obj_at_pos(corrected_pos)
583 if obj is not None: 618 if obj is not None:
584 self._edit_selected(obj) 619 self._edit_selected(obj)
620 elif self._move_poly_mode and ev.button == 1:
621 if self._move_point:
622 # Place the current point
623 self.level.replace_poly(self._move_point, snapped_pos)
624 self._move_point = None
625 self.invalidate()
626 else:
627 # find the current point
628 self._move_point = self.level.find_vertex(snapped_pos)
629 print "NEW MOV:", self._move_point
585 elif self._move_point_mode and ev.button == 1: 630 elif self._move_point_mode and ev.button == 1:
586 if self._move_point: 631 if self._move_point:
587 # Place the current point 632 # Place the current point
588 self.level.replace_vertex(self._move_point, snapped_pos) 633 self.level.replace_vertex(self._move_point, snapped_pos)
589 self._move_point = None 634 self._move_point = None
886 end_poly_but.rect = BUTTON_RECT.copy() 931 end_poly_but.rect = BUTTON_RECT.copy()
887 end_poly_but.rect.move_ip(MENU_LEFT, y) 932 end_poly_but.rect.move_ip(MENU_LEFT, y)
888 widgets.append(end_poly_but) 933 widgets.append(end_poly_but)
889 y += MENU_BUTTON_HEIGHT + MENU_PAD 934 y += MENU_BUTTON_HEIGHT + MENU_PAD
890 935
891 self.move_point_but = HighLightButton("Move Point", self, 936 self.move_point_but = HighLightButton("Mv Point", self,
892 action=self.move_point) 937 action=self.move_point)
893 self.move_point_but.rect = BUTTON_RECT.copy() 938 self.move_point_but.rect = HALF_BUTTON_RECT.copy()
894 self.move_point_but.rect.move_ip(MENU_LEFT, y) 939 self.move_point_but.rect.move_ip(MENU_LEFT, y)
895 widgets.append(self.move_point_but) 940 widgets.append(self.move_point_but)
896 self._light_buttons.append(self.move_point_but) 941 self._light_buttons.append(self.move_point_but)
942
943 self.move_poly_but = HighLightButton("Mv Poly", self,
944 action=self.move_poly)
945 self.move_poly_but.rect = HALF_BUTTON_RECT.copy()
946 self.move_poly_but.rect.move_ip(MENU_LEFT + MENU_HALF_WIDTH, y)
947 widgets.append(self.move_poly_but)
948 self._light_buttons.append(self.move_poly_but)
949
897 y += MENU_BUTTON_HEIGHT + MENU_PAD 950 y += MENU_BUTTON_HEIGHT + MENU_PAD
898 951
899 # grid size widgets 952 # grid size widgets
900 grid_size_label = GridSizeLabel( 953 grid_size_label = GridSizeLabel(
901 self.level_widget, width=BUTTON_RECT.width, 954 self.level_widget, width=BUTTON_RECT.width,
1130 self.level_widget.mouse_move(ev) 1183 self.level_widget.mouse_move(ev)
1131 1184
1132 def move_point(self): 1185 def move_point(self):
1133 self.level_widget.set_move_mode() 1186 self.level_widget.set_move_mode()
1134 self.move_point_but.highlight() 1187 self.move_point_but.highlight()
1188
1189 def move_poly(self):
1190 self.level_widget.set_move_poly_mode()
1191 self.move_poly_but.highlight()
1135 1192
1136 def draw(self, surface): 1193 def draw(self, surface):
1137 # Update checkbox state 1194 # Update checkbox state
1138 if self._menu_mode == 'drawing': 1195 if self._menu_mode == 'drawing':
1139 self.level_widget.set_objects(self.show_objs.value) 1196 self.level_widget.set_objects(self.show_objs.value)