如何在不覆盖其他东西的情况下清理精灵



我正试图在pygame中制作俄罗斯方块,我遇到了碰撞和移动,但当面具与放置的方块碰撞时,我用来覆盖旧精灵的矩形会覆盖放置的精灵的一部分:

def replace(self):
pygame.draw.rect(board_surface,(0,0,0),(self.rect.topleft, self.rect.size))

这个代码在我的精灵类中:

class Block(pygame.sprite.Sprite):
def __init__(self, blocks):
super().__init__()
self.random_block = randint(1,7)
self.image = blocks[self.random_block]
self.image = pygame.transform.scale(self.image,(self.image.get_width()*.4, self.image.get_height()*.4))
self.rect = self.image.get_rect()
self.rect.topleft = (300,0)
self.mask = pygame.mask.from_surface(self.image)
def replace(self):
pygame.draw.rect(board_surface,(0,0,0),(self.rect.topleft, self.rect.size))

def handle_keys(self, board_s, block, unactive_blocks):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
if self.rect.left - 60 >= 0:
self.replace(block_colours)
self.rect.x -= 60
self.draw(block_group, board_s)
elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
if self.rect.right + 60 <= 600:
self.replace(block_colours)
self.rect.x += 60
self.draw(block_group, board_s)
elif keys[pygame.K_UP] or keys[pygame.K_w]:
self.replace(block_colours)
topleft = self.rect.topleft
self.image = pygame.transform.rotate(self.image, 90)
self.rect = self.image.get_rect()
self.rect.topleft = topleft
self.mask = pygame.mask.from_surface(self.image)
self.draw(block_group, board_s)
elif keys[pygame.K_DOWN] or keys[pygame.K_s]:
if self.rect.bottom + 60 <= 1200:
self.replace(block_colours)
self.rect.y += 60
if pygame.sprite.spritecollide(block,unactive_blocks,False,pygame.sprite.collide_mask):
self.rect.y -= 60
block_sprite(blocks, block)
self.draw(block_group, board_s)
else:
block_sprite(blocks, block)

def move_every_second(self, block, unactive_blocks):
if self.rect.bottom + 60 <= 1200:
self.replace(block_colours)
self.rect.y += 60
if pygame.sprite.spritecollide(block,unactive_blocks,False,pygame.sprite.collide_mask):
self.rect.y -= 60
block_sprite(blocks, block)
self.draw(block_group, board_s)
else:
block_sprite(blocks, block)

def draw(self, block_group, board_s):
print(self.rect.x,self.rect.y)
block_group.draw(board_s)

完整代码,请访问pastebin.com/59E74zBJ

通常也是最简单的方法是在每帧中重新绘制场景。如果背景颜色不统一怎么办?如果是图像,您将如何恢复背景?

但是,您可以从带有to_surfaceblit遮罩创建曲面,而不是绘制矩形:

cover_image = self.mask.to_surface(setcolor=(0, 0, 0, 255), unsetcolor=(0, 0, 0, 0))
board_surface.blit(cover_image, self.rect.topleft)

最新更新