Colisión con lista de objetos en Pygame

Ya hemos visto como colisionar dos objetos/cuadrados en nuestro artículo: colisión entre dos cuadrados.

Ahora vamos a colisionar un objeto con una lista de objetos, y del producto de la colisión desaparecerá uno de ellos.

Para empezar definimos los dos objetos:

import pygame, sys, random
pygame.init()

class Girl(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("E:/NUEVO 2020/PYTHON/pygame/girl.png").convert_alpha()
        self.rect=self.image.get_rect()
        
class Pera(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("E:/NUEVO 2020/PYTHON/pygame/pera2.png").convert_alpha()
        self.rect=self.image.get_rect()

Asignamos valores a las variables y definimos la ventana

ancho=800
alto=700
x=50
y=490
vel=0
salto=10
isJump=False
        
#Ventana y título
ventana = pygame.display.set_mode((ancho,alto)) 
pygame.display.set_caption('Saltando')
clock=pygame.time.Clock()

Cargamos el objeto Girl en la lista y guardamos el fondo en una variable.

#------------Listas--------------
frutaLista=pygame.sprite.Group() 
fondo =pygame.image.load("E:/NUEVO 2020/PYTHON/pygame/fondonubes.png").convert()
girl=Girl()

Mediante un bucle damos valores de x e y al objeto Pera que guardamos en una lista «frutaLista»

h=100
for i in range(3):
    pera=Pera()
    pera.rect.x=h
    pera.rect.y=300
    frutaLista.add(pera)
    h+=250

Ahora cargamos los sonidos de fondo y colisión.

soundColision = pygame.mixer.Sound("E:/NUEVO 2020/PYTHON/pygame/sonidoPG/tesoro.wav")
soundBg = pygame.mixer.music.load("E:/NUEVO 2020/PYTHON/pygame/main.mid")
pygame.mixer.music.play()

Damos movilidad a los objetos definiendo eventos de teclado

#/////////////////Bucle del juego/////////////////
gameOver=False
while not gameOver:
    
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            gameOver=True
            
    #----------- pulsar teclas y soltar tecla       
    
    if event.type == pygame.KEYDOWN: 
        if event.key == pygame.K_LEFT:
            vel=-7
        if event.key == pygame.K_RIGHT:
            vel=7
        #Si no está en salto /////////////////
        if event.key==pygame.K_SPACE:
            isJump=True

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT:
            vel=0
        if event.key == pygame.K_RIGHT:
            vel=0

    if isJump:
        if salto>=-10:
            y-=(salto*abs(salto))*0.5
            salto-=1
        else:
            salto=10
            isJump=False

Damos valores x e y al objeto girl, llamando a la clase con los parámetros definidos con el teclado.

    #------------ LOGICA -------------------
    x += vel
    girl.rect.x=x
    girl.rect.y=y

Para colisionar el objeto girl con la lista frutaLista utilizamod un spritecollide que borra el objeto de la lista si lo marcamos como True.

Cuando colisiona reproducimos el sonido.

    #----------- COLISION --------------------
    if pygame.sprite.spritecollide(girl, frutaLista, True):
        soundColision.play()

Ahora dibujamos el fondo, la lista y el objeto.

    #-------------FONDO---------------------
    ventana.blit(fondo, [0,0])
      
    #------------ DIBUJO ------------------
    frutaLista.draw(ventana)
    ventana.blit(girl.image, [x,y])

    pygame.display.flip()
    clock.tick(18)
pygame.quit()

Puedes ver todo el código en el vídeo.

Juande Marín

Profesor de Marketing digital, divulgador de inteligencia artificial y neuroeducación. Especializado en posicionamiento en buscadores y diseño web. Autor de varios libros relacionados con el comercio electrónico y el marketing digital (McGraw Hill, Paraninfo,…) Juande2marin

Material didáctico

Descubre un material moderno y adaptado a ciclos formativos.