2012-03-09 18 views
6

Estoy tratando de implementar la detección de colisión continua simple para mi juego de pong, sin embargo, no estoy seguro de que estoy implementando o entiendo este derecho. La detección de colisión continua AFAIR se utiliza para objetos de movimiento rápido que pueden pasar a través de otro objeto evitando la detección de colisión normal.2D Detección de colisión continua

Así que lo que probé fue que debido a que el único objeto de movimiento rápido que tengo es una bola, solo necesitaría la posición de la bola, su velocidad de movimiento y la posición del objeto con el que estamos comparando.

De esto pensé que sería mejor que, por ejemplo, si la velocidad de movimiento de la bola indicara que se estaba moviendo hacia la izquierda, compararía la que está más a la izquierda con el límite derecho del otro objeto. A partir de esto, lo haré agregando la velocidad de movimiento al límite más a la izquierda del balón y compáralo para asegurarme de que sea más grande que el resto de los objetos encuadernados. Esto mostraría que no hay colisión a la izquierda.

Tengo algo que funciona un poco, pero desafortunadamente, la pelota comienza a rebotar normalmente por un tiempo y luego actúa como si golpeara una paleta cuando no hay nada.

Estoy un poco perdido, ¡cualquier ayuda sería apreciada!

static bool CheckContinuousCollision(PActor ball, PRect ballRect, PActor other, PRect otherRect) 
{ 
    PVector ballMoveSpeed; 
    int ballXLimit; 
    int ballYLimit; 

    ballMoveSpeed = ball.moveSpeed; 

    // We are moving left 
    if (sgn(ball.moveSpeed.x) < 0) 
    { 
     ballXLimit = std.math.abs(ballMoveSpeed.x)/2; 

     for (int i = 0; i <= ballXLimit; i++) 
     { 

       if (ballRect.Left < otherRect.Right && otherRect.Left < ballRect.Left) 
      { 
       return true; 
      } 

      ballRect.Left -= i; 
     } 
    } 

      //We are moving right 
    if (sgn(ball.moveSpeed.x) > 0) 
    { 
     ballXLimit = std.math.abs(ballMoveSpeed.x)/2; 

     for (int i = 0; i < ballXLimit; i ++) 
     { 

      if (ballRect.Right > otherRect.Left && ballRect.Right < otherRect.Right) 
      { 
       return true; 
      } 

      ballRect.Right += i; 
     } 
    } 
      // we are not moving 
    if (sgn(ball.moveSpeed.x) == 0) 
    { 
     return false; 
    } 
} 

Respuesta

1

Parece que está comprobando la colisión de una sola dimensión, es decir, la dimensión X de su bola contra su Otra.

Lo que probablemente quiera es comparar si los dos objetos colisionan en el espacio 2d. Esto se puede hacer fácilmente ajustando cada rectángulo delimitador de objetos y verificando si los rectángulos se superponen. Luego, en su bucle for puede ajustar su rectángulo de bolas según corresponda

+0

¡Ah, tiene razón! He estado trabajando en esto por mucho tiempo. Olvidé el efecto secundario de no verificar la dimensión Y. – RedShft

Cuestiones relacionadas