Inicio > Programing > Lluvia de nieve con PyGame

Lluvia de nieve con PyGame

Pues ya que estamos en épocas navideñas que tal un poco de nieve!!! … en mi vida sólo he he tenido una sola oportunidad para jugar con la nieve hasta ahora, que gracias a PyGame puedo jugar con la nieve de nuevo🙂

En la página de PyGame hay varios tutoriales y ejemplos y he tomado el ejemplo de animating_snow.py del libro Introduction to programming using Python and Pygame.

A continuación muestro el código original con los comentarios traducidos al español y con algunos comentarios extras que me parecieron necesarios

# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://cs.simpson.edu

# Traducción por: Ricardo Torres
# https://rctorr.wordpress.com

# Importa la librería llamada 'pygame'
import pygame
# Importa la librería llamada 'random'
import random

# Inicializa la maquina de juego
pygame.init()

# El color del fondo
black = [ 0, 0, 0]
# El color de la nieve
white = [255,255,255]

# Asigna el ancho y alto de la ventana
size=[400,400]
screen=pygame.display.set_mode(size)
pygame.display.set_caption("Animación de nieve!")

# Crea un arreglo vacío
star_list=[]

# Repite 50 veces adicionando una estrella de nieve en una posición aleatoria x,y
for i in range(50):
    x=random.randrange(0,400)
    y=random.randrange(0,400)
    star_list.append([x,y])

clock = pygame.time.Clock()

# Repite hasta que el usuario de click en el botón cerrar.
done=False
while done==False:

    for event in pygame.event.get(): # El usuario hizo algo
        if event.type == pygame.QUIT: # Si el usuario hizo click en botón cerrar
            done=True # La bandera que se usa para del ciclo es 'done'

    # Se asigna el color de fondo
    screen.fill(black)

    # Se procesa cada estrella de nieve de la lista
    for i in range(len(star_list)):
        # Se dibuja la estrella de nieve
        pygame.draw.circle(screen,white,star_list[i],2)

        # Se mueve la estrella de nieve un pixel hacia abajo
        star_list[i][1]+=1

        # Si la estrella de nieve se mueve más allá del limite inferior de la
        # ventana
        if star_list[i][1] > 400:
            # La mueve de nuevo a la parte superior de la ventana
            y=random.randrange(-50,-10)
            star_list[i][1]=y
            # Da a esta una nueva posición x
            x=random.randrange(0,400)
            star_list[i][0]=x

    # Actualiza la ventana con lo que se ha dibujado.
    pygame.display.flip()
    clock.tick(20)

# Si olvida esta línea el programa se puede congelar al salir.
pygame.quit ()

Al ejecutarlo lo que se obtiene es lo siguiente:

se observa como la nieve va cayendo, aunque la ventana es sólo de 400×400, así que lo primero que se me ocurre es porque no hacer la ventana del tamaño de mi pantalla que tienes una resolución de 1366×768, así que manos a la obra!!

Al revisar el código observo que hay varios valores de 400 para x y 400 para y a lo largo del código, así que lo primero será crear dos variable con el ancho y alto de la ventana quedando la porción del código como sigue:

# Asigna el ancho y alto de la ventana
width = 1366
height = 768
size = [width, height]
screen = pygame.display.set_mode(size)

Con estas modificaciones se obtiene lo siguiente:

podemos observar que la ventana efectivamente ha aumentado de tamaño, pero la nieve sólo se dibuja en una región, eso indica que hay que modificar algunos valores extras

# Repite 50 veces adicionando una estrella de nieve en una posición aleatoria x,y
for i in range(50):
    x=random.randrange(0,width)
    y=random.randrange(0,height)
    star_list.append([x,y])

esto hace que al generar las coordenadas para cada estrella de nieve considere todo el ancho y alto de la ventana.

        # Si la estrella de nieve se mueve más allá del limite inferior de la
        # ventana
        if star_list[i][1] > height:
            # La mueve de nuevo a la parte superior de la ventana
            y=random.randrange(-50,-10)
            star_list[i][1]=y
            # Da a esta una nueva posición x
            x=random.randrange(0,width)
            star_list[i][0]=x

en este caso el alto determina el límite inferior hasta donde se desplazarán cada estrella de nieve y el ancho determina el límite para obtener un nueva posición en x.

Al ejecutar se obtiene

La nieve ya se distribuye en toda la ventana, pero es muy poca nieve, 50 estrellas de nieve para ser exactos, así que una modificación más para aumentar a 500 estrellas de nieve

# Repite 500 veces adicionando una estrella de nieve en una posición aleatoria x,y
for i in range(500):
    x=random.randrange(0,width)
    y=random.randrange(0,height)
    star_list.append([x,y])

y el resultado es

Y finalmente pensando en que es tiempo de noche, se cambiará el color de fondo por un azul rey

# El color del fondo
black = [ 0, 0, 32]

y ahora se observa así

Y bueno, una alternativa sería hacer que se vea a pantalla completa, pero esto quedará para otra ocasión.

Otra propuesta es colocar una imagen de fondo o tal ves hacer que un tux vaya en su trineo😉 y es aquí donde la imaginación es el límite!

Categorías:Programing Etiquetas: , ,
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

PiKon

3D Printing + Raspberry Pi Camera = PiKon Telescope

gvSIG blog

gvSIG project blog

Python Adventures

Welcome to the Jungle!

A %d blogueros les gusta esto: