2

现在我有一个 x x y 数组来保存整数,这些整数决定将哪个图块绘制到屏幕上。(整数选择在我tile_arr的哪个瓷砖blit)

为了获得更好的性能,我只希望改变的 int 再次被 blit'ed。

示例 1:

例如现在我有类似的东西:

tile_arr = [image1,image2,image3,image4]
arr = [[2,2,2],[2,2,2],[2,2,2]]

然后根据用户的操作,某些值arr可能会发生变化,所以可以说:

arr[0][0]=1
arr[2][1]=1

这会给我们数组:

arr=[[1,2,2],[2,2,2],[2,1,2]]

现在当blitting到屏幕时,我会从tile_arr:图像编号1,2,2到顶行,2,2,2到中间行,2,1,2到底行。当我对数组进行 blit 时,我screen.blit对每个值或 arr 使用 a,即 9 个 blit。我宁愿只做两次。(screen.blit只使用两次)

示例 2:

tile_arr = [green.bmp, red.bemp, blue.bmp]
feild_arr = [[0,0,0], [0,0,0], [0,0,0]]

输出:

GGG

GGG

GGG

用户更改feild_arr[[1,0,1], [0,2,0], [0,1,2]]

输出:

RGR

国标

GRB

现在我只想调用sceen.blit()5 次,将 4 个 Green squares 保留为绿色,因为没有任何改变。

我想制作另一个数组,它只是第一个数组的副本。然后运行它并与新数组进行比较以查看发生了什么变化,但我认为有更好更快的方法。现在这个例子只有 3x3,所以制作一个重复的数组并不算太糟糕,但是我正在使用更大的数组,当你对一个 30x20 数组进行 blitting 时,我需要我能得到的所有快捷方式。

如何仅在数组中的整数值已更改时进行 blit,并跳过(不 blit)未更改的值?

4

1 回答 1

1

您只能使用一次 screen.blit,调用已更改的矩形列表。

我认为最好的方法是创建你自己的从 DirtySprite 派生的类:

class Cell: pygame.sprite.DirtySprite

它已经具有用于保存图像和矩形的属性,您可以添加一个属性来保存数字和一个更改数字的方法,将其设置为脏。

然后你可以使用LayeredDirty类在屏幕上渲染脏精灵。

于 2012-06-04T20:44:57.237 回答