单击时如何让精灵消失?

How to get a sprite to disappear when clicked?

我正在做一个弹出气球的游戏,希望气球在点击时消失。我在主循环中有一个爆炸 class 和一个事件,它正确地检查精灵的位置,然后在鼠标单击气球时显示爆炸动画。尽管如此,原来的气球精灵仍然从屏幕上掉下来。

这是气球CLASS

class Balloon(pygame.sprite.Sprite):

    def __init__(self,img):
        super(Balloon,self).__init__()
        self.image=pygame.image.load(img).convert_alpha()
        self.image=pygame.transform.scale(self.image,(40,40))
        self.speed = random.randint(1,4)
        self.rect=self.image.get_rect()
        self.rect.x= random.randrange(screen_width)
        self.rect.y= 0
         
    def update(self):
        for event in pygame.event.get():
            if event.type==pygame.MOUSEBUTTONDOWN:
                pos = pygame.mouse.get_pos()
                for sprite in balloongroup:
                    if sprite.rect.collidepoint(pos):
                        self.kill()


        self.rect.y+=self.speed
        if self.rect.bottom >screen_height:
            self.kill()

现在是主循环:

def start():
    #explosion_group.update()
    
    #explosion_group.empty()
    balloongroup.empty()
    allsprites.empty()
    #basket=createBasket()
    while True:
        clock.tick(fps)
        for event in pygame.event.get():
            if event.type==QUIT:
                return
        explosion_group.update()
        if event.type==pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            for sprite in balloongroup:
                if sprite.rect.collidepoint(pos):
                    explosion = Explosion(pos[0], pos[1])
                    explosion_group.add(explosion)
                    allsprites.add(explosion)
                    explosion_group.draw(screen)

                
        screen.fill((0,0,0)) # <--------------- here
        screen.blit(pygame.image.load("background.jpg"),(0,0))
        balloongroup.update()
        if random.randrange(100)<2:
            create_balloon()
        allsprites.draw(screen)
        clock.tick(60)
        pygame.display.update()

我认为在气球 class 的更新方法中添加事件会起作用,但可惜它不起作用。我不知道从哪里开始。

首先,请注意您的事件循环不正确。您必须在循环中处理所有事件:

def start():
    # [...]

    while True:
        # [...]

        for event in pygame.event.get():
            if event.type == QUIT:
                return
            if event.type == pygame.MOUSEBUTTONDOWN:
                for sprite in balloongroup:
                    if sprite.rect.collidepoint(event.pos):
                        explosion = Explosion(*event.pos)
                        explosion_group.add(explosion)
                        allsprites.add(explosion)
                        explosion_group.draw(screen)

        explosion_group.update()

切勿在应用程序循环中多次调用 pygame.event.get()。参见


为什么不显示爆炸而不是精灵? kill创建blast对象时的精灵:

def start():
    # [...]

    while True:
        # [...]

        for event in pygame.event.get():
            if event.type == QUIT:
                return
            if event.type == pygame.MOUSEBUTTONDOWN:
                for sprite in balloongroup:
                    if sprite.rect.collidepoint(event.pos):

                        srite.kill()  # <----------

                        explosion = Explosion(event.pos[0], event.pos[1])
                        # [...]

或者您可以 kill 爆炸动画结束时的精灵。将精灵传递给爆炸 class 并在动画结束时 kill 传递给它:

class Explosion(pygame.sprite.Sprite):
    def __init__(self, x, y, target):
        pygame.sprite.Sprite.__init__(self)
        # [...]

        self.target = target

    def update(self):
        # [...]

        if self.index < len(self.red):
            self.image = self.red[self.index]
        else:
            self.kill()
            self.target.kill()
def start():
    # [...]

    while True:
        # [...]

        for event in pygame.event.get():
            if event.type == QUIT:
                return
            if event.type == pygame.MOUSEBUTTONDOWN:
                for sprite in balloongroup:
                    if sprite.rect.collidepoint(event.pos):
                        explosion = Explosion(event.pos[0], event.pos[1], sprite) # <---