Is there a way to pass the special_flags argument to Group.draw so that it calls the .blit method with those flags?
I've tried just passing it as a keyword argument like this:
group.draw(surface, special_flags=pygame.BLEND_SOURCE_ALPHA)
but it gives this error:
Traceback (most recent call last):
File "C:\Users\MarciAdam\PycharmProjects\pygame_stuff_1\main.py", line 394, in <module>
group.draw(surface, special_flags=pygame.BLEND_RGBA_MAX)
TypeError: draw() got an unexpected keyword argument 'special_flags'
I know I could do something like this:
for sprite in group.sprites():
surface.blit(sprite.image, sprite.rect, special_flags=pygame.BLEND_SOURCE_ALPHA)
but I would need to duplicate a lot of the pygame code for the more complicated group types eg. LayeredUpdates.
The requested feature is implemented with Pygame version 2.3.0. See pygame.sprite.Group.draw. With this version, the code works and you can set the blending mode directly
group.draw(surface, special_flags=pygame.BLEND_SOURCE_ALPHA)
Before Pygame 2.3.0, this optional parameter did not exist. If you are using an older version of Pygame, you must implement a workaround.
Draw the sprite with a "for" loop. I suggest to write a function for this or implement your own MyGroup class derived from pygame.sprite.Group:
class MyGroup(pygame.sprite.Group):
def __init__(self, *args):
super().__init__(*args)
def draw(self, surface, special_flags=0):
for sprite in self:
surface.blit(sprite.image, sprite.rect, special_flags = special_flags)
group = MyGroup()
group.draw(surface, special_flags=pygame.BLEND_RGBA_MAX)
If you want to do the same for pygame.sprite.LayeredUpdates or pygame.sprite.RenderUpdates, you have to implement all the drawing features of these objects yourself.
A completely different solution is to use pygame.sprite.DirtySprite. This class is derived from pygame.sprite.Sprite and has an additional blendmode attribute which is its the special_flags argument of blit.
class MySprite(pygame.sprite.DirtySprite):
def __init__(self):
super().__init__()
self.dirty = 2
self.blendmode = pygame.BLEND_RGBA_MIN
# [...]
Note, DirtySprite only works with pygame.sprite.LayeredDirty and all sprites in the group must be of this type.