Tôi gặp khó khăn khi có một hình chữ nhật có thể di chuyển để va chạm với nhiều hơn một hình chữ nhật.
Tôi đang sử dụng SFML và nó có một chức năng tiện dụng được gọi là intersects
có 2 hình chữ nhật và trả về các giao điểm. Tôi có một vectơ đầy hình chữ nhật mà tôi muốn hình chữ nhật có thể di chuyển của mình va chạm với. Tôi đang lặp lại điều này bằng cách sử dụng đoạn mã sau (p là hình chữ nhật di chuyển).
IsCollidingWith
trả về một bool nhưng cũng sử dụng SFML intersects
để xử lý các giao điểm.
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
và Collide()
mã thực tế :
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 );
}
}
và IsCollidingWith()
mã là:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Điều này hoạt động tốt khi chỉ có 1 Rect
trong cảnh. Tuy nhiên, khi có nhiều hơn một, Rect
nó gây ra sự cố khi xử lý 2 va chạm cùng một lúc.
Bất kỳ ý tưởng làm thế nào để đối phó với điều này một cách chính xác? Tôi đã tải lên một video lên youtube để hiển thị vấn đề của tôi. Bảng điều khiển ở phía bên phải hiển thị chiều rộng và chiều cao của các giao lộ. Bạn có thể thấy trên bảng điều khiển đang cố gắng tính toán 2 va chạm cùng một lúc, tôi nghĩ đây là vấn đề đang được gây ra.
Cuối cùng, hình ảnh dưới đây dường như minh họa vấn đề của tôi độc đáo:
collider
đối tượng trả về bởi this->getCollider()
cập nhật bởi this->move()
??