使用 .blit 时避免覆盖 pygame 表面

问题描述 投票:0回答:1

我尝试先清理一个表面,然后再使用

blit()
到另一个表面。在我通过使其不透明来清除path_surface之前,对movement_surface使用blit(),并重置其不透明度(更多内容请参见此处)

我现在遇到的问题是它覆盖了

movement_surface
上的所有内容,因此我需要在将其blit到
path_surface
之前清除
movement_surface
。为了尝试执行此操作,我正在创建一个
clear_surface
并尝试使用它来重置
path_surface
。没有任何效果。

代码:

def undraw_movement(self):
    empty = pg.Color(0,0,0,0)
    clear_surface = pg.Surface(self.path_surface.get_size(), pg.SRCALPHA)
    clear_surface.set_alpha(150)
    clear_surface.fill(empty)
    clear_surface.set_alpha(None)

    self.path_surface.blit(clear_surface, (0,0))
    self.movement_surface.blit(self.path_surface, (0,0))
pygame pygame-surface
1个回答
0
投票

没有简单的方法可以在 pygame 中“撤消”blit,不幸的是,如果没有完整的代码或您想要发生的情况的示例,则不可能找到更简单的方法。如果您只想删除最新的移动,您可以在对其进行任何更改之前使用 [surface].copy() 保留表面的副本,并在需要时返回到该副本。如果您确实需要能够删除任何移动,我唯一能想到的就是为所做的每个移动创建一个新的表面并为其分配一个位置,然后当您需要删除移动时,您可以只使用该表面从列表中删除并重新列出所有内容。

如果没有完整的代码或不知道您想要在更大范围内实现什么目标,我无法提供除此之外的任何帮助。如果您在绘图方面遇到困难,还有其他解决方案,例如如果您不需要透明度值或每秒仅绘制 60 次,则使用 colorkey 而不是 SRCALPHA,这些解决方案通常更容易实现且更干净。

© www.soinside.com 2019 - 2024. All rights reserved.