<-- Back to list of examples

""" 
 Mostramos como usar un sprite respaldado por una gráfica
 
 Sample Python/Pygame Programs
 Simpson College Computer Science
 http://programarcadegames.com/
 http://simpson.edu/computer-science/

"""
import pygame
import random

# Definimos algunos colores
NEGRO = (0, 0, 0)
BLANCO = (255, 255, 255)
ROJO = (255, 0, 0)

# Esta clase representa la pelota        
# Deriva de la clase "Sprite" en Pygame
class Bloque(pygame.sprite.Sprite):
    
    # LEER ANTES DE USAR:
    # Este constructor nos deja utilizar cualquier tipo de gráfica:
    # mi_sprite = Bloque("cualquier_grafica.png")
    # Pero si NO quieres cualquier gráfica, puedes usar en su lugar lo siguiente:
    '''
    def __init__(self):
        super().__init__() 

        self.image = pygame.image.load("mi_grafica.png").convert()

        # Establecemos el color de fondo como transparente. Ajustamos a BLANCO si tu
        # fondo es BLANCO.
        self.image.set_colorkey(BLANCO)

        self.rect = self.image.get_rect()
    '''
    def __init__(self, filename, colorkey):
        # Llama al constructor de la clase padre (Sprite) 
        super().__init__() 

        # Crea una imagen del bloque y lo rellena de color.
        # Esto podría ser también una imagen cargada desde el disco duro.
        self.imagen_original = pygame.image.load(filename).convert()
        self.image = self.imagen_original

        # Establecemos el color de fondo como transparente. Ajustamos a BLANCO si tu
        # fondo es BLANCO.
        self.image.set_colorkey(colorkey)

        # Obtenemos el objeto rectángulo que posee las dimensiones de la imagen
        # Actualizamos la posición de ese objeto estableciendo los valores para 
        # rect.x y rect.y
        self.rect = self.image.get_rect()
        
        self.angulo = 0
        self.cambio_angulo = 0
        
    def update(self):
        self.imagen = pygame.transform.rotate(self.imagen_original, self.angulo)
        self.angulo += self.cambio_angulo
        self.angulo = self.angulo % 360

# Inicializamos Pygame
pygame.init()

# Establecemos el alto y largo de la pantalla
pantalla_largo = 700
pantalla_alto = 400
pantalla = pygame.display.set_mode([pantalla_largo, pantalla_alto])

# Esta es una lista de 'sprites.' Cada bloque en el programa es
# añadido a la lista. La lista es gestionada por una clase llamada 'Group.'
listade_bloques = pygame.sprite.Group()

# Esta es una lista de cada uno de los sprites. Así como del resto de bloques y el bloque protagonista.
listade_todoslos_sprites = pygame.sprite.Group()

for i in range(50):
    # Esto representa un bloque
    bloque = Bloque("alien.png", NEGRO)

    # Establecemos una ubicación aleatoria para el bloque
    bloque.rect.x = random.randrange(pantalla_largo)
    bloque.rect.y = random.randrange(pantalla_alto)
    bloque.angulo = random.randrange(360)
    bloque.cambio_angulo = random.randrange(-1, 2)
    # Añadimos el  bloque a la lista de objetos
    listade_bloques.add(bloque)
    listade_todoslos_sprites.add(bloque)
    
# Creamos un bloque protagonista ROJO
protagonista = Bloque("ufo.png", NEGRO)
protagonista.cambio_angulo = 0
listade_todoslos_sprites.add(protagonista)

# Iteramos hasta que el usuario pulse el botón de salida
hecho = False

# Se usa para establecer cuan rápido se actualiza la pantalla
reloj = pygame.time.Clock()

puntuacion = 0

# -------- Bucle principal del Programa -----------
while not hecho:
    for evento in pygame.event.get(): # User did something
        if evento.type == pygame.QUIT: # If user clicked close
            hecho = True # Flag that we are done so we exit this loop

    # Limpiamos la pantalla
    pantalla.fill(BLANCO)

    # Obtenemos la posición actual del ratón. Esto devuelve la posición
    # como una lista de dos números.
    pos = pygame.mouse.get_pos()
    
    # Extraemos la x e y de la lista, 
    # Tal como si extrajéramos letras de una cadena de texto.
    # Colocamos al objeto protagonista en la ubicación del ratón.
    protagonista.rect.x = pos[0]
    protagonista.rect.y = pos[1]
    
    listade_todoslos_sprites.update()
    
    # Observamos si el bloque protagonista ha colisionado con algo.
    lista_impacto_bloques = pygame.sprite.spritecollide(protagonista, listade_bloques, True)  
    
    # Comprobamos la lista de colisiones
    for bloque in lista_impacto_bloques:
        puntuacion += 1
        print( puntuacion )
        
    # Dibujamos todos los sprites
    listade_todoslos_sprites.draw(pantalla)
    
    # Limitamos a 60 fotogramas por segundo
    reloj.tick(60)

    # Avanzamos y actualizamos la pantalla con lo que hemos dibujado.
    pygame.display.flip()

pygame.quit()