Controlar la colisión de un objeto con otro

Siguiendo con las entregas sobre la utilización de la librería processing.js, vamos a implementar las funciones necesarias para que una esfera que rebota sobre los bordes de la pantalla colisione con obejtos dispuestos en la parte superior.

Utilizaremos un array para disponer un conjunto de bloques en pantalla que nos permitirán interactuar con la bola que se desplaza.

//Array de bloques
int[][] bloques = { 
  {50, 50}, {100,50}, {150,50}, {200,50}, {250,50}, {300,50}, {350,50}, {400,50}, {450,50}, {500,50}, {550,50},
  {50, 75}, {100,75}, {150,75}, {200,75}, {250,75}, {300,75}, {350,75}, {400,75}, {450,75}, {500,75}, {550,75},
  {50, 100}, {100,100}, {150,100}, {200,100}, {250,100}, {300,100}, {350,100}, {400,100}, {450,100}, {500,100}, {550,100},
  {50, 125}, {100,125}, {150,125}, {200,125}, {250,125}, {300,125}, {350,125}, {400,125}, {450,125}, {500,125}, {550,125},
  {50, 150}, {100,150}, {150,150}, {200,150}, {250,150}, {300,150}, {350,150}, {400,150}, {450,150}, {500,150}, {550,150}
};

Añadiremos a la funcionalidad básica de rebote, un control para ver si nos encontramos con un objeto antes de llegar al borde de pantalla. Para ello, recorremos el array mediante un while comprobando la posición relativa de la bola y el obstáculo en cuestión.

  contacto=0;
  var i=0;
  var tempx=0;
  var tempy=0;
  while(contacto==0 && i<bloques.length){
    tempx=bloques[i][0];
    tempy=bloques[i][1];
    if ( (ballx <= tempx + tamx_bloques && ballx >= tempx ) && ( bally >= tempy && bally <= tempy + tamy_bloques) ){
      contacto=1;
      bloques = concat( subset(bloques,0,i) , subset(bloques,i+1,bloques.length-i) );
      diry=diry * (-1);
    } 
    i+=1;
  }

En conclusión, hemos sido capaces de implementar la funcionalidad de rebote básico en ángulos de 45 grados sobre los bordes de pantalla y el control de la colisión con objetos dispuestos en la pantalla.

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *