이동 가능한 사각형을 두 개 이상의 사각형과 충돌시키는 데 어려움이 있습니다.
SFML을 사용 하고 있으며 intersects
2 개의 직사각형을 사용하여 교차점을 반환 하는 편리한 함수가 있습니다. 직사각형으로 가득 찬 벡터가 있는데 움직일 수있는 직사각형이 충돌하기를 원합니다. 다음 코드를 사용 하여이 과정을 반복하고 있습니다 (p는 이동 가능한 사각형입니다).
IsCollidingWith
부울을 반환하지만 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
이 있으면 한 번에 2 개의 충돌을 해결할 때 문제가 발생합니다.
이것을 올바르게 처리하는 방법에 대한 아이디어가 있습니까? 내 문제를 보여주기 위해 YouTube 에 비디오를 업로드 했습니다 . 가장 오른쪽의 콘솔은 교차점의 너비와 높이를 보여줍니다. 콘솔에서 한 번에 2 개의 충돌을 계산하려고한다는 것을 알 수 있습니다. 문제가 발생한 곳이라고 생각합니다.
마지막으로 아래 이미지는 내 문제를 훌륭하게 보여줍니다.
collider
에 의해 반환 된 객체 this->getCollider()
에 의해 갱신은 this->move()
?