Saya menerapkan rutin deteksi tabrakan sederhana menggunakan AABB antara sprite permainan utama saya dan berbagai platform (Silakan lihat kode di bawah). Ini bekerja dengan baik, tetapi saya sekarang memperkenalkan gravitasi untuk membuat karakter saya jatuh dan itu menunjukkan beberapa masalah dengan rutin CD saya.
Saya pikir inti masalahnya adalah bahwa rutin CD saya memindahkan sprite kembali sepanjang sumbu di mana ia telah menembus jumlah paling sedikit ke dalam sprite lainnya. Jadi, jika lebih banyak di sumbu Y daripada X, maka itu akan memindahkannya kembali di sepanjang X Axis.
Namun, sekarang sprite (pahlawan) saya sekarang jatuh pada kecepatan 30 piksel per bingkai (Ini adalah layar tinggi 1504 - saya perlu turun secepat ini karena saya ingin mencoba mensimulasikan gravitasi 'normal', setiap lambat hanya terlihat aneh ) Saya mendapatkan masalah ini. Saya akan mencoba untuk menunjukkan apa yang terjadi (dan apa yang saya pikir menyebabkannya - walaupun saya tidak yakin) dengan beberapa gambar: (Kode di bawah gambar).
Saya akan sangat menghargai beberapa saran tentang cara mengatasi masalah ini.
Untuk klarifikasi, pada gambar kanan di atas, ketika saya mengatakan posisi dikoreksi 'salah' itu mungkin agak menyesatkan. Kode itu sendiri bekerja dengan benar untuk bagaimana itu ditulis, atau dengan kata lain, algoritma itu sendiri jika berperilaku seperti yang saya harapkan, tapi saya perlu mengubah perilakunya untuk menghentikan masalah ini terjadi, harapan yang mengklarifikasi komentar saya dalam gambar .
Kode Saya
public boolean heroWithPlatforms(){
//Set Hero center for this frame
heroCenterX = hero.xScreen+(hero.quadWidth/2);
heroCenterY = hero.yScreen+(hero.quadHeight/2);
//Iterate through all platforms to check for collisions
for(x=0;x<platformCoords.length;x+=2){
//Set platform Center for this iteration
platformCenterX = platformCoords[x]+(platforms.quadWidth/2);
platformCenterY = platformCoords[x+1]+(platforms.quadHeight/2);
// the Dif variables are the difference (absolute value)
// of the center of the two sprites being compared (one for X axis difference
//and on for the Y axis difference)
difX = Math.abs(heroCenterX-platformCenterX);
difY = Math.abs(heroCenterY-platformCenterY);
//If 1
//Check the difference between the 2 centers and compare it to the vector (the sum of
//the two sprite's widths/2. If it is smaller, then the sprites are pverlapping along
//the X axis and we can now proceed to check the Y axis
if (difX<vecXPlatform){
//If 2
//Same as above but for the Y axis, if this is also true, then we have a collision
if(difY<vecYPlatform){
//we now know sprites are colliding, so we now need to know exactly by how much
//penX will hold the value equal to the amount one sprite (hero, in this case)
//has overlapped with the other sprite (the platform)
penX = vecXPlatform-difX;
penY = vecYPlatform-difY;
//One sprite has penetrated into the other, mostly in the Y axis, so move sprite
//back on the X Axis
if (penX < penY){hero.xScreen-=penX*(heroCenterX-platformCenterX>=0 ? -1 : 1);}
//Sprite has penetrated into the other, mostly in the X asis, so move sprite
//back on the Y Axis
else if (penY < penX) {hero.yScreen-=penY*(heroCenterY-platformCenterY>=0 ? -1 : 1);}
return true;
}//Close 'If' 2
} //Close 'If' 1
}
//Otherwise, no collision
return false;
}
//One sprite has penetrated into the other, mostly in the Y axis, so move sprite //back on the X Axis