Mam trudności z uzyskaniem ruchomego prostokąta, który mógłby zderzyć się z więcej niż jednym prostokątem.
Używam SFML i ma przydatną funkcję o nazwie, intersects
która bierze 2 prostokąty i zwraca przecięcia. Mam wektor pełen prostokątów, z którym chcę, aby mój ruchomy prostokąt kolidował. Pętlę przez to za pomocą następującego kodu (p jest ruchomym prostokątem).
IsCollidingWith
zwraca bool, ale także używa SFML intersects
do opracowania skrzyżowań.
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
i rzeczywisty Collide()
kod:
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 );
}
}
a IsCollidingWith()
kod to:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Działa to dobrze, gdy Rect
na scenie jest tylko 1 . Jednak, gdy jest ich więcej niż jeden Rect
, powoduje to problem podczas opracowywania 2 kolizji jednocześnie.
Masz pomysł, jak sobie z tym poradzić? Przesłałem film na YouTube, aby pokazać mój problem. Konsola po prawej stronie pokazuje szerokość i wysokość skrzyżowań. Na konsoli widać, że próbuje obliczyć 2 kolizje naraz. Myślę, że właśnie tutaj powstaje problem.
Wreszcie poniższy obraz wydaje się dobrze ilustrować mój problem:
collider
obiekty są zwracane przez this->getCollider()
zaktualizowane przez this->move()
?