यदि दो ऑब्जेक्ट्स इंटरैक्ट करते हैं, तो इंटरेक्शन कोड क्या है?


28

एक गोली और एक दुश्मन, या खिलाड़ी और मंजिल के बारे में सोचो। यदि ये ऑब्जेक्ट्स इंटरैक्ट करते हैं, तो इंटरेक्शन कोड क्या है?


2
किस तरह से बातचीत करें? क्या आपका मतलब टकराव का पता लगाने से है? यदि ऐसा है तो यह सबसे अधिक संभावना है कि आप टकराव का पता लगाने वाले वर्ग और टकराव के समाधान प्रबंधक दोनों को लागू करेंगे।
CaptainRedmuff

आंशिक रूप से हाँ, मुझे टकराव में दिलचस्पी है और टक्कर के बाद क्या होता है। अगर यह दुश्मन के करीब है, या दूसरी तरह से गोली की जाँच करता है? और टक्कर के बाद क्या होता है, क्या एक बुलेट ऑब्जेक्ट सिर्फ एक दुश्मन वस्तु को बता सकता है जो हिट हो गया है? जैसा कि आप देख सकते हैं कि मैं पूरी चीज़ के बारे में काफी उलझन में हूँ, और यह कोड को पढ़ने के लिए बहुत कठिन बनाता है।
ThatOneGuy

जवाबों:


23

टी एल; डॉ:

आपकी गेम ऑब्जेक्ट एक दूसरे के बारे में नहीं जानते हैं, न ही वे अन्य ऑब्जेक्ट्स के खिलाफ चेक करते हैं। आप एक टकराव का पता लगाने और टक्कर के रिज़ॉल्यूशन पैटर्न बनाते हैं जो आपके गेम ऑब्जेक्ट्स की जांच करता है और आपके गेम भौतिकी को अनुकरण करने के लिए उपयुक्त क्रियाएं करता है।

अच्छी वस्तु

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

कहीं न कहीं आपके इंजन / खेल में, आप अपनी दुनिया में सभी वस्तुओं की एक सरणी रखेंगे। प्रत्येक फ़्रेम पर आप ऐरे को लूप करेंगे और एक साधारण बाउंडिंग बॉक्स / गोले की टक्कर का पता लगाने के साथ प्रत्येक ऑब्जेक्ट के खिलाफ प्रत्येक ऑब्जेक्ट की जाँच करेंगे।

स्यूडोकोड:

dectectCollisions(objects)
{
    for(objectA in objects)
    {
        for(objectB in objects)
        {
            if(objectA != objectB) //ignore self
            {
                if(BoundingSpheresIntersect(objectA, objectB))
                {
                    collisionResolver.addObjects(objectA, objectB);
                }
            }
        }
    }
}

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

एक संभावित टकराव के लिए दो वस्तुओं की जांच करने के बाद (यानी दोनों ऑब्जेक्ट टकराव के लिए पर्याप्त करीब हैं), वस्तुओं को एक अधिक सटीक टकराव का पता लगाने के लिए नियमित रूप से पास किया जाता है।

कल्पना कीजिए कि आपके पास यादृच्छिक आकृतियों और आकारों के दो बहुभुज हैं जो संभावित अंतर के करीब हैं लेकिन उनकी ज्यामिति के कारण नहीं हैं:

चित्र गूगल के माध्यम से मिला

बाउंडिंग क्षेत्रों का उपयोग करते हुए, ये दोनों वस्तुएं संभावित टकराव के लिए एक झूठी सकारात्मक पैदा करेंगी। यह वह जगह है जहां आप तब यह निर्धारित करने के लिए अधिक गहन पास का प्रदर्शन करेंगे कि क्या दोनों वस्तुएं वास्तव में प्रतिच्छेद करती हैं।

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

इसे ध्यान में रखते हुए, आप टकराव का पता लगाने और रिज़ॉल्यूशन की पूरी प्रक्रिया को रद्द कर सकते हैं ताकि आपकी वस्तुओं को एक दूसरे के बारे में कुछ भी न पता हो, न ही टकरावों को निर्धारित करने और हल करने के लिए आवश्यक प्रक्रिया। आपके लिए इसे संभालने वाले दो वर्गों / प्रबंधकों को केवल टकराव के लिए एक त्वरित और गंदी जांच करने के लिए प्रत्येक वस्तु के मूल गुणों को जानना होगा और फिर अधिक गहन जांच की आवश्यकता होनी चाहिए।


