যেহেতু এটি আপনার অন্যান্য প্রশ্নের উপর নির্ভর করে আমি যখন আয়তক্ষেত্রটি অক্ষ-সারিবদ্ধ হয় তখন এর জন্য একটি সমাধান দেব।
প্রথমত, আপনি নিম্নলিখিত মানগুলির সাথে আপনার বর্তমান অবজেক্টের আয়তক্ষেত্রটি তৈরি করেন:
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;
সংঘর্ষটি কোথা থেকে হয়েছে তা জানতে এখন আপনাকে সেই পাশটি সন্ধান করতে হবে যেখানে সংঘর্ষের জায়গায় পুরাতন অবস্থানটি ছিল না এবং এর নতুন অবস্থানটি কোথায়। কারণ, আপনি যখন এটি ভেবে দেখেন, তখন আপনি সংঘর্ষের সময় এটাই ঘটে: একটি দিক যা সংঘর্ষে ছিল না তা অন্য একটি আয়তক্ষেত্র প্রবেশ করে।
আপনি কীভাবে এটি করতে পারেন তা এখানে রয়েছে (এই ফাংশনগুলি ধরে নেয় যে সংঘর্ষ রয়েছে coll সংঘর্ষ না হলে তাদের ডাকা উচিত নয়):
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;
আবার এটি সর্বোত্তম সমাধান নাও হতে পারে তবে আমি সাধারণত সংঘর্ষ সনাক্তকরণের জন্যই যাই।