import pygame import pygame_gui as pgg import numpy as np import Tiles, Math import logging as log screen_size = np.array([16 / 9 / 2, 1]) * 1440 origin = np.array([screen_size[0] / 2, Tiles.MapTile.size], np.int32) map_tiles_by_uv = {} def load_map(map_file="map.npz"): print("started loading tiles") data = np.load(map_file) us = data["us"] vs = data["vs"] es = data["es"] ts = data["ts"] map_tiles = pygame.sprite.RenderPlain() for u, v, e, t in zip(us, vs, es, ts): tile = getattr(Tiles, t)(u, v, e, origin) map_tiles.add(tile) map_tiles_by_uv[(int(u), int(v))] = tile print(f"loaded {len(map_tiles)} tiles") return map_tiles def save_map(map_tiles: pygame.sprite.RenderPlain, map_file: str = "map.npz"): us = np.array([]) vs = np.array([]) es = np.array([]) ts = np.array([]) for tile in map_tiles.sprites(): us = np.append(us, tile.u) vs = np.append(vs, tile.v) es = np.append(es, tile.elevation) ts = np.append(ts, tile.__class__.__name__) np.savez(file=map_file, us=us, vs=vs, es=es, ts=ts) def main(): global origin pygame.init() # pygame.font.init() # font = pygame.font.SysFont("Raleway", 12) screen = pygame.display.set_mode(screen_size) bg = pygame.Surface(screen_size) bg.fill(pygame.Color("#cccccc")) clock = pygame.time.Clock() gui_manager = pgg.UIManager(screen_size) gui_manager.get_theme().load_theme("theme.json") save_btn = pgg.elements.UIButton( relative_rect=pygame.Rect((0, 0), (100, 20)), text="Save", manager=gui_manager, ) load_btn = pgg.elements.UIButton( relative_rect=pygame.Rect((0, 20), (100, 20)), text="Load", manager=gui_manager, ) bl_corner = pygame.Rect((0, 0), (150, 20)) bl_corner.bottomleft = (0, 0) location_label = pgg.elements.UILabel( relative_rect=bl_corner, text="", manager=gui_manager, anchors={ "left": "left", "right": "left", "top": "bottom", "bottom": "bottom", }, ) br_corner = pygame.Rect((0, 0), (50, 20)) br_corner.bottomright = (0, 0) perf_label = pgg.elements.UILabel( relative_rect=br_corner, text="", manager=gui_manager, anchors={ "left": "right", "right": "right", "top": "bottom", "bottom": "bottom", }, ) mouse_prev_x, mouse_prev_y = pygame.mouse.get_pos() uv_prev = np.array([0, 0], np.int32) # map_text = font.render("test", True, (0, 0, 0)) map_tiles = pygame.sprite.RenderPlain() overlay_tiles = pygame.sprite.RenderPlain() overlay_tile = Tiles.CursorTile(np.array([0, 0])) overlay_tiles.add(overlay_tile) # for xix in range(10): # for yix in range(10): # tile = Tiles.IsoMapTile(xix, yix, 0, origin) # map_tiles.add(tile) gameit = 0 is_running = True while is_running: time_delta = clock.tick(30) / 1000 perf_label.set_text(f"{1/time_delta:.0f}fps") # events ## mouse mouse_x, mouse_y = pygame.mouse.get_pos() if pygame.mouse.get_pressed()[1]: map_tiles.update(mouse_prev_x - mouse_x, mouse_prev_y - mouse_y) origin = ( origin[0] - mouse_prev_x + mouse_x, origin[1] - mouse_prev_y + mouse_y, ) uv: IsoCoord = Math.from_cart( np.array([mouse_x, mouse_y]), Tiles.MapTile.size, origin ) location_label.set_text(f"{uv[0]}x{uv[1]} / {mouse_x:.0f}x{mouse_y:.0f}") if np.all(uv_prev != uv): overlay_tile.move(uv, origin) uv_prev = uv mouse_prev_x = mouse_x mouse_prev_y = mouse_y ## keys for evt in pygame.event.get(): if evt.type == pygame.QUIT: is_running = False if evt.type == pygame.KEYDOWN: if evt.key == pygame.K_ESCAPE: is_running = False if evt.type == pgg.UI_BUTTON_PRESSED: if evt.ui_element == save_btn: save_map(map_tiles) if evt.ui_element == load_btn: map_tiles = load_map() gui_manager.process_events(evt) gui_manager.update(time_delta) # Drawing screen.blit(bg, (0, 0)) map_tiles.draw(screen) overlay_tiles.draw(screen) gui_manager.draw_ui(screen) pygame.display.flip() gameit += 1 pygame.quit() if __name__ == "__main__": main()