2012-04-11 28 views
15

मैं सीखना चाहता हूं कि गेम ऑब्जेक्ट में दो ऑब्जेक्ट्स स्थिति के बीच टकराव के लिए अच्छी वस्तु-उन्मुख (ओओ) डिज़ाइन अभ्यास कैसे बनाएं।खेल विकास में टकराव का पता लगाने के लिए अच्छा ऑब्जेक्ट ओरिएंटेड क्लास डिज़ाइन

मान लें कि मेरे पास स्पेसशिप क्लास और एक उल्का वर्ग है। जब मीटियर स्पेसशिप के साथ टकराता है, तो स्पेसशिप नष्ट हो जाएगी।

प्रश्न: उल्का और स्पेसशिप के साथ टकराव होने के साथ-साथ टकराव समाधान विधि (स्पेसशिप को नष्ट करने) के बीच टकराव होने के लिए मुझे किस वर्ग को विधि रखना चाहिए? क्या यह स्पेसशिप कक्षा या मौसम वर्ग में है? या शायद मुझे एक और कक्षा में रखना चाहिए, यानी। GameArea या GameController कक्षा?

नोट: सादगी के लिए, मान लें कि उल्का और स्पेसशिप छवि संसाधन के रूप में है। मैं जावा भाषा का उपयोग करने के लिए प्रयोग किया जाता है, लेकिन दूसरी भाषा भी ठीक है।

+0

मैं 'GameController' में टक्कर पता लगाने को लागू करने (या जो भी वर्ग आपकी गेमप्ले क्षेत्र प्रबंध कर रहा है), एक' collidedWithObject साथ के लिए वोट चाहते हैं theObject) 'उल्का' और 'स्पेसशिप' (और किसी भी अन्य वस्तु जो चीजों से टकरा सकता है) पर विधि है जिसे टकराव की वस्तुओं को सूचित करने के लिए बुलाया जाता है। आपके वोट के लिए – aroth

+0

Thx। क्या आप किसी भी मौके से ऑब्जेक्ट उन्मुख गेम डिज़ाइन के बारे में एक अच्छा ट्यूटोरियल या पुस्तक जानते हैं? – null

उत्तर

1

ठीक है, मैं आमतौर पर एक (कभी-कभी जेनेरिक) GameObject कक्षा या इंटरफ़ेस बनाता हूं जिसमें टकराव विधि होती है। उदाहरण के लिए:

template< typename T = int > class GameObject 
{ 
public: 
    bool collides(const GameObject& obj); 
}; 

// usage 
GameObject<int> my_obj, your_obj; 
if(my_obj.collides(your_obj)) { ... }; 

एक और बात मैं कभी कभी (लेकिन शायद ही कभी) करना एक अलग GamePhysics वर्ग बनाने के लिए है:

template< typename T > class GamePhysics 
{ 
public: 
    /* you may make this static or the class a singleton */ 
    void detect_collision(const T& obj, const T& obj2); 
}; 
+0

Thx। आप कहां रखेंगे "अगर (my_obj.collides (your_obj)) {...};" कोड? खेल नियंत्रक? – null

+1

@suud कहीं भी आपको टकराव का पता लगाने की आवश्यकता है। मुख्य-लूप, गेमकंट्रोलर, टाइल-रेंडरर इत्यादि – ApprenticeHacker

2

टकराव का पता लगाने, मेरी राय में, एक वस्तु का हिस्सा नहीं है ... इसे कुछ और के रूप में परिभाषित किया जाना चाहिए - कुछ भौतिकी प्रबंधक, आदि। इस तरह आपकी वस्तु टकराव एल्गोरिदम पर स्वतंत्र होगी।

एक और बात यह है कि गेम में आमतौर पर कई परतों (घटकों) होते हैं: ग्राफिक्स परत, भौतिकी परत, तर्क परत। इस तरह भौतिकी प्रबंधक दिए गए वस्तुओं के भौतिकी घटक का प्रबंधन करता है।

class GameObject 
{ 
    RenderComponent m_renderComponent; 
    LogicComponent m_aiComponent; 
    PhysicsComponent m_physicsComponent; 
}; 
+0

तो क्या आपका मतलब है कि टक्कर तर्क भौतिकी कॉम्पोनेंट क्लास में रहना चाहिए? – null

+1

हां ... टक्कर घटक (उदाहरण के लिए कुछ बाध्यकारी बॉक्स) भौतिकी घटक के अंदर हो सकता है। – fen

10

यह लगता है कि टक्कर पता लगाने की जिम्मेदारी जो यान या उल्का वर्गों से संबंधित नहीं है है और अधिक स्वाभाविक है। खासकर जब यह विभिन्न दिशाओं में कई टक्कर संभावनाओं के साथ जटिल हो जाता है। यदि आप इन तर्कों को इन दोनों वर्गों में डालते हैं तो उन्हें उनके आस-पास की कई अन्य वस्तुओं के संदर्भों की आवश्यकता होगी जो उचित नहीं होंगे।

आप इसे पर एक अलग वर्ग पर प्राप्त कर सकते हैं जैसे कि CollisionDetector जो गेम स्पेस में सभी ऑब्जेक्ट्स के निर्देशांक का ट्रैक रखता है और टकराव का पता लगाता है। टकराव की रोकथाम भी एक अलग जिम्मेदारी प्रतीत होती है जो मेरी राय में एक अलग वर्ग में होनी चाहिए। इसके लिए आपके पास एक अलग श्रेणी CollisionResolver हो सकती है। आवश्यकताओं के आधार पर, CollisionDetectorटक्कर रिसेल्वर से बात कर सकता है।

CollisionResolver को स्पेसशिप से बात करने में सक्षम होने की आवश्यकता हो सकती है, जैसे दिशा बदलने के लिए सलाह देना, या उल्का की ओर फायरिंग मिसाइलों को आदेश देना।

CollisionDetector और CollisionResolver * GameSpace/* GameController भीतर बैठ सकता है। आदि..

यह Single Responsibility Principle को बढ़ावा देगा ताकि प्रत्येक घटक केवल एक केंद्रित कार्य कर सके।

0

जावा (या किसी अन्य ओओ भाषा) में मैं टक्कर से पता चला कॉलबैक/घटना आपके गेम में सभी चलती वस्तुओं के सामान्य पूर्वजों वर्ग में रखेगा।

यह एक खेल का एक सरलीकृत वर्णन है:

  • एक खेल में, वहां आमतौर पर है एक खेल लूप। एक गेम-लूप की तरह है (सत्य) लूप जो निरंतर चलता है (किसी एप्लिकेशन के मुख्य UI थ्रेड की तरह) और प्रत्येक चरण में ऑब्जेक्ट्स के साथ क्या बदल गया है, अपडेट किया जाना चाहिए और क्या घटनाएं होनी चाहिए कहा जाता है (और अधिक ...)।

  • उत्तरदायित्व के लिए, इस पाश को एक बार कई बार चक्र करना चाहिए।

  • इस लूप के अंदर, भौतिकी इंजन ऑब्जेक्ट को लगातार इसकी स्थिति अपडेट करनी चाहिए। यह एक स्वतंत्र वर्ग का एक उदाहरण वस्तु होगी। यह इंजन है जो वस्तुओं के बीच टकराव का पता लगाना चाहिए और टकराव की सभी वस्तुओं पर CollisionDetected ईवेंट को कॉल करना चाहिए।

यह एक विचार है, न कि निश्चित समाधान (GameObject है ...