class Boton{
float diametro;
int col;
float x;
float y;
float angulo;
float diametroObj;
int colObj;
float xObj;
float yObj;
float anguloObj;
Boton(float _x, float _y, int _col){
x = _x;
xObj = _x;
y = _y;
yObj = _y;
diametro = 50;
diametroObj = diametro;
col = _col;
colObj = _col;
}
void actualizate(){
diametro = lerp(diametro, diametroObj, 0.2);
x = lerp(x, xObj, 0.2);
y = lerp(y, yObj, 0.2);
angulo = lerp(angulo, anguloObj, 0.2);
col = lerpColor(col, colObj, 0.6);
}
void dibujate(){
fill(col);
stroke(0);
strokeWeight(4);
pushMatrix();
translate(x, y);
rotate(angulo);
ellipse(0, 0, diametro, diametro);
line(0, 0, diametro/2, 0);
popMatrix();
}
}
// define la cantidad de elementos del gusano
int copias = 20;
// colores
boolean cogido = false;
color colorCogido;
color colorSobre;
color colorNormal;
// defino 2 arrays para guardar las posiciones
Boton[] botones = new Boton[copias];
void setup () {
size(500, 500);
smooth();
colorCogido = color(#F5332C);
colorSobre = color(#FFCD03);
colorNormal = color(#668CBF);
// llamo a la funcion que define la pos
// de salida de los cuadros
creaBotones();
}
void draw () {
background(255);
// actualizo las posiciones y angulos
// de los botones
actualizaBotones();
// dibujo los botones
dibujaBotones();
}
void mousePressed(){
if (dist(mouseX, mouseY, botones[0].x, botones[0].y) < botones[0].diametro/2) {
cogido = true;
}
}
void mouseReleased(){
cogido = false;
}
void creaBotones() {
// recorro el array y relleno cada miembro con un valor
for (int i=0; i<copias; i++) {
botones[i] = new Boton(width/2, height/2, colorNormal);
}
}
void actualizaBotones() {
// El primero se actualiza de una forma
if (cogido) {
botones[0].xObj = mouseX;
botones[0].yObj = mouseY;
botones[0].anguloObj = atan2(mouseY - botones[0].y, mouseX - botones[0].x);
botones[0].colObj = colorCogido;
botones[0].diametroObj = map(dist(mouseX, mouseY, pmouseX, pmouseY), 0, 100, 50, 300);
} else {
botones[0].diametroObj = 50;
if (dist(mouseX, mouseY, botones[0].x, botones[0].y) < botones[0].diametro/2) {
botones[0].colObj = colorSobre;
} else {
botones[0].colObj = colorNormal;
}
}
// Para el resto de cuadrados
for (int i=1; i<copias; i++) {
botones[i].diametroObj = botones[i-1].diametro;
botones[i].xObj = botones[i-1].x;
botones[i].yObj = botones[i-1].y;
botones[i].anguloObj = botones[i-1].angulo;
botones[i].colObj = botones[i-1].col;
}
for (int i=0; i<copias; i++) {
botones[i].actualizate();
}
}
void dibujaBotones() {
for (int i=copias-1; i>=0; i--) {
botones[i].dibujate();
}
}