comparison tools/area_editor.py @ 108:dde91f8c4335

Add fonts needed for Albowifying the editor
author Neil Muller <drnlmuller@gmail.com>
date Mon, 02 Sep 2013 13:59:11 +0200
parents 67f8b06a433d
children 817d4a62135c
comparison
equal deleted inserted replaced
107:b90d01e4d9d4 108:dde91f8c4335
15 import sys 15 import sys
16 16
17 import pygame 17 import pygame
18 import pygame.locals as pgl 18 import pygame.locals as pgl
19 19
20 from albow.root import RootWidget
21 from albow.widget import Widget
22 from albow.controls import Button, Image
23 from albow.resource import get_font
24
20 sys.path.append(os.path.join(os.path.dirname(__file__), '..')) 25 sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
21 26
22 from nagslang.constants import SCREEN, FPS 27 from nagslang.constants import SCREEN, FPS
23 from nagslang.level import Level, POLY_COLORS 28 from nagslang.level import Level, POLY_COLORS
29
30
31 # layout constants
32 MENU_WIDTH = 200
33 MENU_BUTTON_HEIGHT = 35
24 34
25 35
26 class EditorLevel(Level): 36 class EditorLevel(Level):
27 37
28 def __init__(self, name, x=800, y=600): 38 def __init__(self, name, x=800, y=600):
92 self.point_to_pygame(polygon[-1]), 102 self.point_to_pygame(polygon[-1]),
93 self.point_to_pygame(endpoint)) 103 self.point_to_pygame(endpoint))
94 surface_area = pygame.rect.Rect(topleft, SCREEN) 104 surface_area = pygame.rect.Rect(topleft, SCREEN)
95 surface.blit(self._surface, (0, 0), surface_area) 105 surface.blit(self._surface, (0, 0), surface_area)
96 106
97 107 class LevelWidget(Widget):
98 class Editor(object): 108
99 109 def __init__(self, level):
100 def __init__(self, level, surface): 110 super(LevelWidget, self).__init__(pygame.rect.Rect(0, 0,
111 SCREEN[0], SCREEN[1]))
101 self.level = level 112 self.level = level
102 self.surface = surface
103 self.pos = (0, 0) 113 self.pos = (0, 0)
114 self.filled_mode = False
115 self.mouse_pos = None
104 self.cur_poly = None 116 self.cur_poly = None
105 self.mouse_pos = None 117
106 self.filled_mode = False 118 def _level_coordinates(self, pos):
107 119 # Move positions to level values
108 def move_view(self, offset): 120 if not pos:
121 return (0, 0)
122 return pos[0] + self.pos[0], pos[1] + self.pos[1]
123
124 def _move_view(self, offset):
109 new_pos = [self.pos[0] + offset[0], self.pos[1] + offset[1]] 125 new_pos = [self.pos[0] + offset[0], self.pos[1] + offset[1]]
110 if new_pos[0] < 0: 126 if new_pos[0] < 0:
111 new_pos[0] = self.pos[0] 127 new_pos[0] = self.pos[0]
112 elif new_pos[0] > self.level.x - SCREEN[0]: 128 elif new_pos[0] > self.level.x - SCREEN[0]:
113 new_pos[0] = self.pos[0] 129 new_pos[0] = self.pos[0]
115 new_pos[1] = self.pos[1] 131 new_pos[1] = self.pos[1]
116 elif new_pos[1] > self.level.y - SCREEN[1]: 132 elif new_pos[1] > self.level.y - SCREEN[1]:
117 new_pos[1] = self.pos[1] 133 new_pos[1] = self.pos[1]
118 self.pos = tuple(new_pos) 134 self.pos = tuple(new_pos)
119 135
120 def draw(self): 136
137 def draw(self, surface):
121 if (self.cur_poly is not None and self.cur_poly in self.level.polygons 138 if (self.cur_poly is not None and self.cur_poly in self.level.polygons
122 and len(self.level.polygons[self.cur_poly])): 139 and len(self.level.polygons[self.cur_poly])):
123 # We have an active polygon 140 # We have an active polygon
124 mouse_pos = self._level_coordinates(self.mouse_pos) 141 mouse_pos = self._level_coordinates(self.mouse_pos)
125 else: 142 else:
126 mouse_pos = None 143 mouse_pos = None
127 self.level.draw(self.surface, self.pos, mouse_pos, 144 level.draw(surface, self.pos, self.mouse_pos, self.cur_poly,
128 self.cur_poly, self.filled_mode) 145 self.filled_mode)
129 146
130 def _level_coordinates(self, pos): 147 def key_down(self, ev):
131 # Move positions to level values 148 if ev.key == pgl.K_LEFT:
132 if not pos: 149 self._move_view((-10, 0))
133 return (0, 0) 150 elif ev.key == pgl.K_RIGHT:
134 return pos[0] + self.pos[0], pos[1] + self.pos[1] 151 self._move_view((10, 0))
135 152 elif ev.key == pgl.K_UP:
136 def run(self): 153 self._move_view((0, -10))
137 pygame.key.set_repeat(100, 50) 154 elif ev.key == pgl.K_DOWN:
138 running = True 155 self._move_view((0, 10))
139 clock = pygame.time.Clock() 156 elif ev.key == pgl.K_1:
140 while running: 157 self.cur_poly = 1
141 for ev in pygame.event.get(): 158 self.filled_mode = False
142 if ev.type == pgl.QUIT: 159 elif ev.key == pgl.K_2:
143 running = False 160 self.cur_poly = 2
144 elif ev.type == pgl.KEYDOWN: 161 self.filled_mode = False
145 if ev.key == pgl.K_ESCAPE: 162 elif ev.key == pgl.K_3:
146 running = False 163 self.cur_poly = 3
147 elif ev.key == pgl.K_LEFT: 164 self.filled_mode = False
148 self.move_view((-10, 0)) 165 elif ev.key == pgl.K_4:
149 elif ev.key == pgl.K_RIGHT: 166 self.cur_poly = 4
150 self.move_view((10, 0)) 167 self.filled_mode = False
151 elif ev.key == pgl.K_UP: 168 elif ev.key == pgl.K_5:
152 self.move_view((0, -10)) 169 self.cur_poly = 5
153 elif ev.key == pgl.K_DOWN: 170 self.filled_mode = False
154 self.move_view((0, 10)) 171 elif ev.key == pgl.K_6:
155 if ev.key == pgl.K_1: 172 self.cur_poly = 6
156 self.cur_poly = 1 173 self.filled_mode = False
157 self.filled_mode = False 174 elif ev.key == pgl.K_0:
158 if ev.key == pgl.K_2: 175 self.cur_poly = None
159 self.cur_poly = 2 176 elif ev.key == pgl.K_d and self.cur_poly:
160 self.filled_mode = False 177 self.level.delete_point(self.cur_poly)
161 if ev.key == pgl.K_3: 178 elif ev.key == pgl.K_s:
162 self.cur_poly = 3 179 level.save()
163 self.filled_mode = False 180 elif ev.key == pgl.K_f:
164 if ev.key == pgl.K_4: 181 if level.all_closed():
165 self.cur_poly = 4 182 self.cur_poly = None
166 self.filled_mode = False 183 self.filled_mode = True
167 if ev.key == pgl.K_5: 184 else:
168 self.cur_poly = 5 185 print 'Not all polygons closed, so not filling'
169 self.filled_mode = False 186
170 if ev.key == pgl.K_6: 187
171 self.cur_poly = 6 188
172 self.filled_mode = False 189 class EditorApp(RootWidget):
173 if ev.key == pgl.K_0: 190
174 self.cur_poly = None 191 def __init__(self, level, surface):
175 if ev.key == pgl.K_d and self.cur_poly: 192 super(EditorApp, self).__init__(surface)
176 self.level.delete_point(self.cur_poly) 193 self.level = level
177 if ev.key == pgl.K_s: 194 self.level_widget = LevelWidget(self.level)
178 level.save() 195 self.add(self.level_widget)
179 if ev.key == pgl.K_f: 196
180 if level.all_closed(): 197 quit_but = Button('Quit', action=self.quit)
181 self.cur_poly = None 198 quit_but.rect = pygame.rect.Rect(0, 0, MENU_WIDTH, MENU_BUTTON_HEIGHT)
182 self.filled_mode = True 199 quit_but.rect.move_ip(SCREEN[0], 25)
183 else: 200 self.add(quit_but)
184 print 'Not all polygons closed, so not filling' 201
185 elif ev.type == pgl.MOUSEBUTTONDOWN and self.cur_poly: 202 # elif ev.type == pgl.MOUSEBUTTONDOWN and self.cur_poly:
186 # Add a point 203 # # Add a point
187 self.level.add_point(self.cur_poly, 204 # self.level.add_point(self.cur_poly,
188 self._level_coordinates(ev.pos)) 205 # self._level_coordinates(ev.pos))
189 elif ev.type == pgl.MOUSEMOTION: 206 # elif ev.type == pgl.MOUSEMOTION:
190 self.mouse_pos = ev.pos 207 # self.mouse_pos = ev.pos
191 self.draw() 208 # self.draw()
192 pygame.display.flip() 209 # pygame.display.flip()
193 clock.tick(FPS) 210 # clock.tick(FPS)
211
212 def key_down(self, ev):
213 if ev.key == pgl.K_ESCAPE:
214 self.quit()
215 else:
216 self.level_widget.key_down(ev)
194 217
195 218
196 if __name__ == "__main__": 219 if __name__ == "__main__":
197 if len(sys.argv) == 2: 220 if len(sys.argv) == 2:
198 level = EditorLevel(sys.argv[1]) 221 level = EditorLevel(sys.argv[1])
202 else: 225 else:
203 print 'Please supply a levelname or levelname and level size' 226 print 'Please supply a levelname or levelname and level size'
204 sys.exit() 227 sys.exit()
205 pygame.display.init() 228 pygame.display.init()
206 pygame.font.init() 229 pygame.font.init()
207 pygame.display.set_mode(SCREEN, pgl.SWSURFACE) 230 pygame.display.set_mode((SCREEN[0] + MENU_WIDTH, SCREEN[1]),
231 pgl.SWSURFACE)
208 pygame.display.set_caption('Nagslang Area Editor') 232 pygame.display.set_caption('Nagslang Area Editor')
209 editor = Editor(level, pygame.display.get_surface()) 233 pygame.key.set_repeat(200, 100)
210 editor.run() 234 app = EditorApp(level, pygame.display.get_surface())
235 app.run()