У мене виникають труднощі з рухомим прямокутником для зіткнення з більш ніж одним прямокутником.
Я використовую SFML, і він має зручну функцію, intersects
яка називається, яка займає 2 прямокутника і повертає перехрестя. У мене вектор повний прямокутників, з яким я хочу, щоб мій рухливий прямокутник стикався. Я переглядаю це за допомогою наступного коду (p - прямокутник, що рухається).
IsCollidingWith
повертає bool, але також використовує SFML intersects
для опрацювання перехресть.
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
і фактичний Collide()
код:
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 );
}
}
і IsCollidingWith()
код:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Це добре працює, коли Rect
на сцені лише 1 . Однак, коли їх більше, Rect
це спричиняє проблеми при розробці двох зіткнень одночасно.
Будь-яка ідея, як правильно з цим боротися? Я завантажив у youtube відео, щоб показати свою проблему. Консоль праворуч показує ширину та висоту перехресть. Ви можете побачити на консолі, що вона намагається обчислити 2 зіткнення одразу, я думаю, саме тут і виникає проблема.
Нарешті, подане нижче зображення наче добре ілюструє мою проблему:
collider
повертаються об'єкти this->getCollider()
оновленими this->move()
??