Compare commits
No commits in common. "main" and "390ba86c640af75437ea3e4dd0ed5b3652cc9166" have entirely different histories.
main
...
390ba86c64
17
Math.py
17
Math.py
|
|
@ -1,17 +0,0 @@
|
||||||
import numpy as np
|
|
||||||
import Types as t
|
|
||||||
|
|
||||||
MAT_ISO = np.array([[0.5, 0.25], [-0.5, 0.25]])
|
|
||||||
MAT_CART = np.linalg.inv(MAT_ISO)
|
|
||||||
|
|
||||||
|
|
||||||
def from_iso(
|
|
||||||
uv: t.IsoCoord, scale: float = 1, origin: t.CartCoors = np.array([0, 0])
|
|
||||||
) -> t.CartCoors:
|
|
||||||
return (uv @ MAT_ISO) * scale + origin
|
|
||||||
|
|
||||||
|
|
||||||
def from_cart(
|
|
||||||
xy: t.CartCoors, scale: float = 1, origin: t.CartCoors = np.array([0, 0])
|
|
||||||
) -> t.IsoCoord:
|
|
||||||
return (((xy - origin) / scale) @ MAT_CART + np.array([0.5, 0.5])).astype(np.int32)
|
|
||||||
13
README.md
13
README.md
|
|
@ -1,13 +0,0 @@
|
||||||
# DnDMap
|
|
||||||
|
|
||||||
a isometric tile map editor, intended to be used as D&D maps
|
|
||||||
|
|
||||||
## ToDo
|
|
||||||
- include export feature (mayne PNG?)
|
|
||||||
- create new tiles
|
|
||||||
- visuals
|
|
||||||
- classes
|
|
||||||
- create tile mapping gui
|
|
||||||
- insert tile on keymap
|
|
||||||
|
|
||||||
- fix cartesian to iso and back conversion not working with cursor
|
|
||||||
44
Tiles.py
44
Tiles.py
|
|
@ -1,23 +1,16 @@
|
||||||
import pygame
|
import pygame
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import Math
|
|
||||||
import Types
|
|
||||||
|
|
||||||
# MAT_CART = 1 / (0.5 * 0.25 + 0.5 * 0.25) * np.array([[0.25, -0.25], [0.5, 0.5]])
|
tile_size = 64
|
||||||
|
MAT_ISO = np.array([[0.5, 0.25], [-0.5, 0.25]])
|
||||||
|
|
||||||
|
|
||||||
class MapTile(pygame.sprite.Sprite):
|
class MapTile(pygame.sprite.Sprite):
|
||||||
size = 64
|
|
||||||
image = pygame.image.load("tileset/placeholder.png")
|
|
||||||
|
|
||||||
def __init__(self, x: int, y: int):
|
def __init__(self, x: int, y: int):
|
||||||
super(MapTile, self).__init__()
|
super(MapTile, self).__init__()
|
||||||
self.image = MapTile.image
|
self.image = pygame.image.load("tileset/placeholder.png")
|
||||||
# self.rect = self.image.get_rect()
|
self.rect = self.image.get_rect()
|
||||||
self.rect = pygame.Rect(
|
self.rect.center = (x, y)
|
||||||
x - MapTile.size / 2, y - MapTile.size / 2, MapTile.size, MapTile.size
|
|
||||||
)
|
|
||||||
# self.rect.center = (x, y)
|
|
||||||
|
|
||||||
|
|
||||||
class IsoMapTile(MapTile):
|
class IsoMapTile(MapTile):
|
||||||
|
|
@ -26,34 +19,13 @@ class IsoMapTile(MapTile):
|
||||||
u: int,
|
u: int,
|
||||||
v: int,
|
v: int,
|
||||||
elevation: int = 0,
|
elevation: int = 0,
|
||||||
origin: np.ndarray = np.array([0, 0]),
|
origin: np.ndarray = np.array([100, 100]),
|
||||||
):
|
):
|
||||||
# vec = np.array([u, v]) @ MAT_ISO * tile_size + origin
|
vec = np.array([u, v]) @ MAT_ISO * tile_size + origin
|
||||||
vec = Math.from_iso(np.array([u, v], np.int32), MapTile.size, origin)
|
super(IsoMapTile, self).__init__(vec[0], vec[1] + tile_size / 8 * elevation)
|
||||||
super(IsoMapTile, self).__init__(vec[0], vec[1] + MapTile.size / 8 * elevation)
|
|
||||||
self.u = u
|
self.u = u
|
||||||
self.v = v
|
self.v = v
|
||||||
self.elevation = elevation
|
self.elevation = elevation
|
||||||
|
|
||||||
def update(self, dx: int, dy: int):
|
def update(self, dx: int, dy: int):
|
||||||
self.rect.move_ip(-dx, -dy)
|
self.rect.move_ip(-dx, -dy)
|
||||||
|
|
||||||
def move(self, uv: Types.IsoCoord, origin: Types.CartCoors):
|
|
||||||
vec = Math.from_iso(uv, MapTile.size, origin)
|
|
||||||
self.rect.center = (vec[0], vec[1] + MapTile.size / 8 * self.elevation)
|
|
||||||
|
|
||||||
|
|
||||||
class CursorTile(IsoMapTile):
|
|
||||||
image = pygame.image.load("tileset/cursor.png")
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
uv: Types.IsoCoord,
|
|
||||||
elevation: int = 0,
|
|
||||||
origin: Types.CartCoors = np.array([0, 0]),
|
|
||||||
):
|
|
||||||
super(CursorTile, self).__init__(
|
|
||||||
u=uv[0], v=uv[1], elevation=elevation, origin=origin
|
|
||||||
)
|
|
||||||
|
|
||||||
self.image = CursorTile.image
|
|
||||||
|
|
|
||||||
7
Types.py
7
Types.py
|
|
@ -1,7 +0,0 @@
|
||||||
import typing
|
|
||||||
import numpy as np
|
|
||||||
import numpy.typing as npt
|
|
||||||
|
|
||||||
|
|
||||||
IsoCoord = npt.NDArray[np.int32]
|
|
||||||
CartCoors = npt.NDArray
|
|
||||||
74
main.py
74
main.py
|
|
@ -1,14 +1,12 @@
|
||||||
import pygame
|
import pygame
|
||||||
import pygame_gui as pgg
|
import pygame_gui as pgg
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import Tiles, Math
|
import Tiles
|
||||||
import logging as log
|
import logging as log
|
||||||
|
|
||||||
screen_size = np.array([16 / 9 / 2, 1]) * 1440
|
screen_size = np.array([16 / 9 / 2, 1]) * 1440
|
||||||
|
|
||||||
origin = np.array([screen_size[0] / 2, Tiles.MapTile.size], np.int32)
|
origin = np.array([screen_size[0] / 2, Tiles.tile_size])
|
||||||
|
|
||||||
map_tiles_by_uv = {}
|
|
||||||
|
|
||||||
|
|
||||||
def load_map(map_file="map.npz"):
|
def load_map(map_file="map.npz"):
|
||||||
|
|
@ -23,7 +21,6 @@ def load_map(map_file="map.npz"):
|
||||||
for u, v, e, t in zip(us, vs, es, ts):
|
for u, v, e, t in zip(us, vs, es, ts):
|
||||||
tile = getattr(Tiles, t)(u, v, e, origin)
|
tile = getattr(Tiles, t)(u, v, e, origin)
|
||||||
map_tiles.add(tile)
|
map_tiles.add(tile)
|
||||||
map_tiles_by_uv[(int(u), int(v))] = tile
|
|
||||||
|
|
||||||
print(f"loaded {len(map_tiles)} tiles")
|
print(f"loaded {len(map_tiles)} tiles")
|
||||||
|
|
||||||
|
|
@ -45,7 +42,6 @@ def save_map(map_tiles: pygame.sprite.RenderPlain, map_file: str = "map.npz"):
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
global origin
|
|
||||||
pygame.init()
|
pygame.init()
|
||||||
# pygame.font.init()
|
# pygame.font.init()
|
||||||
# font = pygame.font.SysFont("Raleway", 12)
|
# font = pygame.font.SysFont("Raleway", 12)
|
||||||
|
|
@ -55,7 +51,6 @@ def main():
|
||||||
clock = pygame.time.Clock()
|
clock = pygame.time.Clock()
|
||||||
|
|
||||||
gui_manager = pgg.UIManager(screen_size)
|
gui_manager = pgg.UIManager(screen_size)
|
||||||
gui_manager.get_theme().load_theme("theme.json")
|
|
||||||
save_btn = pgg.elements.UIButton(
|
save_btn = pgg.elements.UIButton(
|
||||||
relative_rect=pygame.Rect((0, 0), (100, 20)),
|
relative_rect=pygame.Rect((0, 0), (100, 20)),
|
||||||
text="Save",
|
text="Save",
|
||||||
|
|
@ -66,41 +61,11 @@ def main():
|
||||||
text="Load",
|
text="Load",
|
||||||
manager=gui_manager,
|
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()
|
# 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_text = font.render("test", True, (0, 0, 0))
|
||||||
map_tiles = pygame.sprite.RenderPlain()
|
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 xix in range(10):
|
||||||
# for yix in range(10):
|
# for yix in range(10):
|
||||||
# tile = Tiles.IsoMapTile(xix, yix, 0, origin)
|
# tile = Tiles.IsoMapTile(xix, yix, 0, origin)
|
||||||
|
|
@ -109,35 +74,16 @@ def main():
|
||||||
gameit = 0
|
gameit = 0
|
||||||
is_running = True
|
is_running = True
|
||||||
while is_running:
|
while is_running:
|
||||||
|
time_delta = clock.tick(60) / 1000
|
||||||
|
|
||||||
time_delta = clock.tick(30) / 1000
|
|
||||||
perf_label.set_text(f"{1/time_delta:.0f}fps")
|
|
||||||
# events
|
# events
|
||||||
|
# mouse_x, mouse_y = pygame.mouse.get_pos()
|
||||||
|
|
||||||
## mouse
|
# if pygame.mouse.get_pressed()[1]:
|
||||||
mouse_x, mouse_y = pygame.mouse.get_pos()
|
# map_tiles.update(mouse_prev_x - mouse_x, mouse_prev_y - mouse_y)
|
||||||
|
|
||||||
if pygame.mouse.get_pressed()[1]:
|
# mouse_prev_x = mouse_x
|
||||||
map_tiles.update(mouse_prev_x - mouse_x, mouse_prev_y - mouse_y)
|
# 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():
|
for evt in pygame.event.get():
|
||||||
if evt.type == pygame.QUIT:
|
if evt.type == pygame.QUIT:
|
||||||
is_running = False
|
is_running = False
|
||||||
|
|
@ -157,7 +103,7 @@ def main():
|
||||||
# Drawing
|
# Drawing
|
||||||
screen.blit(bg, (0, 0))
|
screen.blit(bg, (0, 0))
|
||||||
map_tiles.draw(screen)
|
map_tiles.draw(screen)
|
||||||
overlay_tiles.draw(screen)
|
|
||||||
gui_manager.draw_ui(screen)
|
gui_manager.draw_ui(screen)
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|
||||||
|
|
|
||||||
20
theme.json
20
theme.json
|
|
@ -1,20 +0,0 @@
|
||||||
{
|
|
||||||
"label": {
|
|
||||||
"colours": {
|
|
||||||
"dark_bg": "#25292e",
|
|
||||||
"normal_text": "#c5cbd8",
|
|
||||||
"text_shadow": "#505050"
|
|
||||||
},
|
|
||||||
"font": {
|
|
||||||
"name": "montserrat",
|
|
||||||
"size": "12",
|
|
||||||
"bold": "0",
|
|
||||||
"italic": "0"
|
|
||||||
},
|
|
||||||
"misc": {
|
|
||||||
"text_shadow": "1",
|
|
||||||
"text_shadow_size": "1",
|
|
||||||
"text_shadow_offset": "0,0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 344 B |
Loading…
Reference in New Issue