¿Cómo detectar colisiones entre sprite y una forma generada por el usuario de algún tipo?


9

Cómo detectar una colisión entre un sprite y una forma generada por el usuario de algún tipo.

Por ejemplo. Hay algunos objetos en la pantalla. El usuario toma su dedo y dibuja una forma circular alrededor de un objeto (la regla de selección es pintar un círculo alrededor del sprite, pero las formas de pintura pueden ser diferentes). Necesito detectar qué objeto seleccionado, que al igual que:

(imágenes de demostración): publicado originalmente como http://i52.tinypic.com/28h0t1g.png


¿Puede explicar por qué se selecciona azul y no rojo en su ejemplo final? ¿Puedes también aclarar si la línea realmente tiene que tocar el sprite? El tercer ejemplo no toca el cuadro rojo pero se indica como seleccionado. El quinto ejemplo es muy similar pero no está seleccionado. ¿Cuál es la diferencia que estás buscando entre # 3 y # 5?
Romen

Respuestas:


2

Si la forma se dibuja principalmente con segmentos de línea del usuario (o curvas de Bezier con puntos de control), puede implementar un algoritmo bastante utilizado conocido como Teorema del eje de separación . En pocas palabras: si hay un eje (unidad-vector que representa una dirección) en el que las formas no se superponen (sus valores proyectados no resultan en una diferencia positiva), los objetos no se superponen. He usado esto en el pasado y ha funcionado a las mil maravillas.



0
  • Cree un búfer del mismo tamaño que la pantalla (o superficie donde están sus formas). En cada posición contiene boolean si hay sprite; luego, verifique todos los "píxeles" de la forma del usuario si en su posición está el sprite (verificando el valor de ese booleano). Alternativamente, puede crear más sprites allí almacenando su ID en lugar de boolean; pero este fue el caso de 1 sprite.
  • Si la forma generada por el usuario puede ser representada por una secuencia de líneas, entonces puede verificar si cada línea cruza el sprite. Dado que el sprite tiene forma rectangular y la forma del usuario es una línea, solo busque la "intersección del rectángulo de la línea" ... (el algoritmo de separación de ejes es una forma de hacerlo)

Los enfoques dependen de las estructuras de datos que elija, ya sean mapas de bits o vectores.

El primer enfoque puede manejar formas complejas arbitrarias, es simple de implementar pero usa más memoria. En realidad, puede reducir la sobrecarga de memoria mediante la compresión y acelerarla mediante el uso de estructuras de datos jerárquicos (octrees) ...

El segundo enfoque, no es tan simple de implementar, pero utiliza más potencia de procesamiento.

En cada caso, mida si es importante. Intentaría hacer el primero porque es más sencillo de implementar. Buena suerte. :)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.