Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Funcion de colision por pixeles (Perfect Pixel Collision)
- // Basado en el ejemplo de Mike Chambers
- // http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/
- public function PixelCollisionComplex(objectA:DisplayObject, objectB:DisplayObject, aX:Number, aY:Number):Boolean {
- // objectA: Objecto A para la colision
- // objectB: Objecto B para la colision
- // aX: Factor de ajuste sobre el eje X en caso de colision (Antencion!!! se ajusta la posicion del objeto A)
- // aY: Factor de ajuste sobre el eje Y en caso de colision (Antencion!!! se ajusta la posicion del objeto A)
- // Devuelve: TRUE si se solapa algun Pixel del Objecto A con algun Pixel del Objeto B
- // Guarda la info de los objetos a analizar (Objeto A)
- var rectA:Rectangle = objectA.getBounds(objectA.root); // Info del contenedor del Objeto A
- var offsetA:Matrix = objectA.transform.matrix; // Guarda la info de la transformada del Objeto A
- offsetA.tx = (objectA.x - rectA.x); // Calcula la X de la transformada
- offsetA.ty = (objectA.y - rectA.y); // Calcula la Y de la transformada
- // Guarda la info del mapa de bits de los objetos (Objeto A)
- var bmpDataA = new BitmapData(rectA.width, rectA.height, true, 0); // Crea un Bitmap vacio de la medida del objeto (Transparente, color de relleno 0)
- bmpDataA.draw(objectA, offsetA); // Dibuja el shape del objeto A en el Bitmap vacio
- // Guarda la info de los objetos a analizar (Objeto B)
- var rectB:Rectangle = objectB.getBounds(objectB.root); // Info del contenedor del Objeto B
- var offsetB:Matrix = objectB.transform.matrix; // Guarda la info de la transformada del Objeto B
- offsetB.tx = (objectB.x - rectB.x); // Calcula la X de la transformada
- offsetB.ty = (objectB.y - rectB.y); // Calcula la Y de la transformada
- // Guarda la info del mapa de bits de los objetos (Objeto B)
- var bmpDataB = new BitmapData(rectB.width, rectB.height, true, 0); // Crea un Bitmap vacio de la medida del objeto (Transparente, color de relleno 0)
- bmpDataB.draw(objectB, offsetB); // Dibuja el shape del objeto B en el Bitmap vacio
- // Calcula los vertices de posicion de ambos objetos
- var posA:Point = new Point(rectA.x, rectA.y);
- var posB:Point = new Point(rectB.x, rectB.y);
- // Para finalizar, haz un hitTest entre los dos objetos y verifica si alguno de los pixeles visibles se solapan
- if (bmpDataB.hitTest(posB, 255, bmpDataA, posA, 255)) {
- // Si hay colision y el Autoajuste esta activado...
- if ((aX != 0) || (aY != 0)) {
- // Repite mientras se solape algun pixel...
- do {
- // Desplaza el objeto A a su nueva posicion de autoajuste
- objectA.x += aX;
- objectA.y += aY;
- // Recalcula la matriz de posicion del objeto A
- rectA = objectA.getBounds(objectA.root); // Info del contenedor del Objeto A
- offsetA = objectA.transform.matrix; // Guarda la info de la transformada del Objeto A
- offsetA.tx = (objectA.x - rectA.x); // Calcula la X de la transformada
- offsetA.ty = (objectA.y - rectA.y); // Calcula la Y de la transformada
- bmpDataA.draw(objectA, offsetA); // Actualiza el Shape
- // Calcula los vertices de posicion de ambos objetos
- posA = new Point(rectA.x, rectA.y);
- posB = new Point(rectB.x, rectB.y);
- } while (bmpDataB.hitTest(posB, 255, bmpDataA, posA, 255));
- // Devuelve TRUE
- return true;
- } else {
- // Si se han tocado, devuelve TRUE
- return true;
- }
- } else {
- // SI no se tocan, devuelve FALSE
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment