Ejemplo de Animaciones en Python
De Wikitronica
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()