Diferencia entre revisiones de «Ejemplo de Animaciones en Python»
De Wikitronica
Línea 1: | Línea 1: | ||
− | En este ejemplo podemos ver | + | 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: |
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
Línea 6: | Línea 6: | ||
import os, eucly, math | import os, eucly, math | ||
− | #Definir colores (los colores utilizan | + | #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 | negro = 0, 0, 0 | ||
blanco = 255, 255, 255 | blanco = 255, 255, 255 | ||
Línea 13: | Línea 13: | ||
azul = 0, 0, 255 | azul = 0, 0, 255 | ||
− | #Defino una | + | #Defino una enumeración, similar a las que se usan en C para poder obtener colores al azar |
colors = [rojo, azul, blanco, verde] | colors = [rojo, azul, blanco, verde] | ||
Línea 19: | Línea 19: | ||
velocidad_inicial = 20; | velocidad_inicial = 20; | ||
− | #Definir | + | #Definir Tamaño de Pantalla |
screen_size = screen_width, screen_height = 800,600 | screen_size = screen_width, screen_height = 800,600 | ||
Línea 25: | Línea 25: | ||
screen = pygame.display.set_mode(screen_size) | 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 | + | #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: | class Circulo: | ||
def __init__(self, position, size, color = (255,255,255), velocity= eucly.Vector2(0,0), width=1): | def __init__(self, position, size, color = (255,255,255), velocity= eucly.Vector2(0,0), width=1): | ||
Línea 34: | Línea 34: | ||
self.velocity = velocity | self.velocity = velocity | ||
− | #Esta es una variante de la | + | #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): | def display(self): | ||
rx, ry = int(self.position.x), int(self.position.y) | rx, ry = int(self.position.x), int(self.position.y) | ||
pygame.draw.circle(screen, self.color, (rx, ry), self.size, self.width) | pygame.draw.circle(screen, self.color, (rx, ry), self.size, self.width) | ||
− | #Esta es una | + | #Esta es una función de movimiento que reescribe la posicion final con la inicial más la velocidad por tiempo |
def move(self): | def move(self): | ||
self.position = self.position + dtime * self.velocity | self.position = self.position + dtime * self.velocity | ||
Línea 47: | Línea 47: | ||
self.velocity = velocity | self.velocity = velocity | ||
− | #Esta | + | #Esta función no pertenece a la clase, pero genera un vector de velocidad al azar. |
def get_random_velocity(): | def get_random_velocity(): | ||
new_angle = random.uniform(0, math.pi*2) | new_angle = random.uniform(0, math.pi*2) | ||
Línea 60: | Línea 60: | ||
clock = pygame.time.Clock() | clock = pygame.time.Clock() | ||
− | # | + | #Definición de círculos para ser generados al azar |
cantidad_de_circulos = 5 | cantidad_de_circulos = 5 | ||
circulos = [] | circulos = [] | ||
− | #Esta rutina permite generar | + | #Esta rutina permite generar círculos aleatoriamente |
for n in range(cantidad_de_circulos): | for n in range(cantidad_de_circulos): | ||
size = random.randint(15,30) | size = random.randint(15,30) |
Revisión actual del 16:02 20 jun 2014
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()