Birden fazla dikdörtgenle çarpışmak için hareketli bir dikdörtgen almakta zorlanıyorum.
SFML kullanıyorum ve intersects
2 dikdörtgen alır ve kavşakları döndüren adlı kullanışlı bir işlevi vardır . Hareketli dikdörtgenin çarpışmasını istediğim dikdörtgenlerle dolu bir vektörüm var. Aşağıdaki kod (p hareket ettirilebilir dikdörtgen) kullanarak bu döngü.
IsCollidingWith
bir bool döndürür ancak intersects
kavşakları çözmek için SFML kullanır .
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
ve gerçek Collide()
kod:
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 );
}
}
ve IsCollidingWith()
kod:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Rect
Sahnede sadece 1 olduğunda bu işe yarar. Ancak, birden fazla Rect
olduğunda aynı anda 2 çarpışma yaparken soruna neden olur.
Bununla nasıl başa çıkılacağı hakkında bir fikrin var mı? Sorunumu göstermek için youtube'a bir video yükledim . En sağdaki konsol kavşakların genişliğini ve yüksekliğini gösterir. Konsolda aynı anda 2 çarpışmayı hesaplamaya çalıştığını görebilirsiniz, bence bu da sorunun neden olduğu yer.
Son olarak, aşağıdaki görüntü sorunumu güzel bir şekilde gösteriyor:
collider
Tarafından döndürülen nesneler ?? tarafından this->getCollider()
güncellendi mi this->move()
?