टकराव का पता लगाने वाले तर्क को कहां रखा जाना चाहिए?


19

मैं एक छोटा 2 डी गेम इंजन विकसित कर रहा हूं। वर्णों में एक पेंट विधि है जो वर्तमान में निम्नलिखित है:

  1. चरित्र की नई स्थिति की गणना उसकी गति आदि के अनुसार करें।
  2. टक्कर ग्रिड सेल का अद्यतन **
  3. नई स्थिति में चरित्र बनाएं

** मैंने चौराहे की जाँच की संख्या को कम करने के लिए एक टकराव ग्रिड बनाया है

अब बुनियादी एल्गोरिथ्म जो मैंने टक्कर का पता लगाने के लिए सोचा है:

For Each Character
    Check intersection with characters in surrounding 8 cells

मैं बस इस कोड को पेंट विधि में रख सकता हूं। लेकिन यहाँ समस्या है जिसका मुझे अनुमान है।

मान लीजिए कि दो वर्ण A और B टकराव ग्रिड में आसन्न कोशिकाओं में स्थित हैं। अब वर्ण A के पुनरावृत्ति में उपरोक्त एल्गोरिथम के अनुसार यह पता लगाएगा कि यह B से टकरा गया है। वर्ण B के लिए पुनरावृत्ति में यह पता लगाएगा कि यह A से टकरा गया है।

लेकिन मुझे इस बात का अंदाजा है कि जब A पता लगाता है कि वह B से टकरा गया है, तो उसे B को सूचित करना चाहिए कि वह A से टकरा गया है। यह तुलना बहुत से बचाएगी जब 2 से अधिक कलाकार टकरा रहे हों। लेकिन मुझे यकीन नहीं है कि इसे कैसे संभालना है। मुझे लगता है कि हर किरदार को इसके टकराने की जाँच करने के बजाय, मुझे गेम लूप के अंदर की टक्कर की जाँच करनी चाहिए।

क्या यह दृष्टिकोण सही होगा? आपने इस तरह की समस्या को कैसे संभाला है? मैंने खुद से टकराव ग्रिड की बात सोची। क्या ग्रिड तर्क को टकराने के कोई विकल्प हैं?


मुझे नाइटपिक के लिए खेद है, लेकिन एक विशेष 2D भौतिकी पुस्तकालय में। गेम भौतिकी आमतौर पर बहुत अनुमानित है, इसलिए कोई भी समाधान जो खेल को गैर-खेलने योग्य नहीं बनाता है, ठीक है, लेकिन यदि आप इसे सही ढंग से हल करना चाहते हैं तो Box2D जैसे विशेष भौतिकी का उपयोग करें ...:
--D

जवाबों:


14

टक्कर का पता लगाने के लिए सामान्य दृष्टिकोण या तो ए या बी का पता लगाने के टकराव नहीं है।

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

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

उन्नत नोट: यदि आप में से कोई भी ऑब्जेक्ट टकराव का पता लगाने के लिए प्रतिक्रिया में खुद को आगे बढ़ाता है, तो आपको किसी वस्तु की टक्कर-प्रतिक्रिया के कारण "टकराव की स्थिति में सभी वस्तुओं के बीच टकराव की तलाश" को दोहराने की आवश्यकता हो सकती है।


यह चीजों को करने का उचित तरीका है। ऑब्जेक्ट्स को उनकी ज़िम्मेदारियों को संभालने दें और टकराव प्रणाली को तय करना चाहिए कि जब वे एक बाधा को पूरा करते हैं तो क्या होता है। आप शुरुआती ट्रिगर के एक प्रकार के रूप में अपने पात्रों के चारों ओर एक टक्कर आयत / सिलेंडर (2d / 3D) भी रख सकते हैं।
जेम्स पी।

महान! उन्नत नोट के बारे में, क्या टकराव केवल उन वस्तुओं के लिए नहीं होना चाहिए, जो टकराव की प्रतिक्रिया में खुद को आगे बढ़ाते हैं और वे वस्तुएं जो नई स्थिति में टकराती हैं? चेकों की एक श्रृंखला होगी लेकिन यह सभी वस्तुओं के लिए टकराव की जाँच से बचेंगी।
क्रैकर

इसे कैसे संभालना है - gamedev.stackexchange.com/questions/13076/…
Cracker

1

मैं गेम लूप में अपने सभी पात्रों के लिए एक लूप चलाता हूं जैसे आप कहते हैं।

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

मैंने प्रभावित कोड को लूप में डाल दिया है, इसलिए B पर होने वाली कोई भी क्रिया A के लूप में हुई है, इसलिए B को जाँचने का कोई कारण नहीं होना चाहिए क्योंकि इससे टकराव का परिणाम गड़बड़ हो जाएगा, हालांकि यह आपके लिए अलग हो सकता है ।


लेकिन इस मामले में जब A, B के साथ चौराहे का पता लगाता है, तो B सही हो जाएगा और इसलिए B किसी भी चौराहे की जाँच नहीं करेगा। लेकिन अगर एक और चरित्र C, B के साथ इंटरसेक्ट करता है, तो B इसे पहचान नहीं पाएगा?
क्रैकर

क्षमा करें, मिल गया। चूँकि A, C के साथ प्रतिच्छेद नहीं करता है, C.it अभी भी झूठा होगा। B टकराव की जाँच नहीं करेगा। लेकिन C जाँच करेगा और B को जानकारी देगा कि B और C। कूल के बीच टक्कर है!
क्रैकर

लेकिन मुझे लगता है कि अगर सभी A, B और C एक दूसरे के साथ अंतर करते हैं तो समस्या होगी। A, B.hit और C.hit को सही पर सेट करेगा। बी और सी को पता चल जाएगा कि वे ए से टकरा गए हैं, लेकिन चूंकि उनकी हिट प्रॉपर्टी सही है, इसलिए वे टक्कर के लिए जांच नहीं करेंगे। B और C के बीच टकराव से किसी का ध्यान नहीं जाएगा।
क्रैकर

आप प्रत्येक व्यवहार्य टक्कर वस्तु को किसी प्रकार के संग्रह में रखकर एक समान विधि में चुपके कर सकते हैं, फिर केवल संग्रह में वस्तु के बाद आने वाली चीजों से टकराव की जाँच कर सकते हैं। IE: ए चेक बनाम बी, सी, डी; बी चेक सी, डी; सी। चेक बनाम डी। हर एक के पीछे की जाँच करने की आवश्यकता नहीं है क्योंकि यह पहले से ही पीछे की बारी से जाँच की गई थी। पूरी तरह से तत्व की टक्कर को लंघन के रूप में बहुत तेज़ नहीं है, लेकिन फिर भी उपयोगी है।
लूनिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.