[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] BUG: segfault when blitting surface to itself



Is there some case where blitting a surface on itself might be desired
or necessary? If not, I'll add a simple check that tests the passed
surface on equality and let blit() throw an exception, if both are the
same.

Regards
Marcus

For scrolling (topdown RPG, in my case), I use a surface just larger than the screen to hold all my unmoving objects, tiles, trees, chests, etc, and keep a Rect for where to put that surface onto the screen.  Whenever I move a tiles worth in any direction (lets say i move 32 pixels to the right), I need to blit the rect <32, 0, width, height> to <0, 0, width, height> and add the rightmost-visible tiles to it.  My first idea was to blit the surface onto itself, but of course that blew up on me.

My fix was to use two surfaces and just blit from one onto the other, switching between the two every time I need to add another row/column onto the screen.  It's not really memory inefficient (I only keep one extra 672x512 surface and a pointer in memory), but it definitely wasn't straightforward, and took me a while longer than I expected to implement it. Blitting a surface onto itself would have been much simpler.