hammythepig
hammythepig

Reputation: 957

Pygame blitting only updated surfaces

Right now I have an x by y array to hold integers that decide which tile to draw to the screen. (The integers choose which tile in my tile_arr to blit)

For better performance, I only want the ints that changed to be blit'ed again.

EXAMPLE 1:

For example right now I have something like:

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

Then depending on what the user does, some values in arr might change, so lets say:

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

Which would give us the array:

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

now when blitting to the screen, I would blit images from the tile_arr: image numbers 1,2,2 to the top row, 2,2,2, to the middle row, and 2,1,2 to the bottom row. When I blit the array, I use a screen.blit for each value or arr, that's nine blits. I would rather only do two blits. (Use screen.blit only twice)

EXAMPLE 2:

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

Output:

G G G

G G G

G G G

User changes feild_arr to [[1,0,1], [0,2,0], [0,1,2]]

Output:

R G R

G B G

G R B

Now I only want to call sceen.blit() 5 times, leaving the 4 Green sqaures green, because nothing changed.

I thought of making another array, which would be just a copy of the first. Then run through it and compare to the new array to see what changed, but I think there is a better and faster way to this. Now the example is only 3x3 so making a duplicate array isn't too bad, but I'm working with a lot bigger arrays, and when you're blitting a 30x20 array, I need all the shortcuts I can get.

How do I only blit when the interger values in an array have been changed, and skip (don't blit) the values that have not changed?

Upvotes: 2

Views: 515

Answers (1)

pmoleri
pmoleri

Reputation: 4451

You can use screen.blit only once, calling with a list of the rectangles that changed.

I think the best aproach is to create you own class deriving from DirtySprite:

class Cell: pygame.sprite.DirtySprite

which already has attributes for holding an image and a rectangle and you can add an attributes to hold the number and a method to change de number that will set it as dirty.

Then you can use LayeredDirty class to render the dirty sprites on the screen.

Upvotes: 1

Related Questions