I'm attempting to create a method to essentially erase a drawing on a surface. I have the functionality working for an surface that contains a png, but when I use the same method to remove a surface that is drawn on by pygame.draw.lines() it is not erasing.
The major difference between the two surfaces is one is transparent and other is not. I think I may not understand fully how pygames transparent surfaces work.
Not working undraw():
class MovementComponent(AbstactComponent):
def __init__(self) -> None:
super().__init__()
game_surfaces = GameSurfaces() #singleton class that rerenders all of the surfaces in order
self.movement_surface = game_surfaces.movement_surface
self.path_surface = pg.Surface(self.movement_surface.get_size(), pg.SRCALPHA)
self.path_surface.set_alpha(150)
def draw_movement(self):
if len(self.queue()) >= 2:
tile_centers = []
for tile in self.queue():
tile_centers.append(tile.center_pixel)
pg.draw.lines(
self.path_surface,
self.character.color,
False, tile_centers, 3
)
self.movement_surface.blit(self.path_surface, (0,0))
def undraw_movement(self):
empty = pg.Color(0,0,0,0)
self.path_surface.fill(empty)
self.movement_surface.blit(self.path_surface, (0,0))
The working undraw in another component:
class SpriteComponent(AbstactComponent):
NORMAL_SIZE = (55,55)
def __init__(self, image: pg.image):
surfaces = GameSurfaces()
self.char_surface = surfaces.character_surface
self.pixel_pos: (int,int) = None
self.standard_image = pg.transform.scale(image, self.NORMAL_SIZE)
self.empty = pg.Color(0,0,0,0)
def draw(self, pixel_pos: (int, int)):
self.pixel_pos = pixel_pos
top_left_pixel = self.get_topleft_pos(pixel_pos)
self.char_surface.blit(self.standard_image, top_left_pixel)
def undraw(self, pixel_pos: (int, int)=None):
pixel_pos = pixel_pos if pixel_pos else self.pixel_pos
top_left_pixel = self.get_topleft_pos(self.pixel_pos)
rect_to_clear = pg.Rect(top_left_pixel, self.NORMAL_SIZE)
self.char_surface.fill(self.empty, rect_to_clear)
A transparent
Surfaceis blended with the background. When deleting, however, you want to cover the background completely. Therefore you have to make theSurfacetemporarily opaque again for the deletion. If you callset_alphawith the argumentNone, the previously set transparency is canceled again: