Transcompo

Subject
Creative Coding
Year
2023

Move your mouse left/right to switch the background and resize the train. Click and hold for a rain of flowers. Press A to rotate them, S or D to resize and recolor them with your cursor.

Interactive composition using arrays.

Sketch code

let bla; //variable para color blanco
let neg; //variable para color negro
let gri; //variable para color gris
let rotaciones = []; //lista de rotaciones para las flores
let posicionesX = []; // lista de posiciones en x para las flores
let posicionesY = []; // lista de posiciones en y para las flores
let colores= []; //lista de colores para las flores
let tam=[]; //lista de tamaños para las flores
let r=320; //variable para rotación de las flores
let posX=0; //variable para posición en x del vagón y monitos
let c; //variable para color del vagón


function setup() {
  let cnv = createCanvas(1080,1080); //tamaño 1080x1080px
  cnv.parent('p5-sketch-holder'); // contiene el canvas dentro de la página en vez de flotar en el body
  cnv.style('width', '100%'); // p5 pone width/height fijos en línea por defecto, lo que le gana al CSS del contenedor — esto lo reemplaza para que escale responsive
  cnv.style('height', 'auto');
  pixelDensity(1); // con densidad 2 (retina) + el resize por CSS de arriba, background() solo llenaba hasta el tamaño mostrado en CSS × esa densidad, no el buffer real — dejaba una franja del canvas sin pintar
  neg= color(0); //defino la variable con el color negro
  gri= color(80,80,80);//defino la variable con el color gris
  bla= color(255);//defino la variable con el color blanco
  c=color(0); //defino la variable con el color negro

  for(let i=0; i<50; i++){ //variable i para recorrer en filas
   rotaciones[i] = 45 + 5 *i; //varían las rotaciones dependiendo del i
   posicionesX[i] = random(0, width); //posición random en x a lo ancho del canvas
   posicionesY[i] = random(height); //posición random en eje y
   colores[i] = color(random(255), random(255), random(255)); //color random entre todas las opciones de colores
    tam[i] = random(20, 100); //tamaño random entre los 20 y 100 px
   }
}


function draw() {

  background (0);

  if (mouseX <= width/2 ){ //si el mouseX es menor a la mitad del canvas
  background(0); //fondo negro
}else{ //sino
  background(255); //fondo blanco
}

  for(let i=0; i<50; i++){ //variable i para recorrer en filas

    flores(posicionesX[i], posicionesY[i], tam[i],tam[i],r, bla, colores[i]); //flores en distintos tamaños, colores, rotaciones y posiciones


    if(key == 's'){ //si se aprieta un botón y es la "s"
    flores(posicionesX[i], posicionesY[i], 100,mouseY,mouseY, bla, colores[i]); //cambian el tamaño en "y" y las rotaciones de las flores mediante mouseY
    }

    if(key == 'd'){ //si se aprieta un botón y es la "d"
    flores(posicionesX[i], posicionesY[i], mouseY,100,320, colores[i], c); //cambia el tamaño en x de las flores con mouseY
      if (mouseX <= width/2){ //si el mouseX es menor a la mitad del ancho del canvas
        c=bla; //el color de esas flores sea blanco
      } else{ //sino, es decir, si es que mouseX es mayor a la mitad del ancho
        c=neg; //negro
      }
    }

    if(key == 'a'){ //si se aprieta un botón y es la "a"
    r=r+i*0.02; //rota constantemente según "i"
    }


    if (mouseIsPressed){ //si se aprieta el mouse
        if (frameCount%7 == 0){ //si el resto de la división del número de frames en 7 es igual a 0
    randomizar(); //randomizar las flores para que se vea como lluvia
      }
    }
 }

 for(let i=-2; i<10; i++){ //variable i para recorrer en filas
  posX=posX+0.5; //posX se irá moviendo a la derecha
  vagon(c,posX+i*249, 440, mouseX, 200); //vagón moviéndose a la derecha
   if (i%2==0){ //si el resto de la división de i en 2 es igual a 0
     c=neg; //vagón negro
   }else{   //sino
     c=gri; //vagón gris
   }
   if(posX==width/4){ //si posX es igual a un cuarto del ancho del canvas
     posX=-1; //que se devuelva a -1
   }
}
  monito(posX+64.5,533.66, 38, 38); //monito moviéndose con posX a la derecha
 }






function monito(pX, pY, ancho, alto){ //función para crear los monitos en el vagón
   for (let i=0; i<50; i++){ //variable i para recorrer en filas
  fill(0); //rellenar con negro
  circle(pX+i*250, pY, ancho);//cabeza
  ellipse(pX+i*250, pY+42.18, ancho-9,alto+24);//cuerpo
  rect(pX-14.5+i*250, pY+41.84, ancho-9,alto-6);//cuerpo

  pX= pX+40; //para que vaya cambiando su posición y se vea como que el monito camina dentro del vagón
  }
}


function vagon(c, psX, psY, anch, alt){ //función para crear el vagón
  noStroke();
  fill(c);
  rect(psX,psY,anch,alt); //vagón
  fill(255);
  rect(psX+37.5,psY+32.5, anch-75,alt-65, 10); //ventana


}



function flores(posX, posY, tam, tama, r, c1, c2){ //función para las flores

     push();//creo un push pop para que la rotación se realice en el lugar que quiero. Para eso me ayudará "translate" que trasladará el "x" e "y" originales de cada ellipse a otro punto para hacer la rotación desde ahí.
   translate(posX,posY);//traslado el punto (0,0) a (posX,posY)
   rotate(radians(r));//Transformo los radianes en grados y roto las figuras.
     noStroke(); //para que no tengan borde las figuras
    fill(c1);//rellenar de color 1
    ellipse(32,40,tam-35);
   fill(c2);
   //ellipse(462,176,85, 70,   r);
     ellipse(0  ,0  ,tam,tama, r);//creo la ellipse en 0,0 y de tamaños tam y tama con rotación r
   //ellipse(528,184, 64,78, r+5);
     ellipse(66,8,tam-21,tama+8, r+5);
   //ellipse(535,241,65,50, r);
     ellipse(73,65,tam-20,tama-20, r);
   //ellipse(492,271,64,74, r+23);
     ellipse(30,95,tam-21,tama+4, r+23);
  //ellipse(449, 241,64,80, r-8);
  ellipse(-13, 65,tam-21,tama+10, r-8);
  pop();


}

function randomizar(){ //función para hacer la lluvia de flores
  for(let i=0; i<50; i++){ //variable i para recorrer en filas
    rotaciones[i] = 45+5*i; //rotaciones cambian mediante i al recorrer la lista
    posicionesX[i] = random(0,width);//posiciones en x cambian al azar a lo ancho del canvas mediante i al recorrer la lista
    posicionesY[i] = random(height);//posiciones en y cambian al azar entre 0 y 1080 mediante i al recorrer la lista
    colores[i] =  color(random(255), random(255), random(255));
    tam[i] = random(20, 100);
  }
}

Daniela Masihy Kowoll