У меня трудности с получением подвижного прямоугольника, который сталкивается с несколькими прямоугольниками.
Я использую 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()