DnDMap/main.py

172 lines
4.6 KiB
Python
Executable File

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()