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: