Pygame blitting只更新了表面

时间:2012-06-01 20:01:05

标签: python-3.x pygame

现在我有一个x by y数组来保存整数,用于决定在屏幕上绘制哪个图块。 (整数选择我tile_arr中的哪个图块进行blit)

为了获得更好的性能,我只想让改变的整数再次被搞砸。

示例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时,我对每个值或arr使用screen.blit,即9个blits。我宁愿只做两个blits。 (仅使用screen.blit两次)

示例2:

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

输出:

  

G G G

     

G G G

     

G G G

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

输出:

  

R G R

     

G B G

     

G R B

现在我只想打电话给sceen.blit() 5次,让4绿色方块保持绿色,因为没有任何改变。

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

如何更改数组中的整数值时只显示blit,并跳过(不要blit)未更改的值?

1 个答案:

答案 0 :(得分:1)

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

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

class Cell: pygame.sprite.DirtySprite

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

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