আপনার অবশ্যই কিছু ধরণের পৃষ্ঠতল প্রয়োগ করা উচিত। এটি ভেবে দেখুন, আপনি যদি সিঁড়ি বেয়ে উঠতে পারেন তবে আপনি কীভাবে পরিচালনা করবেন যদি আপনি জানতে না পারেন যে আপনার চরিত্রটি কেবল কোনও প্রাচীর বা মইয়ের সাথে সংঘর্ষিত হয়েছে কিনা? Heritageতিহ্য ব্যবহার করে আপনি কোনও ধরণের শ্রেণিবিন্যাস পরিচালনা করতে কেবল ওওপি ব্যবহার করতে পারেন, তবে আমি আপনাকে একটি সংখ্যার ধরন ব্যবহার করে "বিভাগ" প্রয়োগ করার পরামর্শ দিচ্ছি:
এই ধারণাটি এখানে: প্রতিটি "বিভাগে" গণনার একটি পতাকা রয়েছে। উদাহরণ স্বরূপ:
namespace Collisions
{
enum Type
{
None = 0,
Floor = 1 << 0,
Ladder = 1 << 1,
Enemy = 1 << 2,
... // And whatever else you need.
// Then, you can construct named groups of flags.
Player = Floor | Ladder | Enemy
};
}
এই পদ্ধতির সাহায্যে আপনি পরীক্ষা করতে সক্ষম হবেন যদি প্লেয়ারটি আপনার পরিচালনা করা উচিত এমন কোনও কিছুকে ধাক্কা খায়, যাতে আপনার ইঞ্জিন সত্তার কোনও "ধর্ষক" পদ্ধতিতে কল করতে পারে:
void Player::Collided( Collisions::Type group )
{
if ( group & Collisions::Ladder )
{
// Manage Ladder Collision
}
if ( group & Collisions::Floor )
{
// Manage Floor Collision
}
if ( group & Collisions::Enemy )
{
// Manage Enemy Collision
}
}
বিভাগটির বাইনারি মানের উপর ভিত্তি করে প্রতিটি গ্রুপের আলাদা মান রয়েছে তা নিশ্চিত করার জন্য পদ্ধতিটি বিটওয়াইস ফ্ল্যাগ এবং বিটওয়াইজ "বা" অপারেটর ব্যবহার করে। এই পদ্ধতিটি সূক্ষ্মভাবে কাজ করে এবং সহজেই স্কেলেবল হয় যাতে আপনি শুল্কের সংঘর্ষের গ্রুপ তৈরি করতে পারেন। আপনার গেমের প্রতিটি সত্তা (প্লেয়ার, শত্রু, ইত্যাদি) এর একটি "ফিল্টার" নামে কিছু বিট রয়েছে যা এটির সাথে সংঘর্ষে পড়তে পারে তা নির্ধারণ করতে ব্যবহৃত হয়। আপনার সংঘর্ষের কোডটিতে বিটগুলি মিলছে কিনা এবং তা অনুসারে প্রতিক্রিয়া দেখাবে কিনা তা দেখতে পরীক্ষা করা উচিত:
void PhysicEngine::OnCollision(...)
{
mPhysics.AddContact( body1, body1.GetFilter(), body2, body2.GetFilter() );
}