आपको निश्चित रूप से कुछ प्रकार की सतह को लागू करना चाहिए। इसके बारे में सोचें, यदि आप सीढ़ी पर चढ़ सकते हैं तो आप कैसे प्रबंधित करेंगे यदि आप नहीं जान सकते कि क्या आपका चरित्र सिर्फ दीवार या सीढ़ी से टकराया है? आप विरासत का उपयोग करके एक प्रकार की पदानुक्रम का प्रबंधन करने के लिए ओओपी का उपयोग कर सकते हैं, लेकिन मैं आपको एक एनुमरेटेड प्रकार का उपयोग करके कार्यान्वित "श्रेणियों" का उपयोग करने का सुझाव दूंगा:
यह विचार है: एक "Collisions" गणन प्रत्येक श्रेणी के लिए एक झंडा है। उदाहरण के लिए:
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
};
}
इस पद्धति से, आप यह जांचने में सक्षम होंगे कि क्या खिलाड़ी सिर्फ आपके द्वारा प्रबंधित की जाने वाली किसी चीज़ से टकराया है, इसलिए आपका इंजन इकाई के "Collered" तरीके को कॉल कर सकता है:
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() );
}