Tengo dificultades para hacer que un rectángulo móvil choque con más de un rectángulo.
Estoy usando SFML y tiene una función útil llamada intersects
que toma 2 rectángulos y devuelve las intersecciones. Tengo un vector lleno de rectángulos con los que quiero que choque mi rectángulo móvil. Estoy recorriendo esto usando el siguiente código (p es el rectángulo móvil).
IsCollidingWith
devuelve un bool pero también usa SFML intersects
para resolver las intersecciones.
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
y el 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 );
}
}
y el IsCollidingWith()
código es:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Esto funciona bien cuando solo hay 1 Rect
en la escena. Sin embargo, cuando hay más de uno Rect
, causa un problema al resolver 2 colisiones a la vez.
¿Alguna idea de cómo lidiar con esto correctamente? He subido un video a youtube para mostrar mi problema. La consola en el extremo derecho muestra el ancho y la altura de las intersecciones. Puede ver en la consola que está tratando de calcular 2 colisiones a la vez, creo que aquí es donde se está causando el problema.
Finalmente, la imagen a continuación parece ilustrar muy bien mi problema:
collider
objetos devueltos por this->getCollider()
actualizados por this->move()
??