Bu, diğer sorunuza dayandığından, dikdörtgenin eksen hizalaması için bir çözüm vereceğim.
İlk olarak, mevcut nesnenin dikdörtgenini aşağıdaki değerlerle oluşturursunuz:
int boxLeft = box.X;
int boxRight = boxLeft + box.Width;
int boxTop = box.Y;
int boxBottom = boxTop + box.Height;
Daha sonra, eski nesnenin dikdörtgenini oluşturmak için (çarpışmadığı zaman) eski nesnenin konumuna sahip olmalısınız (her nesnede saklayabileceğiniz veya bir işleve iletebilirsiniz):
int oldBoxLeft = box.OldX;
int oldBoxRight = oldBoxLeft + box.Width;
int oldBoxTop = box.OldY;
int oldBoxBottom = oldBoxTop + box.Height;
Şimdi, çarpışmanın nereden geldiğini bilmek için, eski pozisyonun çarpışma alanında olmadığı ve yeni pozisyonunun bulunduğu tarafı bulmalısınız. Çünkü, düşündüğünüzde, çarpıştığınızda böyle olur: çarpışmayan bir taraf başka bir dikdörtgene girer.
Bunu şu şekilde yapabilirsiniz (bu işlevler bir çarpışma olduğunu varsayar. Çarpışma yoksa çağrılmamalıdır):
bool collidedFromLeft(Object otherObj)
{
return oldBoxRight < otherObj.Left && // was not colliding
boxRight >= otherObj.Left;
}
Rince ve tekrarlayın.
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;
}
Şimdi, diğer sorudan gelen çarpışma tepkisi ile gerçek kullanım için:
if (collidedFromTop(otherObj) || collidedFromBottom(otherObj))
obj.Velocity.Y = -obj.Velocity.Y;
if (collidedFromLeft(otherObj) || collidedFromRight(otherObj))
obj.Velocity.X = -obj.Velocity.X;
Yine, bu en iyi çözüm olmayabilir, ancak genellikle çarpışma tespiti için bu şekilde giderim.