चूंकि यह आपके अन्य प्रश्न पर आधारित है, इसलिए जब आयत को अक्ष-संरेखित किया जाता है, तो मैं इसका समाधान दूंगा।
पहले, आप निम्न मूल्यों के साथ वर्तमान वस्तु की आयत बनाते हैं:
int boxLeft = box.X;
int boxRight = boxLeft + box.Width;
int boxTop = box.Y;
int boxBottom = boxTop + box.Height;
अगला, आपके पास पुरानी वस्तु की आयत बनाने के लिए पुरानी वस्तु की स्थिति होनी चाहिए (जिसे आप प्रत्येक वस्तु पर स्टोर कर सकते हैं या किसी फ़ंक्शन में पास कर सकते हैं) (जब यह टकरा नहीं रहा था):
int oldBoxLeft = box.OldX;
int oldBoxRight = oldBoxLeft + box.Width;
int oldBoxTop = box.OldY;
int oldBoxBottom = oldBoxTop + box.Height;
अब, यह जानने के लिए कि टक्कर कहाँ से थी, आपको उस पक्ष का पता लगाना चाहिए जहाँ पुरानी स्थिति टकराव क्षेत्र में नहीं थी और जहाँ उसकी स्थिति ठीक है। क्योंकि, जब आप इसके बारे में सोचते हैं, तो यही होता है जब आप टकराते हैं: एक ऐसा पक्ष जो टकरा नहीं रहा था वह एक अन्य आयत में प्रवेश करता है।
यहां बताया गया है कि आप ऐसा कैसे कर सकते हैं (ये कार्य यह मानते हैं कि टक्कर है। यदि कोई टक्कर नहीं है तो उन्हें नहीं बुलाया जाना चाहिए):
bool collidedFromLeft(Object otherObj)
{
return oldBoxRight < otherObj.Left && // was not colliding
boxRight >= otherObj.Left;
}
फिर से करना और दोहराना
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;
}
अब, अन्य प्रश्न से टकराव की प्रतिक्रिया के साथ वास्तविक उपयोग के लिए:
if (collidedFromTop(otherObj) || collidedFromBottom(otherObj))
obj.Velocity.Y = -obj.Velocity.Y;
if (collidedFromLeft(otherObj) || collidedFromRight(otherObj))
obj.Velocity.X = -obj.Velocity.X;
फिर से, यह सबसे अच्छा समाधान नहीं हो सकता है लेकिन यही वह तरीका है जो मैं आमतौर पर टकराव का पता लगाने के लिए जाता हूं।