Disparo con colisión

Al anterior juego de disparo vamos a añadir una colisión.

Definimos para ello tres clases con tres objetos que agrupamos en dos listas.

import pygame
import sys, random
pygame.init()

class Arco(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("E:/NUEVO 2020/PYTHON/pygame/Anima2/arco250.png").convert_alpha()
        self.rect=self.image.get_rect() 
    def update(self):
        x,y = pygame.mouse.get_pos()
        nave.rect.x=x
        nave.rect.y =500

class Flecha(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("E:/NUEVO 2020/PYTHON/pygame/Anima2/flecha150.png").convert_alpha()
        self.rect=self.image.get_rect() 
    def update(self):
        self.rect.y -= 5
        
class Manzana(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("E:/NUEVO 2020/PYTHON/pygame/manzanilla.png").convert_alpha()
        self.rect=self.image.get_rect() 
              
ancho = 1080 
alto = 700

flechaLista=pygame.sprite.Group()
manzanaLista=pygame.sprite.Group()

Definimos la ventana

#----------------Ventana y título---------------------
ventana = pygame.display.set_mode((ancho,alto)) 
pygame.display.set_caption('Arco fruta')
clock=pygame.time.Clock()

pygame.mouse.set_visible(1) #Oculto el puntero en 0
fondo =pygame.image.load("E:/NUEVO 2020/PYTHON/pygame/Fondo/bosque.png").convert()

A continuación creamos un bucle para distribuir las manzanas de forma aleatoria de x e y.

for i in range(20):
    manzana=Manzana()
    manzana.rect.x=random.randrange(100,800,50)
    manzana.rect.y=random.randrange(0,350,50)
    
    manzanaLista.add(manzana)

Abrimos el bucle y asignamos valores a coordenadas de la flecha con el puntero del ratón

#/////////////////Bucle del juego/////////////////
gameOver=False
while not gameOver:
    clock.tick(60)
    
    for event in pygame.event.get():
        
        if event.type == pygame.QUIT:
            gameOver=True
    
        if event.type == pygame.MOUSEBUTTONDOWN: 
            flecha=Flecha()
            flecha.rect.x=x+85
            flecha.rect.y=600-90
            flechaLista.add(flecha)

En la parte lógica definimos la colisión de las flechas con la lista de manzanas, de forma que cuando se produzca una colisión las manzanas desaparezcan de la lista.

    #------------ LOGICA -------------------
    flechaLista.update()
    for tiro in flechaLista:
        if pygame.sprite.spritecollide(tiro, manzanaLista, True):
            flechaLista.remove(tiro)

Definimos el fondo, dibujamos los objetos y cerramos.

    #-------------FONDO---------------------
    ventana.blit(fondo, [0,0])
    #------------ DIBUJO ------------------
    x,y=pygame.mouse.get_pos()
    ventana.blit(arco.image, [x,500])
    manzanaLista.draw(ventana)
    flechaLista.draw(ventana)
    
    pygame.display.flip()
pygame.quit()

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.