Python Tkinter Canvas

时间:2017-09-05 16:27:19

标签: python tkinter tkinter-canvas

我正在制作动作冒险沙盒视频游戏。它与游戏" Terraria"非常相似。因此,它涉及放置和销毁块。现在,要销毁块,基本上它只是添加一个与您单击的天空颜色相同的矩形。但是,我不想要那个。我不想要它,所以你可以通过破坏块自由地在地面上绘制图像。我决定将游戏世界改为瓷砖网格,即PhotoImages。我遇到了很多麻烦。 这是我关注的代码:

DirtImage = PhotoImage(file = '/home/tyty0427/Downloads/New Piskel(61).png')
GrassImage = PhotoImage(file = '/home/tyty0427/Downloads/New Piskel(62).png')
TilePlacement = (10, 5000)
for row in range(5000):
    c.create_image(TilePlacement, image=DirtImage, tags='Tile')
    TilePlacement += (20, 0)

我甚至不知道哪里甚至开始为网格中的列!有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

您应该将您的世界存储在易于参考的结构中。 numpy数组可能很方便。这也可以作为一个坐标系统使用,因为你可以将玩家坐标的浮点数映射到整数,以确定它们在哪个区块上。

你可以在numpy数组中使用整数值,然后这些整数可以映射到tile。这样,与图块交互时的行为将基于存储在数组中的值。像

这样的东西
tile_names = {0: 'empty', 1: 'dirt', 2: 'grass'}
tile_sprites = {0: PhotoImage(file = '/path/to/sky'),
                1: PhotoImage(file = '/home/tyty0427/Downloads/New Piskel(61).png'), 
                2: PhotoImage(file = '/home/tyty0427/Downloads/New Piskel(62).png')}
world = np.zeros((5000,5000))

您可以使用numpy数组的切片将视口限制为世界的一小部分(例如,如果您的窗口是500x100图块):

x_offset = 4000
y_offset = 50
for x in range(100):
    for y in range(500):
        sprite = tile_sprites[world[y_offset:y_offset+y, x_offset:x_offset+x]]
        c.create_image((20*y, 20*x), image=tile_sprites[val], tags='Tile')

如果你想抓住世界的一部分,你可以做

world[y_0:y_0+h, x_0:x_0+w]