Ho difficoltà a far scontrare un rettangolo mobile con più di un rettangolo.
Sto usando SFML e ha una pratica funzione chiamata intersects
che prende 2 rettangoli e restituisce le intersezioni. Ho un vettore pieno di rettangoli con i quali voglio che il mio rettangolo mobile si scontrasse. Sto facendo un giro di questo usando il seguente codice (p è il rettangolo mobile).
IsCollidingWith
restituisce un bool ma usa anche gli SFML per calcolare intersects
le intersezioni.
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
e il Collide()
codice attuale :
void gameObj::collide( gameObj collidingObject ){
printf("%f %f\n", this->colliderResult.width, this->colliderResult.height);
if (this->colliderResult.width < this->colliderResult.height) {
// collided on X
if (this->getCollider().left < collidingObject.getCollider().left ) {
this->move( -this->colliderResult.width , 0);
}else {
this->move( this->colliderResult.width, 0 );
}
}
if(this->colliderResult.width > this->colliderResult.height){
if (this->getCollider().top < collidingObject.getCollider().top ) {
this->move( 0, -this->colliderResult.height);
}else {
this->move( 0, this->colliderResult.height );
}
}
e il IsCollidingWith()
codice è:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Funziona bene quando c'è solo 1 Rect
nella scena. Tuttavia, quando ce n'è più di uno, Rect
si crea un problema quando si risolvono 2 collisioni contemporaneamente.
Qualche idea su come gestirlo correttamente? Ho caricato un video su YouTube per mostrare il mio problema. La console all'estrema destra mostra la larghezza e l'altezza delle intersezioni. Puoi vedere sulla console che sta provando a calcolare 2 collisioni contemporaneamente, penso che sia qui che si sta causando il problema.
Infine, l'immagine qui sotto sembra illustrare bene il mio problema:
collider
oggetti vengono restituiti this->getCollider()
aggiornati da this->move()
??