Mercurial > nagslang
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) |