El método MovieClip.hitTest sólo permite detectar colisiones en los rectángulos de delimitación de los MovieClips. Cuando se quieren detectar colisiones con MovieClips de formas o bordes no cuadrados, se suele pensar que la única manera es usar complejas fórmulas matamáticas, aunque esto no sea viable para nosotros (Porque hay que saber muchísimas matemáticas o porque tumbaríamos el player con las operaciones).
Hay una manera alternativa de detectar colisiones que si bién no es 100% exacta, da la precisión suficiente para, por ejemplo, juegos. Como es una de esas cosas que se utilizan mucho, es altamente recomendable ponerla en un archivo .as e importarla con un #include (En mi caso pondré el siguiente código en un archivo llamado "colision.as")
Código :
function checkHit(a:MovieClip, b:MovieClip) { with (a) { if (b.hitTest(getBounds(_root).xMax, _y, true)) { return "left"; } else if (b.hitTest(getBounds(_root).xMin, _y, true)) { return "right"; } else if (b.hitTest(_x, getBounds(_root).yMax, true)) { return "up"; } else if (b.hitTest(_x, getBounds(_root).yMin, true)) { return "down"; } else { return false; } } }
Esta función retorna el lado por el que han colisionado o false si no se tocan. Si sólo quieren saber si hay colisión, usen if(checkHit(a,b)!=false){...}
Analizando el código por un instante verás que el clip "a" tiene que ser el que se mueve y más pequeño. El otro, b, será la pared.
Ahora, para probarlo, creen dos clips de cualquier forma, con nombres de instancia f1 y f2 y un campo de texto llamado txt
Código :
#include "colision.as" f1.startDrag(true); this.onEnterFrame = function() { txt.text = checkHit(f1, f2); };Verán como en el campo de texto vemos, sin problemas, el momento en el que f1 colisiona con f2.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Gracias!
Por Marc Palau el 07 de Septiembre de 2006
Gracias.. habrá que adoptarlo
Por Pepito el 07 de Septiembre de 2006
http://www.teagames.com/games
Solo hay q probar este juego:
http://www.teagames.com/games/blueprint/play.php
Por Alan Shaw el 08 de Septiembre de 2006
http://www.gskinner.com/blog/archives/2005/10/source_code_sha.html
Por Gerardo el 09 de Septiembre de 2006
Por cam el 06 de Diciembre de 2006
Si quiero poner la funcion dentro de un clip tengo que cambiar la ruta esta?
cam_blog :
Si quiero poner la funcion dentro de un clip tengo que cambiar la ruta esta?
Sí, pero ten en cuenta que sólo podrás detectar la colisión de los clips hijos de ese otro clip. Si no es muy necesario, mejor no lo hagas.
Por Taytus el 18 de Enero de 2007
Gracias.
Salu2.
Por el 18 de Enero de 2007
En una función o clase:
Asociar a cada MC u objeto un rectangle de sus dimensiones.
Usar rectangle.intersection para determinar si hay un rectángulo común que es lo que devuelve.
si = 0 (empty) salimos fuera
Si hay rectangulo: copiar esa zona ( tomando los datos del rectángulo respuesta de ambos mc con un draw de ese rectángulo en un bitmap que creamos temporal mediante dos threshold de transparencia y add en el segundo draw.
los 2 threshold darán un resultado numérico cada uno que se suma.
Al temporal un threshold nuevo también de zona transparente. Su valor se compara con la suma anterior.
Si son distintos: hay colisión.
Si son iguales.....todavía no hay colisión pero puede faltar poco. Recordemos que el rectángulo no es vacio.
De aquí podríamos tomar sus bounds y si el movimiento esta en ese vector (esquina de uno menos esquina del otro) ...pronto chocarán ( útil para movimientos de IA)
Como el rectángulo será siempre muy pequeño ( o empty) lo ejecutará muy rápido.
Si el objeto está girado o escalado no importa, el draw se hace con el objeto transformado.
Uffffff......Creo que hubiera tardado menos en hacerlo que en explicarlo.
http://www.gskinner.com/blog/archives/2005/10/source_code_sha.html
Muy similar a mi idea, aunque ese juego loco al inicio para buscar bounds mínimos yo lo simplifico con el uso de la clase rectangle que él no emplea para nada.
El no hace rectangle.intersections , llama así a una de sus variables al final.
Usa transformación de color, muchísimo más lenta que threshold y no podemos usar su respuesta numérica.
Lo que es idéntico es el concepto, pero mi forma es bastante mejor. Y en multidetecciones, muchísimo (más que muchísimo
Y lo más diferente: Mi forma permite el añadir una función de detección anticipada directamente devolviendo el vector de colisión, pero en su sistema tendría que hacer 2 llamadas y cálculo posterior o externo.
Teseo :
Justo eso me molestaba de esa clase para mi jueguecito de la webcam. Así que sí sería muy útil
Yo intento detectar no SOLO si hay colisión entre 2 objetos sino detectar TODAS las posibles colisiones entre MC`s en escena con una sola llamada a la función. Puede hacerse un array al return de objetos que colisionan o colisionarán y sus puntos de impacto.
Por Alex el 01 de Junio de 2007
se que es mucho trabajo pero esque yo no se ni como importar un archovo .as
si alguno de vosotros me lo pudiera explicar se lo agradeciria de todo corazon
o como se llame el archivo
Por Alex el 02 de Junio de 2007
Prueba_raton.rar
Muchas gracias de antemano
link editado.MX
Por Alex el 02 de Junio de 2007
Alex_blog :
link arreglado
Por Alex el 08 de Junio de 2007