2012-03-09 5 views
6

Sto cercando di implementare il rilevamento continuo di collisioni semplice per il mio gioco pong, tuttavia non sono sicuro che sto implementando o capisco questo diritto. Il rilevamento di collisione continua AFAIR viene utilizzato per oggetti in rapido movimento che possono passare attraverso un altro oggetto che elude il normale rilevamento di collisione.Rilevazione collisione continua 2D

Quindi quello che ho provato è che, poiché l'unico oggetto in movimento veloce che ho è una palla, mi servirebbe solo la posizione della palla, la sua velocità di movimento e la posizione dell'oggetto a cui ci stiamo confrontando.

Da questo ho pensato che sarebbe stato meglio che, ad esempio, se la velocità di movimento della palla indicava che si muoveva a sinistra, la confronterei con il limite più a sinistra sul limite più a destra dell'altro oggetto. Da questo vorrei passare aggiungendo la velocità di movimento al limite più a sinistra della palla e confrontarla per assicurarmi che sia maggiore degli altri oggetti vincolati. Questo mostrerebbe che non c'è collisione sinistra destra.

Ho qualcosa in qualche modo funzionante, ma sfortunatamente, la pallina inizia a rimbalzare normalmente per un po ', poi agisce come se colpisse una pagaia quando non c'è nulla.

Sono un po 'perso, qualsiasi aiuto sarebbe apprezzato!

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; 
    } 
} 

risposta

1

Sembra che tu stia controllando la collisione di una sola dimensione, cioè la dimensione X della tua palla rispetto al tuo Altro.

Quello che probabilmente si vuole è confrontare se i due oggetti si scontrano nello spazio 2d. Questo può essere fatto facilmente regolando ogni rettangolo di Bounding e controllando se i rettangoli si sovrappongono. Quindi nel tuo ciclo for puoi regolare il tuo rettangolo Ball di conseguenza

+0

Oh hai ragione! Ci sto lavorando da troppo tempo. Ho dimenticato l'effetto collaterale di non controllare la dimensione Y. – RedShft