2010-07-07 25 views
6

Antes que nada, mi pregunta no es realmente específica para C# o XNA, pero mis ejemplos de código los usarán.Detectar colisión entre un objeto en movimiento y uno inmóvil

Actualmente estoy tratando de hacer un clon de Pong y me he encontrado con un problema de detección de colisión.

Cada objeto tiene una Velocidad específica (que es un Vector2), Posición (Vector2, también) y Velocidad (solo un flotador). En cada llamada a Update() del objeto, la posición se cambia de esta manera:

Velocity.Normalize(); 
Position += Velocity * Speed; 

Al principio, sólo comprobado si había actualmente una colisión entre dos objetos con un simple Intersects() llamada de los rectángulos de los objetos. Rápidamente me di cuenta de que no solo podía comprobar si el objeto era actualmente colisionando con otro, sino que si el objeto colisionó con un objeto en camino. Solo verificando si dos objetos colisionaban hacía que la pelota atravesara la paleta cuando la velocidad era demasiado alta.

Intenté cosas diferentes para solucionar el problema, pero ninguno de ellos pareció funcionar. Solo necesito una forma de verificar si dos objetos colisionaron en su camino, y si lo hicieron, si fue desde el horizontal, vertical o ambos (para cambiar la velocidad de la bola en consecuencia).

No necesariamente quiero la solución de inmediato, tal vez solo la idea básica de cómo implementar esto, y la codificaré yo mismo.

Gracias por su tiempo.

Respuesta

0

Si dos objetos de punto tienen la misma posición, entonces han colisionado.

+0

No creo que sea así de simple. Muy pocos gráficos tienen el tamaño de solo un punto. – Adkins

+0

Si dos objetos del círculo están dentro de la suma de sus radios, entonces han colisionado. – mcandre

+0

En realidad estoy buscando una solución para si dos objetos con un cierto ancho y altura colisionaron durante su llamada a Update(). –

2

Creo que este enlace: http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php podría ser lo que estás buscando. Describe la prueba de barrido del plano esférico, útil para cuando tienes objetos en movimiento rápido que pueden pasar por un plano dentro de un intervalo de un cuadro.

También le proporciona el punto de intersección, que puede usar para reflejar su trayectoria sobre el plano normal y continuar la ruta del objeto.

+0

Gracias por el enlace. –

1

Tiene un problema con el hecho de que si un objeto es demasiado rápido, puede pasar el objeto inmóvil antes de llamar a Update() con la detección (como si pasara por el objeto inmóvil).

Extender la forma del objeto a lo largo del vector movimiento con el tamaño de velocidad: Square [0,0][2,2] con velocidad [1,0] y la velocidad de 10 se creará una forma de rectángulo [0,0][12,2] => ahora se coloca en coords [0,0] con tamaño [12,2].

Ahora intersecó el rectángulo con el objeto inmóvil. Ahora sabes si colisionaron.

Cuestiones relacionadas