Saya mengalami kesulitan mendapatkan persegi panjang yang dapat dipindahkan untuk bertabrakan dengan lebih dari satu persegi panjang.
Saya menggunakan SFML dan memiliki fungsi praktis yang disebut intersects
yang mengambil 2 persegi panjang dan mengembalikan persimpangan. Saya memiliki vektor penuh persegi panjang yang saya ingin persegi panjang bergerak saya bertabrakan. Saya mengulang-ulang ini menggunakan kode berikut (p adalah persegi panjang moveble).
IsCollidingWith
mengembalikan bool tetapi juga menggunakan SFML intersects
untuk bekerja di persimpangan.
while(unsigned i = 0; i!= testRects.size(); i++){
if(p.IsCollidingWith(testRects[i]){
p.Collide(testRects[i]);
}
}
dan Collide()
kode aktual :
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 );
}
}
dan IsCollidingWith()
kodenya adalah:
bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
return true;
}else {
return false;
}
Ini berfungsi dengan baik ketika hanya ada 1 Rect
di tempat kejadian. Namun, ketika ada lebih dari satu Rect
itu menyebabkan masalah ketika berolahraga 2 tabrakan sekaligus.
Adakah cara untuk menangani hal ini dengan benar? Saya telah mengunggah video ke youtube untuk menunjukkan masalah saya. Konsol di ujung kanan menunjukkan lebar dan tinggi persimpangan. Anda dapat melihat di konsol bahwa ia mencoba menghitung 2 tabrakan sekaligus, saya pikir di sinilah masalahnya.
Akhirnya, gambar di bawah ini tampaknya menggambarkan masalah saya dengan baik:
collider
objek dikembalikan dengan this->getCollider()
diperbarui oleh this->move()
??