Mercurial > nagslang
comparison tools/area_editor.py @ 199:c291fd4b49bf
Add showing objects to the level editor
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Tue, 03 Sep 2013 22:53:23 +0200 |
parents | 05c2c592ce2e |
children | 687459429550 |
comparison
equal
deleted
inserted
replaced
198:05c2c592ce2e | 199:c291fd4b49bf |
---|---|
24 from albow.root import RootWidget | 24 from albow.root import RootWidget |
25 from albow.widget import Widget | 25 from albow.widget import Widget |
26 from albow.controls import Button, Label, CheckBox | 26 from albow.controls import Button, Label, CheckBox |
27 from albow.dialogs import alert | 27 from albow.dialogs import alert |
28 | 28 |
29 from nagslang.options import parse_args | |
29 from nagslang.constants import SCREEN | 30 from nagslang.constants import SCREEN |
30 from nagslang.level import Level, POLY_COLORS | 31 from nagslang.level import Level, POLY_COLORS |
32 from nagslang.enemies import Enemy | |
31 | 33 |
32 | 34 |
33 # layout constants | 35 # layout constants |
34 MENU_BUTTON_HEIGHT = 35 | 36 MENU_BUTTON_HEIGHT = 35 |
35 MENU_PAD = 6 | 37 MENU_PAD = 6 |
122 self.add_point(index, self.point_to_pygame(poss)) | 124 self.add_point(index, self.point_to_pygame(poss)) |
123 self.add_point(index, self.point_to_pygame(first)) | 125 self.add_point(index, self.point_to_pygame(first)) |
124 return True | 126 return True |
125 return False | 127 return False |
126 | 128 |
127 def draw(self, surface, topleft, mouse_pos, mouse_poly, filled): | 129 def draw(self, mouse_pos, mouse_poly, filled): |
128 self._draw_background(True) | 130 self._draw_background(True) |
129 # Draw polygons as needed for the editor | 131 # Draw polygons as needed for the editor |
130 if filled: | 132 if filled: |
131 self._draw_exterior(True) | 133 self._draw_exterior(True) |
132 for index, polygon in self.polygons.items(): | 134 for index, polygon in self.polygons.items(): |
137 if index == mouse_poly and mouse_pos: | 139 if index == mouse_poly and mouse_pos: |
138 endpoint = self.fix_angle(index, mouse_pos) | 140 endpoint = self.fix_angle(index, mouse_pos) |
139 pygame.draw.line(self._surface, color, | 141 pygame.draw.line(self._surface, color, |
140 self.point_to_pygame(polygon[-1]), | 142 self.point_to_pygame(polygon[-1]), |
141 self.point_to_pygame(endpoint)) | 143 self.point_to_pygame(endpoint)) |
142 surface_area = pygame.rect.Rect(topleft, SCREEN) | 144 return self._surface.copy() |
143 surface.blit(self._surface, (0, 0), surface_area) | |
144 | 145 |
145 | 146 |
146 class LevelWidget(Widget): | 147 class LevelWidget(Widget): |
147 | 148 |
148 def __init__(self, level): | 149 def __init__(self, level): |
152 self.pos = (0, 0) | 153 self.pos = (0, 0) |
153 self.filled_mode = False | 154 self.filled_mode = False |
154 self.mouse_pos = None | 155 self.mouse_pos = None |
155 self.cur_poly = None | 156 self.cur_poly = None |
156 self._mouse_drag = False | 157 self._mouse_drag = False |
158 self._draw_objects = False | |
159 self._draw_enemies = False | |
157 | 160 |
158 def _level_coordinates(self, pos): | 161 def _level_coordinates(self, pos): |
159 # Move positions to level values | 162 # Move positions to level values |
160 if not pos: | 163 if not pos: |
161 return (0, 0) | 164 return (0, 0) |
171 new_pos[1] = self.pos[1] | 174 new_pos[1] = self.pos[1] |
172 elif new_pos[1] > self.level.y - SCREEN[1]: | 175 elif new_pos[1] > self.level.y - SCREEN[1]: |
173 new_pos[1] = self.pos[1] | 176 new_pos[1] = self.pos[1] |
174 self.pos = tuple(new_pos) | 177 self.pos = tuple(new_pos) |
175 | 178 |
179 def set_objects(self, value): | |
180 if self._draw_objects != value: | |
181 self._draw_objects = value | |
182 self.invalidate() | |
183 | |
184 def set_enemies(self, value): | |
185 if self._draw_enemies != value: | |
186 self._draw_enemies = value | |
187 self.invalidate() | |
188 | |
176 def draw(self, surface): | 189 def draw(self, surface): |
177 if (self.cur_poly is not None and self.cur_poly in self.level.polygons | 190 if (self.cur_poly is not None and self.cur_poly in self.level.polygons |
178 and len(self.level.polygons[self.cur_poly])): | 191 and len(self.level.polygons[self.cur_poly])): |
179 # We have an active polygon | 192 # We have an active polygon |
180 mouse_pos = self._level_coordinates(self.mouse_pos) | 193 mouse_pos = self._level_coordinates(self.mouse_pos) |
181 else: | 194 else: |
182 mouse_pos = None | 195 mouse_pos = None |
183 level.draw(surface, self.pos, mouse_pos, self.cur_poly, | 196 level_surface = level.draw(mouse_pos, self.cur_poly, self.filled_mode) |
184 self.filled_mode) | 197 if self._draw_objects: |
198 for thing in self.level.drawables: | |
199 if not isinstance(thing, Enemy): | |
200 thing.render(level_surface) | |
201 if self._draw_enemies: | |
202 for thing in self.level.drawables: | |
203 if isinstance(thing, Enemy): | |
204 thing.render(level_surface) | |
205 surface_area = pygame.rect.Rect(self.pos, SCREEN) | |
206 surface.blit(level_surface, (0, 0), surface_area) | |
185 | 207 |
186 def change_poly(self, new_poly): | 208 def change_poly(self, new_poly): |
187 self.cur_poly = new_poly | 209 self.cur_poly = new_poly |
188 if self.cur_poly is not None: | 210 if self.cur_poly is not None: |
189 self.filled_mode = False | 211 self.filled_mode = False |
375 alert("Failed to save level.\n\n%s" % '\n'.join(messages)) | 397 alert("Failed to save level.\n\n%s" % '\n'.join(messages)) |
376 | 398 |
377 def mouse_move(self, ev): | 399 def mouse_move(self, ev): |
378 self.level_widget.mouse_move(ev) | 400 self.level_widget.mouse_move(ev) |
379 | 401 |
402 def draw(self, surface): | |
403 # Update checkbox state | |
404 self.level_widget.set_objects(self.show_objs.value) | |
405 self.level_widget.set_enemies(self.show_enemies.value) | |
406 super(EditorApp, self).draw(surface) | |
407 | |
380 | 408 |
381 if __name__ == "__main__": | 409 if __name__ == "__main__": |
382 if len(sys.argv) not in [2, 4]: | 410 if len(sys.argv) not in [2, 4]: |
383 print 'Please supply a levelname or levelname and level size' | 411 print 'Please supply a levelname or levelname and level size' |
384 sys.exit() | 412 sys.exit() |
413 # Need to ensure we have defaults for rendering | |
414 parse_args([]) | |
385 pygame.display.init() | 415 pygame.display.init() |
386 pygame.font.init() | 416 pygame.font.init() |
387 pygame.display.set_mode((SCREEN[0] + MENU_WIDTH, SCREEN[1]), | 417 pygame.display.set_mode((SCREEN[0] + MENU_WIDTH, SCREEN[1]), |
388 pgl.SWSURFACE) | 418 pgl.SWSURFACE) |
389 if len(sys.argv) == 2: | 419 if len(sys.argv) == 2: |