Ciclo de animación
1 Estructura general
Para que un sketch de Processing pueda tener movimiento, ya sea autónomo o a partir de interacción, necesita estar construido con la siguiente estructura:
// declara VARIABLES GLOBALES (opcional)
// SETUP
void setup(){
// crea ventana
size( 640, 480 );
// prepara variables y parámetros
}
// DRAW
void draw(){
// dibuja!
}
Las variables globales son las que usaremos en todo nuestro programa; en especial las que guardan valores que no se reinician constantemente, como acumuladores, contadores, y banderas (flags)
[Variables: Contadores, Acumuladores, Banderas]
El bloque de código dentro de setup()
se ejecuta solo una vez, y al inicio del programa.
El bloque de código dentro de draw()
se ejecuta repetidamente, 30 veces por segundo (por default), y así se mantiene indefinidamente.
2 Fondo
Podemos manejar el fondo del sketch de diferentes maneras. Los siguientes ejemplos de animación se basan en la variable frameCount
.
[Animación en función del tiempo (frameCount)]
2.1 Limpiar en cada frame
Si usamos la función background( )
en el inicio de la función draw()
, efectivamente estaremos “limpiando” todo lo dibujado previamente para empezar con un cuadro limpio:
void setup(){
size( 640, 480 );
}
void draw(){
// reestablece el fondo:
background( 255 );
// dibuja un círculo en movimiento:
ellipse( frameCount, 240, 50, 50);
}
2.2 Dibujar encima
Si no usamos la función background( )
en el ciclo de animación, cada elemento dibujado en la función de draw()
se agregará a lo dibujado previamente.
void setup(){
size( 640, 480 );
// fondo inicial:
background( 255 );
}
void draw(){
// dibuja un círculo en movimiento,
// dejando marca por donde pasa:
ellipse( frameCount, 240, 50, 50);
}
2.3 Marcas temporales
Un punto medio consiste en no usar la función background( )
pero sí un rectángulo con dimensiones del canvas, y color de relleno parcialmente transparente.
En cada frame, este rectángulo ocultará parte de lo dibujado previamente. Lo más antiguo tenderá a desaparecer:
void setup(){
size( 640, 480 );
// fondo inicial:
background( 255 );
}
void draw(){
// relleno blanco con muy poca opacidad
fill( 255, 10);
// rectángulo que ocupa todo el canvas:
rect(0, 0, width, height);
// dibuja un círculo en movimiento,
// dejando marca por donde pasa:
ellipse( frameCount, 240, 50, 50);
}