Ejemplo de Animaciones en Python

De Wikitronica
Saltar a: navegación, buscar

En este ejemplo podemos ver cómo se crea una clase llamada Círculo en Python, y cómo se la dota de movimiento que se genere aleatoriamente:

import sys, pygame, random, pygame.mixer
from pygame.locals import *
import os, eucly, math

#Definir colores (los colores utilizan notación RGB, básicamente uno lo que hace es indicar que tanto de cada color quiere en cada campo RED, GREEN, BLUE)
negro = 0, 0, 0
blanco = 255, 255, 255
rojo = 255, 0, 0
verde = 0, 255, 0
azul = 0, 0, 255

#Defino una enumeración, similar a las que se usan en C para poder obtener colores al azar
colors = [rojo, azul, blanco, verde]

#Constante utilizada en el programa
velocidad_inicial = 20;

#Definir Tamaño de Pantalla
screen_size = screen_width, screen_height = 800,600

#Activando la ventana
screen = pygame.display.set_mode(screen_size)

#Creo la clase circulo, en este caso "position" es un vector que resume las coordenadas (x,y) y Vector2 es un vector que pertenece a pyeuclide
class Circulo:
    def __init__(self, position, size, color = (255,255,255), velocity= eucly.Vector2(0,0), width=1):
        self.position = position
        self.size = size
        self.color = color
        self.width = width
        self.velocity = velocity

    #Esta es una variante de la función Display ya vista, que descompone primero las coordenadas de position en rx y ry	
    def display(self):
        rx, ry = int(self.position.x), int(self.position.y)
        pygame.draw.circle(screen, self.color, (rx, ry), self.size, self.width)

    #Esta es una función de movimiento que reescribe la posicion final con la inicial más la velocidad por tiempo	
    def move(self):
        self.position = self.position + dtime * self.velocity

    #Esta es una funcion que permite cambiar la velocidad de el objeto		  
    def change_velocity(self,velocidad):
        self.velocity = velocity

#Esta función no pertenece a la clase, pero genera un vector de velocidad al azar.        
def get_random_velocity():
    new_angle = random.uniform(0, math.pi*2)
    new_x = math.sin(new_angle)
    new_y = math.cos(new_angle)
    new_vector = eucly.Vector2(new_x,new_y)
    new_vector.normalize()
    new_vector *= velocidad_inicial
    return new_vector

#Activando el reloj
clock = pygame.time.Clock()

#Definición de círculos para ser generados al azar
cantidad_de_circulos = 5
circulos = []

#Esta rutina permite generar círculos aleatoriamente
for n in range(cantidad_de_circulos):
    size = random.randint(15,30)
    x = random.randint(size, screen_width-size)
    y = random.randint(size, screen_height-size)
    color = random.choice(colors)
    velocity = get_random_velocity()
    my_circle = Circulo(eucly.Vector2(x, y), size, color, velocity)
    circulos.append(my_circle)


#Variable que controla la espera entre cada cambio velocidad
direction_tick = 0.0

#Definir variables temporales
fps = 60
corriendo = True

while corriendo:
     clock.tick(fps)
	
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                corriendo = False

        #el reloj le pasa a dtime_ms el tiempo entre ticks en milisegundos, este se convierte a segundos y se acumula en direction_tick
        dtime_ms = clock.tick(fps)
        dtime = dtime_ms/1000.0    
        direction_tick += dtime

        #Cuando direction_tick pasa se 1 segundo, se generan nuevas velocidades para un circulo al azar.
        if(direction_tick > 1.0):
            direction_tick = 0.0
            random_circle = random.choice(circulos)
            new_velocity = get_random_velocity()
            random_circle.change_velocity(new_velocity)



        #relleno el screen de negro
        screen.fill(negro)
     
	#rutina para mover todos los circulos, importante pintar toda la pantalla de negro antes de volver a dibujarlos, ya que si no
	#se superponen.
        for Circulo in circulos:
            Circulo.move()
            Circulo.display()

	pygame.display.flip()

pygame.quit()
sys.exit()

Contributors

GMarzinotto, JCaceres