2
विशेष रूप से, मध्यस्थ डिजाइन पैटर्न उपयुक्त होगा। ऑब्जर्वर पैटर्न एक अच्छा विकल्प होगा, जिसमें बहुत अलग इरादा है। आप इस Stackoverflow पोस्ट पर उनमें से एक बहुत अच्छा सारांश प्राप्त कर सकते हैं ।
कुर्टज़बॉट

12

एक तरह से अवास्तविक इंजन 3 इसे संभालता है:

बुलेट को एक टक्कर का संदेश मिलता है, जिसमें यह कहा जाता है कि यह एक हिट है। इसे तब objectHit.takeDamage (self) कह सकते हैं। इसके बाद लक्ष्य को टेकडैम संदेश मिलता है, जो उस चीज़ को इंगित करने वाले पॉइंटर के साथ आता है, और उचित कार्रवाई करता है।

मैं व्यक्तिगत रूप से इस दृष्टिकोण को पसंद करता हूं क्योंकि इसका मतलब है कि बुलेट विशेष क्रियाएं कर सकता है (जैसे किसी चीज के हिट के प्रकार के आधार पर विस्फोट प्रभाव बनाना) और लक्ष्य बुलेट के प्रकार के आधार पर विशेष कार्रवाई कर सकता है।

यह भी संभव है कि गोली यह जानती है कि वह लक्ष्य क्या करता है, और ऑब्जेक्ट पर कॉल कर सकता है, जैसे ऑब्जेक्टहाइट.फ़्रीज़ (सेल्फ)। तब लक्ष्य जानता है कि यह उस चीज़ से टकरा गया है जो इसे जमा देता है, और यह किस तरह की वस्तु है।

संपादित करें: यह उत्तर सामान्य तस्वीर के रूप में है कि यह कैसे काम कर सकता है, क्योंकि आप शायद यूई 3 के साथ काम नहीं कर रहे हैं। :)


10

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

जब वाटर एरो किसी ऑब्जेक्ट से टकराता है, तो टारगेट ऑब्जेक्ट तब अपने रेसेप्ट्रोन को खोजता है जो उचित तीव्रता मान वाले वाटरस्टिम की तलाश करता है। फिर यह उसके साथ जो भी कमांड जुड़ा हुआ है उसे निष्पादित करता है (इस मामले में, एक जलती हुई मशाल को बंद टॉर्च में बदल रहा है, और धुएं के एक कश का उत्सर्जन करता है।)

चूंकि SystemShock2 में एक ही इंजन का उपयोग किया जाता है, इस तरह से सभी अलग-अलग प्रकार के डैमेज को हैंडल किया जाता है, अलग-अलग बुलेट्स में अलग-अलग स्टिम्स सेट होते हैं, और अलग-अलग राक्षसों के पास अलग-अलग स्टिम प्रकारों के लिए रिसेप्ट्रॉन होते हैं और 1 *, 2: 1/1 के बराबर नुकसान करते हैं। 2 की तीव्रता इस बात पर निर्भर करती है कि बारूद का प्रकार "सुपर प्रभावी" है या नहीं।

यह एक बहुत ही लचीली प्रणाली की तरह लग रहा था जैसा कि आप स्तर संपादक में ऑब्जेक्ट्स में स्रोत और रिसेप्ट्रोन जोड़ सकते हैं, (एक बंद दरवाजा बनाने के लिए जो आग से हिट होने पर खुलता है, कहते हैं।) जबकि आप एक स्क्रिप्ट को "स्क्रिप्ट भेजने" के लिए भी कह सकते हैं। संदेश "यदि वस्तु के साथ विशेष स्क्रिप्ट जुड़ी थी।

आप जो नहीं करना चाहते हैं उसे सभी संभावित वस्तुओं से टकराते हुए सभी संभव वस्तुओं के एक एनएक्सएन इंटरैक्शन मैट्रिक्स को हार्डकोड करना होगा! मानकीकृत संदेशों के माध्यम से बातचीत को सामान्य करके, आप प्रक्रिया को सरल बनाते हैं।


एक स्क्रिप्टिंग दृष्टिकोण से, यह दृष्टिकोण सबसे अधिक लचीला और सबसे अधिक अभिव्यंजक लगता है। बहुत ही शांत।
18'13

-2

एक समाधान गोलियों और खिलाड़ियों के कंटेनरों को अलग-अलग वर्गों में रखना है, और फिर मुख्य () फ़ंक्शन है जो बातचीत के लिए फ्रेम लूप को जिम्मेदार रखता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.