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;
}
}
Oh hai ragione! Ci sto lavorando da troppo tempo. Ho dimenticato l'effetto collaterale di non controllare la dimensione Y. – RedShft