Pygame的块传输只更新表面(Pygame blitting only updated surfa

2019-09-17 16:47发布

现在我有Y阵列的X来保存决定绘制到屏幕,瓷砖整数。 (该整数选择哪个瓦片在我tile_arr做块)

为了更好的表现,我只想要改变的整数再次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]]

现在位图传输到屏幕上的时候,我会从图像的blit tile_arr :图像编号1,2,2的顶行,2,2,2,到中间行,2,1,2到底行。 当我的blit数组,我使用screen.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

GBG

GRB

现在,我只想叫sceen.blit()的5倍,留下4个绿色sqaures绿色的,因为什么都没有改变。

我想制作另一个数组,这将只是一个第一的副本。 然后穿过它,并比较新的阵列,看看有什么变化,但我认为这是一个更好更快的方式来这一点。 现在的例子只是3×3这样做重复的阵列是不是太糟糕,但我有很多大的阵列的工作,当你blit一个30x20阵列,我需要所有的快捷方式,我可以得到。

如何我只当位块传输阵列中的整数值已发生改变,并跳过(不要的blit)没有改变的值是多少?

Answer 1:

您可以使用screen.blit只有一次,改变了矩形列表调用。

我认为最好的形式给出是从DirtySprite创建您自己的类派生:

class Cell: pygame.sprite.DirtySprite

这已经为保持图像和矩形,你可以添加一个属性来保存的数量和改变去数,将其设置为脏的方法属性。

然后你可以使用LayeredDirty类呈现在屏幕上的脏精灵。



文章来源: Pygame blitting only updated surfaces