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 intersects
que 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).
IsCollidingWith
retorna um bool, mas também usa SFML intersects
para 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 Rect
na 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:
collider
objetos retornados são this->getCollider()
atualizados por this->move()
??