Pygame 在背景上擦除图像

3 投票
3 回答
15773 浏览
提问于 2025-04-17 13:03

你把一张图片放到你的画布上,作为背景。然后你按下X按钮,把另一张图片放到同一个画布上,这时候你想把之前的那张图片擦掉,应该怎么做呢?我现在有了一些代码,但最后画布中间还是出现了一个白色的矩形。

screen = pygame.display.set_mode(1280, 512)

screen.blit(background, (0,0))

while True:   
    pygame.display.flip() #flip is same as update
    for event in pygame.event.get():
        if (event.type == pygame.KEYDOWN):        
            if event.key == pygame.K_SPACE:
                screen.blit(player, (x, y))
            if event.key == pygame.K_BACKSPACE:
                pygame.draw.rect(screen, [255,255,255], (x, y, 62,62))

3 个回答

0

我个人使用的是

pygame.draw.rect(screen, (RgbColorHere), (x, y, width, height))
3

通常,blit工作流程就是把原始的背景画到屏幕上。

在你的代码中,你会用 screen.blit(background, (0,0)) 这个命令。

当你开始组合很多不同的图层时,你可能需要一个变量或者一个变量的列表来记录屏幕的状态。

比如:

初始化背景

objectsonscreen = []
objectsonscreen.append(background)
screen.blit(background, (0,0))

添加精灵

objectsonscreen.append(player)
screen.blit(player, (x, y))

清除精灵

objectsonscreen = [background]
screen.blit(background, (0,0))

想了解更多关于Pygame中精灵的信息,可以查看 这里。注意,如果你的背景不是图片,而只是一个纯色的背景,你也可以用 screen.fill([0, 0, 0]) 来代替。

5

这里基本上有两种方法可以选择。你可以选择简单的方法,重新绘制整个背景...

if event.key == pygame.K_BACKSPACE:
   screen.blit(background, (0,0))

或者,如果你想让程序运行得更高效一点,可以让blit方法只绘制玩家图像覆盖的那部分背景。你可以这样做...

screen.blit(background, (x, y), pygame.Rect(x, y, 62, 62))

第三个参数中的Rect会让blit只绘制位于x,y位置的62x62像素的背景部分。

当然,这里假设玩家图像总是在背景内部。如果玩家图像只部分覆盖背景,我就不太确定会发生什么。可能会出现错误,或者它会直接从图像的另一边继续。

其实如果这个项目比较小,第一种方法就足够用了,但如果你对性能有顾虑,可以试试第二种方法。

撰写回答