Actionscript 3.0: Colisiones a nivel de pixel

Etiquetas: complexIntersectionRectangle hitTestObject

La función hitTestObject(obj:DisplayObject) evalúa un objeto para comprobar si choca con el objeto obj. Por ejemplo, si tenemos dos objetos "Item1_mc" e "Item2_mc", podemos comprobar si chocan con:

  1.  
  2. Item1_mc.hitTestObject(Item2_mc)
  3.  

Esta función, tiene el inconveniente de que comprueba los choques entre los contenedores rectangulares de los objetos. Por ejemplo:

Colisiones en FLash

por tanto, sin queremos comprobar las colisiones entre dos objetos no rectangulares, puede devolver valores que aparentemente no son correctos. Aquí tenemos un ejemplo en Flash:

Si queremos utilizar colisiones a nivel de pixel, podemos crear un objeto bitmapData, superponer los dos objetos en el objeto bitmapData con un filtro de color cada uno, y comprobar si hay pixels que tienen el color de la combinación de filtros utilizados. En el blog de tink , podemos descargar una clase que nos ahorra todo este proceso y utilizar directamente métodos que nos devuelven true o false como resultado de la colisión. Por ejemplo, si queremos comprobar la colisión a nivel de pixel entre los dos objetos del ejemplo anterior, pondríamos:

  1.  
  2. HitTest.complexHitTestObject(Item1_mc,Item2_mc)
  3.  

Y si queremos recibir el rectángulo de colisión:

  1.  
  2. var rect:Rectangle = HitTest.complexIntersectionRectangle(Item1_mc,Item2_mc);
  3.  

El resultado, sería este:

Los fuentes, y la clase HitTest de tink, tras el salto.

Comentarios:
Dirty Sanchez dijo:
uis, ésto me viene muy bien! Thnx
Kano dijo:
¡MAGNÍFICO! ¡Por fin alguien lo ha hecho! Y los de Adobe a lo suyo...
Iván dijo:
Moolaaa... La clase rectangle es super interesante
ricardo dijo:
me parese muy interesante pero quisiera saber como hacer para que 2 objetos choquen.. es decir, como si intentaras juntar el objeto verde con el azul y no se pudiera.. gracias
nestor vidales dijo:
hola.. gracias por el tuto esta bueno.. pero tengo una preg .. hice un juego tipo laberinto y le puse esta linea de codigo: onClipEvent (load) { power = 3; radius = 12; _x = 35; _y = 40; } esto sobre el personaje.. cuando el pega sobre el muro se detiene: while (_root.wall.hitTest(_x, _y+radius, true)) { _y--; } y le puse una puerta con una preg q debe responder y se detiene bajando el power a 0.. f (_root.door01.hitTest(_x, _y, true)) { power = 0; this._parent.preg01._visible = true; pero el problema q tengo es q cuando responde la preg.. se abre la puerta.. pero no logro q el siga avnazando el se queda quieto.. este es el as del frame donde va cuando responde correctamente: stop(); acierto01(); this.hero. power = 3; agradezco una ayuda para una orientacion respecto a q estoy haciendo mal u omitiendo... gracias--
Silva Developer dijo:
Nice example. Thanks for your contribution with us. Best regards, Silva Developer silva.developer@gmail.com
andres dijo:
muy bueno este tutoria no me salio, porque recien estoy empezando pero quisiaera aprender mas sobre actionscrtip 3.0 y...... como hacer para q 2 o mas objetos chocen entre si sin atravesarse, u otra cosa que me puedan enseñar muchisimas gracias..... ??
juan dijo:
ke chido esta el programa
JAVIER dijo:
muy bueno excelente
Dejar un comentario:
Tu nombre (obligatorio):

E-mail (obligatorio, no se mostrará):

Web: