Estou tendo dificuldades em obter um retângulo móvel para colidir com mais de um retângulo.
Estou usando SFML e tem uma função útil chamada intersectsque leva 2 retângulos e retorna as interseções. Eu tenho um vetor cheio de retângulos que eu quero que meu retângulo móvel colide. Estou percorrendo isso usando o seguinte código (p é o retângulo móvel).
IsCollidingWithretorna um bool, mas também usa SFML intersectspara calcular as interseções.
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
e o Collide()código real :
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 o IsCollidingWith()código é:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Isso funciona bem quando há apenas 1 Rectna cena. No entanto, quando há mais de um Rect, causa um problema ao resolver duas colisões de uma só vez.
Alguma idéia de como lidar com isso corretamente? Fiz upload de um vídeo no youtube para mostrar meu problema. O console na extrema direita mostra a largura e a altura das interseções. Você pode ver no console que está tentando calcular duas colisões de uma só vez, acho que é aqui que o problema está sendo causado.
Finalmente, a imagem abaixo parece ilustrar bem o meu problema:

colliderobjetos retornados são this->getCollider()atualizados por this->move()??