【问题标题】:There's a good method to create a tilemap from an ascii matrix?有从 ascii 矩阵创建 tilemap 的好方法吗?
【发布时间】:2022-08-22 22:26:40
【问题描述】:

这个想法很简单,但执行让我很困扰。 我创建了一个小的随机地牢生成器,它创建了一个像这样的网格:

000001
000111
000111
001101
011101
011111

这是一个示例 6x6 地牢,其中 0 是墙壁,1 是开放路径。

将其转换为某种 tile id map 很简单,而且微不足道,但创建图像本身是困难的部分。

我想知道是否有一个库或方法来实现它。如果没有,那你会怎么做?

这不是游戏的一部分,而只是 DND 的地牢生成器。任何语言都可以,但生成器是用 Go 制作的。

  • 请说清楚。为什么这对你来说是一个挑战?问题到底出在哪里?请查看How to Askminimal reproducible example。展示你的尝试。 “工作证明”。
  • @ChristophRackwitz 这更像是一个概念问题。我在询问一种众所周知的方法来创建使用矩阵作为源的平铺图像。我的问题是我不知道有多少库可以处理图像,但我认为这对我来说有一些库,我想知道这是否属实。
  • 根据规则,征求建议是题外话。请查看How to Askhelp center。通常,当问题表明研究工作时,人们会放任自流。

标签: image-processing


【解决方案1】:

您可以使用 OpenCV 来完成此任务。可能 PIL 可以做同样的事情,没有 exp 。

import cv2
import numpy as np

data_list = [
    [0, 0, 0, 0, 0, 1],
    [0, 0, 0, 1, 1, 1],
    [0, 0, 0, 1, 1, 1],
    [0, 0, 1, 1, 0, 1],
    [0, 1, 1, 1, 0, 1],
    [0, 1, 1, 1, 1, 1]
]

arr = np.array(data_list, dtype=np.uint8) * 255
arr = cv2.resize(arr, (0, 0), fx=50, fy=50, interpolation=cv2.INTER_NEAREST)
cv2.imshow("img", arr)
cv2.waitKey()

# or you can save on disk
cv2.imwrite("img.png", arr)

【讨论】:

  • 那只是调整大小...不是完全处理瓷砖。
【解决方案2】:

利用np.block()

# a bunch of sprites/images, all the same size
# load them however you like
tiles = [...]

data_list = [
    [0, 0, 0, 0, 0, 1],
    [0, 0, 0, 1, 1, 1],
    [0, 0, 0, 1, 1, 1],
    [0, 0, 1, 1, 0, 1],
    [0, 1, 1, 1, 0, 1],
    [0, 1, 1, 1, 1, 1]
]

picture = np.block([
    [tiles[k] for k in row]
    for row in data_list
])

或者,如果您使用任何一种游戏引擎,或者更简单的东西,比如 SDL/PyGame,简单地“blit”每个瓷砖.

如您所见,PIL 完全有能力位图一个图像(平铺)到另一个(整个地图)。

【讨论】:

    【解决方案3】:

    我设法找到了一个解决方案,但它只是一个 Python。 使用 PIL,我可以用平铺图像制作马赛克并创建地图。这不是从头开始制作的可靠解决方案,但它可以完成工作。

    我仍然愿意接受另一种方法。 我的解决方案是这里的这种方法:

        matrix = np.loadtxt(input_file, usecols=range(matrix_square), dtype=int)
    
    tiles = []
    
    for file in glob.glob("./tiles/*"):
        im = Image.open(file)
        tiles.append(im)
    
    output = Image.new('RGB', (image_width,image_height))
    
    for i in range(matrix_width):
        for j in range(matrix_height):
            x,y = i*tile_size,j*tile_size
            index = matrix[j][i]
            output.paste(tiles[index],(x,y))
    
    output.save(output_file)
    

    matrix_square 是矩阵维度(作为正方形)。我仍在研究更好的解决方案,但这对我来说很好。 您需要更改 tile_size 以匹配您正在使用的图块分辨率。

    This is a generated dungeon with this method

    瓷砖不好,但网格足够好。

    【讨论】:

    • 随意将您的解决方案放在您的答案中,它可能会帮助遇到同样问题的其他人:)
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多