es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo hacer que un sprite desaparezca al hacer clic en él?

Estoy haciendo un juego de reventar globos y me gustaría que los globos desaparecieran al hacer clic en ellos. Tengo una clase de explosión y un evento en el bucle principal que verifica correctamente la posición de un sprite y luego muestra una animación de explosión si se hace clic en un globo con el mouse. A pesar de esto, el sprite original del globo sigue cayendo por la pantalla.

AQUÍ ESTÁ LA CLASE GLOBO:

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()

AHORA AQUÍ ESTÁ EL BUCLE PRINCIPAL:

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
            #if event.type==pygame.MOUSEBUTTONDOWN:
                #explosion = Explosion(pygame.mouse.get_pos()[0], pygame.mouse.get_pos()[1])
                #explosion_group.add(explosion)
                #allsprites.add(explosion) 
        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()

Pensé que agregar el evento en el método de actualización para la clase Balloon funcionaría, pero lamentablemente no lo hace. No estoy seguro de dónde más empezar.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el sprite de globo aún cayendo después de hacer clic se debe a que el método de actualización en la clase Balloon se llama antes de que se desencadene la comprobación de eventos para hacer clic en el bucle principal del juego. Esto significa que el globo aún se está actualizando y moviendo hacia abajo en la pantalla incluso después de haber hecho clic en él.

    Para resolver este problema, puede mover el código de verificación de eventos en el bucle principal para que esté antes del código de actualización del globo. De esta manera, cuando se hace clic en un globo, se eliminará antes de que se llame al método de actualización.

    Aquí hay una versión actualizada del bucle principal:

    def start():
        balloongroup.empty()
        allsprites.empty()
        while True:
            clock.tick(fps)
            for event in pygame.event.get():
                if event.type == QUIT:
                    return
                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)
                            sprite.kill()
    
            screen.fill((0, 0, 0))
            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()
    

    En esta versión actualizada, la verificación de eventos para hacer clic se realiza antes del código de actualización del globo. Cuando se hace clic en un globo, se mata antes de que se llame al método de actualización, por lo que ya no caerá por la pantalla.

Comments are closed.