NightFox

Pixel Perfect Collision Function

Feb 16th, 2013
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Funcion de colision por pixeles (Perfect Pixel Collision)
  2.         // Basado en el ejemplo de Mike Chambers
  3.         // http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/
  4.         public function PixelCollisionComplex(objectA:DisplayObject, objectB:DisplayObject, aX:Number, aY:Number):Boolean {
  5.             // objectA: Objecto A para la colision
  6.             // objectB: Objecto B para la colision
  7.             // aX: Factor de ajuste sobre el eje X en caso de colision (Antencion!!! se ajusta la posicion del objeto A)
  8.             // aY: Factor de ajuste sobre el eje Y en caso de colision (Antencion!!! se ajusta la posicion del objeto A)
  9.             // Devuelve: TRUE si se solapa algun Pixel del Objecto A con algun Pixel del Objeto B
  10.            
  11.             // Guarda la info de los objetos a analizar (Objeto A)
  12.             var rectA:Rectangle = objectA.getBounds(objectA.root);  // Info del contenedor del Objeto A
  13.             var offsetA:Matrix = objectA.transform.matrix;  // Guarda la info de la transformada del Objeto A
  14.             offsetA.tx = (objectA.x - rectA.x);     // Calcula la X de la transformada
  15.             offsetA.ty = (objectA.y - rectA.y);     // Calcula la Y de la transformada
  16.            
  17.             // Guarda la info del mapa de bits de los objetos (Objeto A)
  18.             var bmpDataA = new BitmapData(rectA.width, rectA.height, true, 0);  // Crea un Bitmap vacio de la medida del objeto (Transparente, color de relleno 0)
  19.             bmpDataA.draw(objectA, offsetA);    // Dibuja el shape del objeto A en el Bitmap vacio
  20.            
  21.             // Guarda la info de los objetos a analizar (Objeto B)
  22.             var rectB:Rectangle = objectB.getBounds(objectB.root);  // Info del contenedor del Objeto B
  23.             var offsetB:Matrix = objectB.transform.matrix;  // Guarda la info de la transformada del Objeto B
  24.             offsetB.tx = (objectB.x - rectB.x);     // Calcula la X de la transformada
  25.             offsetB.ty = (objectB.y - rectB.y);     // Calcula la Y de la transformada
  26.            
  27.             // Guarda la info del mapa de bits de los objetos (Objeto B)
  28.             var bmpDataB = new BitmapData(rectB.width, rectB.height, true, 0);  // Crea un Bitmap vacio de la medida del objeto (Transparente, color de relleno 0)
  29.             bmpDataB.draw(objectB, offsetB);    // Dibuja el shape del objeto B en el Bitmap vacio
  30.            
  31.             // Calcula los vertices de posicion de ambos objetos
  32.             var posA:Point = new Point(rectA.x, rectA.y);
  33.             var posB:Point = new Point(rectB.x, rectB.y);
  34.            
  35.             // Para finalizar, haz un hitTest entre los dos objetos y verifica si alguno de los pixeles visibles se solapan
  36.             if (bmpDataB.hitTest(posB, 255, bmpDataA, posA, 255)) {
  37.                 // Si hay colision y el Autoajuste esta activado...
  38.                 if ((aX != 0) || (aY != 0)) {
  39.                     // Repite mientras se solape algun pixel...
  40.                     do {
  41.                         // Desplaza el objeto A a su nueva posicion de autoajuste
  42.                         objectA.x += aX;
  43.                         objectA.y += aY;
  44.                         // Recalcula la matriz de posicion del objeto A
  45.                         rectA = objectA.getBounds(objectA.root);    // Info del contenedor del Objeto A
  46.                         offsetA = objectA.transform.matrix;         // Guarda la info de la transformada del Objeto A
  47.                         offsetA.tx = (objectA.x - rectA.x);         // Calcula la X de la transformada
  48.                         offsetA.ty = (objectA.y - rectA.y);         // Calcula la Y de la transformada
  49.                         bmpDataA.draw(objectA, offsetA);            // Actualiza el Shape
  50.                         // Calcula los vertices de posicion de ambos objetos
  51.                         posA = new Point(rectA.x, rectA.y);
  52.                         posB = new Point(rectB.x, rectB.y);
  53.                     } while (bmpDataB.hitTest(posB, 255, bmpDataA, posA, 255));
  54.                     // Devuelve TRUE
  55.                     return true;
  56.                 } else {
  57.                     // Si se han tocado, devuelve TRUE
  58.                     return true;
  59.                 }
  60.             } else {
  61.                 // SI no se tocan, devuelve FALSE
  62.                 return false;
  63.             }
  64.            
  65.         }
Advertisement
Add Comment
Please, Sign In to add comment