5000x5000用于Python的图像网格Tkinter帆布

问题描述:

我正在制作动作冒险沙盒视频游戏。这与“Terraria”游戏非常相似。因此它涉及放置和销毁块。现在,要消灭块,基本上它只是添加一个与您点击的天空颜色相同的矩形。但是,我不想那样。我不想要它,所以你可以在地面上随意摧毁图块。我决定将游戏中的世界改变为一张瓷砖网格,即PhotoImages。我遇到了很多麻烦。 这里是代码,我重点关注:5000x5000用于Python的图像网格Tkinter帆布

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) 

而且我甚至不知道在哪里,甚至开始在格列!请帮忙吗?

+0

tkinter是一种图形用户界面技术,你将很难用它制作图形重型游戏。如何使用特定的游戏,如pygame或(sic)gamemaker工作室? – Kos

+0

我不想这样做,因为这个游戏开始发展时,我认为tkinter是游戏的意思。不幸的是,它不是。但是如果我决定改变和使用这些,我将不得不重做所有东西(而且这很重要)。 – TyTy

+1

重做的好处在于,第二次使用它们时,事情总是会更好...... – Kos

您应该将您的世界存储在易于参考的结构中。一个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] 
+0

好吧,但是当我做“世界= np.zeros((5000,5000))”它说“模块”numpy“没有属性”零“”请再次帮助? XD – TyTy

+0

您使用什么代码?你进口numpy吗?你能链接到它在github上或pastebin什么的? – RagingRoosevelt

+0

我输入了numpy,是的。我试着用你说的代码来看看它是如何工作的。 – TyTy