python - 如何在pygame中反转“window.blit”或删除我创建的对象(精灵)

0 投票
2 回答
9076 浏览
提问于 2025-04-17 23:14

我想在点击一个精灵的时候把它删除,但我发现原来的那个物体还是留在屏幕上。似乎一旦我把它画上去,它就会永远留在那里。请问我该怎么修改下面的代码,才能在点击后把这个精灵去掉呢?

import pygame

pygame.init()

window = pygame.display.set_mode((1152,720))

background = pygame.image.load("images/emptyroom.jpg")
image=pygame.image.load("images/smallkey.png")
b = window.blit(pygame.image.load("images/emptyroom.jpg"), (0,0))
spritestay = True

# d = window.blit(pygame.image.load("images/leglamp.png"), (15,500))

class HiddenObject(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.i1 = pygame.image.load("images/smallkey.png")
        self.i2 = pygame.image.load("images/Clear.png")
        self.rect=self.i1.get_rect()

    def draw(self, x, y):
        while spritestay == True:
            d = window.blit(self.i1, (x,y))
#d.collidepoint(pygame.mouse.get_pos())
        while spritestay == False:
            d = window.blit(self.i1, (x,y))

pygame.display.set_caption("Eye Spy Game Test")

gameLoop = True

while gameLoop:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            spritestay = False

        if event.type == pygame.MOUSEBUTTONUP:
            spritestay = True

        if (event.type==pygame.QUIT):
            gameLoop=False

    yotestvar = HiddenObject()
    d = yotestvar.draw(100,100)


    pygame.display.flip()

pygame.quit()

2 个回答

2

在pygame中,一旦你把东西画到屏幕上,就不能简单地删除选定的对象。相反,你必须在每次绘制之后清空屏幕,然后再画上新的更新对象。例如,如果你在做一个更复杂的东西,你需要先画出来,然后擦掉,再稍微移动一下,再画上去,然后再擦掉,如此反复。

因此,建议你在每次循环结束时都清空屏幕。对于你的情况,代码大概是这样的:

yotestvar = HiddenObject()

while gameLoop:
    window.fill((255, 255, 255)) # (255, 255, 255) RGB value for WHITE
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            spritestay = False

        if event.type == pygame.MOUSEBUTTONUP:
            spritestay = True

        if (event.type==pygame.QUIT):
            gameLoop=False

    yotestvar.draw(100,100)
    pygame.display.update()

pygame.quit()
3

你的代码有几个问题。

在主循环之前不应该进行图像绘制。

如果隐藏对象知道它的位置会更好。你可以在构造函数中添加一个位置,然后在绘制方法中使用这个位置。

def __init__(self,pos):
    ...
    self.pos = pos

def draw(self):
    window.blit(self.i1, self.pos)

你的绘制方法永远不会结束。你需要把while语句换成if语句。而且当spritestay为False时,你并没有绘制第二张图片。我猜你是想绘制Clear.png。

if spritestay:
    window.blit(self.i1, (x,y))
else: 
    window.blit(self.i2, (x,y))

如果Clear.png只是一张空图像,那就没有必要绘制它。所以这部分可以改成:

if spritestay:
   window.blit(self.i1, (x,y))

你的绘制函数没有返回任何东西,所以在

d = yotestvar.draw(100,100)

中d是None。你没有在其他地方使用d,所以可以把它去掉。

你在每一帧都创建HiddenObject。我觉得把它移到循环之前会更好。

最后一个问题是你没有用任何颜色填充屏幕。这可能是你一直在挣扎的真正问题。下面是绘制的工作原理。

你可以把自己想象成一个画家,面前有一块画布。如果你用刷子画了什么,怎么才能把它去掉呢?唯一的方法就是在上面再画一些东西。在pygame中,我们使用fill方法来用某种颜色填充整个表面。

screen.fill((0,0,0)) # fills screen with black color

所以,要在屏幕上显示东西,你需要先调用 screen.fill,然后再绘制你想要看到的其他对象。

撰写回答