ฉันมีปัญหาในการรับสี่เหลี่ยมที่เคลื่อนย้ายได้เพื่อชนกับสี่เหลี่ยมมากกว่าหนึ่ง
ฉันกำลังใช้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;
}
ใช้งานได้ดีเมื่อมีเพียง 1 Rect
ในฉาก อย่างไรก็ตามเมื่อมีมากกว่าหนึ่งรายการRect
จะทำให้เกิดปัญหาเมื่อแก้ไข 2 การชนในครั้งเดียว
มีความคิดวิธีจัดการกับสิ่งนี้อย่างถูกต้องหรือไม่? ฉันได้อัปโหลดวิดีโอไปยัง youtubeเพื่อแสดงปัญหาของฉัน คอนโซลทางด้านขวาสุดแสดงความกว้างและความสูงของทางแยก คุณสามารถเห็นบนคอนโซลที่พยายามคำนวณการชนกัน 2 ครั้งพร้อมกันฉันคิดว่านี่เป็นสาเหตุที่ทำให้เกิดปัญหา
ในที่สุดภาพด้านล่างดูเหมือนจะอธิบายปัญหาของฉันได้ดี:
collider
วัตถุที่ส่งกลับโดยthis->getCollider()
การปรับปรุงโดยthis->move()
??