Karena ini didasarkan pada pertanyaan Anda yang lain, saya akan memberikan solusi ketika persegi panjang disejajarkan dengan sumbu.
Pertama, Anda membangun persegi panjang objek Anda saat ini dengan nilai-nilai berikut:
int boxLeft = box.X;
int boxRight = boxLeft + box.Width;
int boxTop = box.Y;
int boxBottom = boxTop + box.Height;
Selanjutnya, Anda harus memiliki posisi objek lama (yang dapat Anda simpan di setiap objek atau cukup beralih ke fungsi) untuk membuat persegi panjang objek lama (ketika tidak bertabrakan):
int oldBoxLeft = box.OldX;
int oldBoxRight = oldBoxLeft + box.Width;
int oldBoxTop = box.OldY;
int oldBoxBottom = oldBoxTop + box.Height;
Sekarang, untuk mengetahui dari mana tabrakan itu berasal, Anda harus menemukan sisi di mana posisi lama tidak berada di area tabrakan dan di mana posisi barunya. Karena, ketika Anda memikirkannya, inilah yang terjadi ketika Anda bertabrakan: sisi yang tidak bertabrakan memasuki persegi panjang lainnya.
Inilah cara Anda dapat melakukannya (fungsi-fungsi ini menganggap bahwa ada tabrakan. Mereka tidak boleh dipanggil jika tidak ada tabrakan):
bool collidedFromLeft(Object otherObj)
{
return oldBoxRight < otherObj.Left && // was not colliding
boxRight >= otherObj.Left;
}
Bangkit dan ulangi.
bool collidedFromRight(Object otherObj)
{
return oldBoxLeft >= otherObj.Right && // was not colliding
boxLeft < otherObj.Right;
}
bool collidedFromTop(Object otherObj)
{
return oldBoxBottom < otherObj.Top && // was not colliding
boxBottom >= otherObj.Top;
}
bool collidedFromBottom(Object otherObj)
{
return oldBoxTop >= otherObj.Bottom && // was not colliding
boxTop < otherObj.Bottom;
}
Sekarang, untuk penggunaan aktual dengan respons tabrakan dari pertanyaan lain:
if (collidedFromTop(otherObj) || collidedFromBottom(otherObj))
obj.Velocity.Y = -obj.Velocity.Y;
if (collidedFromLeft(otherObj) || collidedFromRight(otherObj))
obj.Velocity.X = -obj.Velocity.X;
Sekali lagi, ini mungkin bukan solusi terbaik tapi itulah cara saya biasanya pergi untuk deteksi tabrakan.