Ich habe Schwierigkeiten, ein bewegliches Rechteck dazu zu bringen, mit mehr als einem Rechteck zu kollidieren.
Ich verwende SFML und es hat eine praktische Funktion namens, intersects
die 2 Rechtecke nimmt und die Schnittpunkte zurückgibt. Ich habe einen Vektor voller Rechtecke, mit dem mein bewegliches Rechteck kollidieren soll. Ich durchlaufe dies mit dem folgenden Code (p ist das bewegliche Rechteck).
IsCollidingWith
Gibt einen Bool zurück, verwendet aber auch SFMLs intersects
, um die Schnittpunkte zu ermitteln.
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
und der eigentliche Collide()
Code:
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 );
}
}
und der IsCollidingWith()
Code ist:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Dies funktioniert gut, wenn nur 1 Rect
in der Szene ist. Wenn es jedoch mehr als eine gibt Rect
, verursacht dies ein Problem, wenn zwei Kollisionen gleichzeitig berechnet werden.
Irgendeine Idee, wie man damit richtig umgeht? Ich habe ein Video auf YouTube hochgeladen , um mein Problem zu zeigen. Die Konsole ganz rechts zeigt die Breite und Höhe der Kreuzungen. Sie können auf der Konsole sehen, dass versucht wird, 2 Kollisionen gleichzeitig zu berechnen. Ich denke, hier wird das Problem verursacht.
Schließlich scheint das Bild unten mein Problem gut zu veranschaulichen:
collider
Objekte von this->getCollider()
aktualisiert this->move()
?