ব্রেকআউট সংঘর্ষ: সংঘর্ষের দিকটি সনাক্ত করা


10

আমি একটি ব্রেকআউট ক্লোন লিখছি (আমার প্রথম খেলা) এবং আমি কীভাবে ইটের কোন দিকে আঘাত পেয়েছিলাম তা নির্ধারণের জন্য পুরো আটকে রয়েছি।

আমার কাছে একটি সংঘর্ষ সনাক্তকরণ পদ্ধতি রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

DetectCollision(Object a, Object b)

   x = distance(a.x, b.x);
   y = distance(a.y, b.y);

   if (x is smaller than the combined width &  y is smaller is than combined height {
       return true;
   }
return false;  

এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে তবে সঠিকভাবে প্রতিক্রিয়া জানাতে আমার সংঘর্ষের দিক এবং কেন্দ্রের সাথে সম্পর্কিত অবস্থানটি জানতে হবে।

আমি গত কয়েক দিন চারপাশে ঝলকানি কাটিয়েছি তবে হারিয়ে গিয়েছি।

উত্তর:


13

এটি সমস্ত ইটের সাথে সংঘটিত ইটের অবস্থানের তুলনায় বলের অবস্থান থেকে কাটা যেতে পারে।

একবার আপনি একটি সংঘর্ষ সনাক্ত করে ফেলেছেন:

if(ballPosition.y <= brickPosition.y - (brickHeight/2))
  //Hit was from below the brick

if(ballPosition.y >= brickPosition.y + (brickHeight/2))
  //Hit was from above the brick

if(ballPostion.x < brickPosition.x)
  //Hit was on left

if(ballPostion.x > brickPosition.x)
  //Hit was on right

প্রথমটি দুটি পরীক্ষা করে দেখুন যে বলটি ইটের উপরে বা নীচে রয়েছে। যদি না হয় তবে এটি অবশ্যই ইটের পাশের হওয়া উচিত, সুতরাং এটি কোন দিকে রয়েছে তা পরীক্ষা করুন। আপনি যেখান থেকে অবস্থান নিচ্ছেন তা ফিট করার জন্য এটি টিক করা দরকার, যেমন ইট পজিশনটি ইটের কেন্দ্র বা ইট পজিশনটি শীর্ষ বাম কোণে।


1
তবে আপনি কীভাবে প্লেয়ারটিকে প্রতিস্থাপন করতে এটি ব্যবহার করবেন, যেহেতু প্লেয়ারটি একটি ইটের অভ্যন্তরে চলে যায়, সেই শর্তগুলির একাধিকটি পূরণ করা হবে এবং আপনি যদি পছন্দসই এক্সটি প্রাচীরের কিনারে রিসেট করেন, উদাহরণস্বরূপ যদি এটি কীটি চাপায় একটি ইটের দেয়ালের ঠিক পাশের কাঙ্ক্ষিত এক্স সেট করে, তবে এটি সত্যিই কাজ করবে না কারণ আপনি যখন চরিত্রের তাত্ত্বিক অবস্থানটি পরীক্ষা করছেন এটি কোন দিক থেকে সংঘটিত হচ্ছে তা দেখার জন্য, এই শর্তগুলির একাধিকটি পূরণ করা হবে, সুতরাং আপনি কীভাবে করবেন প্লেয়ারটিকে পুনরায় সেট করতে এটি ব্যবহার করুন, প্রতিটা শেষে আপনার কি অন্যের যোগ করা দরকার)?
নীলজাইকে

আমি যতদূর জানি একটি ব্রেকআউট টাইপ গেমের "প্লেয়ার" প্যাডেল। প্যাডেল কোনও ইটের ভিতরে চলেছে না, বা আপনি ইটের সাথে বলের মিথস্ক্রিয়ার ভিত্তিতে প্যাডেলের অবস্থান পরিবর্তন করছেন না। আপনি যদি এটিই করছেন, আপনার অতিরিক্ত যুক্তির প্রয়োজন নেই, যতক্ষণ না আপনি সমস্ত সংঘর্ষের চেক সম্পন্ন না করেন কেবল পদক্ষেপের প্রক্রিয়া করবেন না। বা একবার যাচাই করা সত্য হলে একবারে ফিরে আসুন।
মাইকেলহাউস

8

আপনি তাদের মধ্যে কোণগুলি আবিষ্কার করতে ভেক্টর ম্যাথ ব্যবহার করতে পারেন!

একটি সংক্ষিপ্ত উত্তর এখানে:

ballToBrick = ballPosition - brickPosition;
ballToBrick.Normalize();
brickFacing = Vector2(0,1).Normalize();


float angle = acos( Dot(ballToBrick, brickFacing) );

ব্রিকের মুখোমুখি একটি কৌতুকপূর্ণ ভেক্টর, এটি কোণ গণনার "স্টার্ট পয়েন্ট"। এবং যদি আপনি ভেক্টরটি পয়েন্ট আপ করতে চান তবে এটি (0, 1), পয়েন্ট বাম (-1, 0), ডান (1, 0), পয়েন্ট ডাউন (0, -1) করুন। ধরে নিই যে আপনি ওপেনজিএল অক্ষে রয়েছেন, যেখানে উপরে এবং ডানটি ইতিবাচক।

যদি আপনি না জানেন, প্রতিটি ফাংশনটির সংজ্ঞা এখানে দেওয়া হয়েছে:

Vector2.Normalize()
{
    float length = squareroot(x * x + y * y);
    x = x / length;
    y = y / length;
    return this;
}

Dot(Vector2 a, Vector2 b)
{
    return a.x * b.x + a.y * b.y;
}

( https://en.wikedia.org/wiki/ ডট_প্রডাক্ট )

তথ্যসূত্র: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.