Mercurial > nagslang
changeset 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 | b90d01e4d9d4 |
children | 817d4a62135c |
files | tools/area_editor.py tools/resources/fonts/Vera.ttf tools/resources/fonts/VeraBd.ttf |
diffstat | 3 files changed, 102 insertions(+), 77 deletions(-) [+] |
line wrap: on
line diff
--- a/tools/area_editor.py Mon Sep 02 14:01:55 2013 +0200 +++ b/tools/area_editor.py Mon Sep 02 13:59:11 2013 +0200 @@ -17,12 +17,22 @@ import pygame import pygame.locals as pgl +from albow.root import RootWidget +from albow.widget import Widget +from albow.controls import Button, Image +from albow.resource import get_font + sys.path.append(os.path.join(os.path.dirname(__file__), '..')) from nagslang.constants import SCREEN, FPS from nagslang.level import Level, POLY_COLORS +# layout constants +MENU_WIDTH = 200 +MENU_BUTTON_HEIGHT = 35 + + class EditorLevel(Level): def __init__(self, name, x=800, y=600): @@ -94,18 +104,24 @@ surface_area = pygame.rect.Rect(topleft, SCREEN) surface.blit(self._surface, (0, 0), surface_area) +class LevelWidget(Widget): -class Editor(object): - - def __init__(self, level, surface): + def __init__(self, level): + super(LevelWidget, self).__init__(pygame.rect.Rect(0, 0, + SCREEN[0], SCREEN[1])) self.level = level - self.surface = surface self.pos = (0, 0) - self.cur_poly = None + self.filled_mode = False self.mouse_pos = None - self.filled_mode = False + self.cur_poly = None - def move_view(self, offset): + def _level_coordinates(self, pos): + # Move positions to level values + if not pos: + return (0, 0) + return pos[0] + self.pos[0], pos[1] + self.pos[1] + + def _move_view(self, offset): new_pos = [self.pos[0] + offset[0], self.pos[1] + offset[1]] if new_pos[0] < 0: new_pos[0] = self.pos[0] @@ -117,80 +133,87 @@ new_pos[1] = self.pos[1] self.pos = tuple(new_pos) - def draw(self): + + def draw(self, surface): if (self.cur_poly is not None and self.cur_poly in self.level.polygons and len(self.level.polygons[self.cur_poly])): # We have an active polygon mouse_pos = self._level_coordinates(self.mouse_pos) else: mouse_pos = None - self.level.draw(self.surface, self.pos, mouse_pos, - self.cur_poly, self.filled_mode) - - def _level_coordinates(self, pos): - # Move positions to level values - if not pos: - return (0, 0) - return pos[0] + self.pos[0], pos[1] + self.pos[1] + level.draw(surface, self.pos, self.mouse_pos, self.cur_poly, + self.filled_mode) - def run(self): - pygame.key.set_repeat(100, 50) - running = True - clock = pygame.time.Clock() - while running: - for ev in pygame.event.get(): - if ev.type == pgl.QUIT: - running = False - elif ev.type == pgl.KEYDOWN: - if ev.key == pgl.K_ESCAPE: - running = False - elif ev.key == pgl.K_LEFT: - self.move_view((-10, 0)) - elif ev.key == pgl.K_RIGHT: - self.move_view((10, 0)) - elif ev.key == pgl.K_UP: - self.move_view((0, -10)) - elif ev.key == pgl.K_DOWN: - self.move_view((0, 10)) - if ev.key == pgl.K_1: - self.cur_poly = 1 - self.filled_mode = False - if ev.key == pgl.K_2: - self.cur_poly = 2 - self.filled_mode = False - if ev.key == pgl.K_3: - self.cur_poly = 3 - self.filled_mode = False - if ev.key == pgl.K_4: - self.cur_poly = 4 - self.filled_mode = False - if ev.key == pgl.K_5: - self.cur_poly = 5 - self.filled_mode = False - if ev.key == pgl.K_6: - self.cur_poly = 6 - self.filled_mode = False - if ev.key == pgl.K_0: - self.cur_poly = None - if ev.key == pgl.K_d and self.cur_poly: - self.level.delete_point(self.cur_poly) - if ev.key == pgl.K_s: - level.save() - if ev.key == pgl.K_f: - if level.all_closed(): - self.cur_poly = None - self.filled_mode = True - else: - print 'Not all polygons closed, so not filling' - elif ev.type == pgl.MOUSEBUTTONDOWN and self.cur_poly: - # Add a point - self.level.add_point(self.cur_poly, - self._level_coordinates(ev.pos)) - elif ev.type == pgl.MOUSEMOTION: - self.mouse_pos = ev.pos - self.draw() - pygame.display.flip() - clock.tick(FPS) + def key_down(self, ev): + if ev.key == pgl.K_LEFT: + self._move_view((-10, 0)) + elif ev.key == pgl.K_RIGHT: + self._move_view((10, 0)) + elif ev.key == pgl.K_UP: + self._move_view((0, -10)) + elif ev.key == pgl.K_DOWN: + self._move_view((0, 10)) + elif ev.key == pgl.K_1: + self.cur_poly = 1 + self.filled_mode = False + elif ev.key == pgl.K_2: + self.cur_poly = 2 + self.filled_mode = False + elif ev.key == pgl.K_3: + self.cur_poly = 3 + self.filled_mode = False + elif ev.key == pgl.K_4: + self.cur_poly = 4 + self.filled_mode = False + elif ev.key == pgl.K_5: + self.cur_poly = 5 + self.filled_mode = False + elif ev.key == pgl.K_6: + self.cur_poly = 6 + self.filled_mode = False + elif ev.key == pgl.K_0: + self.cur_poly = None + elif ev.key == pgl.K_d and self.cur_poly: + self.level.delete_point(self.cur_poly) + elif ev.key == pgl.K_s: + level.save() + elif ev.key == pgl.K_f: + if level.all_closed(): + self.cur_poly = None + self.filled_mode = True + else: + print 'Not all polygons closed, so not filling' + + + +class EditorApp(RootWidget): + + def __init__(self, level, surface): + super(EditorApp, self).__init__(surface) + self.level = level + self.level_widget = LevelWidget(self.level) + self.add(self.level_widget) + + quit_but = Button('Quit', action=self.quit) + quit_but.rect = pygame.rect.Rect(0, 0, MENU_WIDTH, MENU_BUTTON_HEIGHT) + quit_but.rect.move_ip(SCREEN[0], 25) + self.add(quit_but) + + # elif ev.type == pgl.MOUSEBUTTONDOWN and self.cur_poly: + # # Add a point + # self.level.add_point(self.cur_poly, + # self._level_coordinates(ev.pos)) + # elif ev.type == pgl.MOUSEMOTION: + # self.mouse_pos = ev.pos + # self.draw() + # pygame.display.flip() + # clock.tick(FPS) + + def key_down(self, ev): + if ev.key == pgl.K_ESCAPE: + self.quit() + else: + self.level_widget.key_down(ev) if __name__ == "__main__": @@ -204,7 +227,9 @@ sys.exit() pygame.display.init() pygame.font.init() - pygame.display.set_mode(SCREEN, pgl.SWSURFACE) + pygame.display.set_mode((SCREEN[0] + MENU_WIDTH, SCREEN[1]), + pgl.SWSURFACE) pygame.display.set_caption('Nagslang Area Editor') - editor = Editor(level, pygame.display.get_surface()) - editor.run() + pygame.key.set_repeat(200, 100) + app = EditorApp(level, pygame.display.get_surface()) + app.run()