मैं टकराव का पता कैसे लगाऊं, इतनी तेज़ वस्तुओं को दीवारों से गुजरने की अनुमति नहीं है?


14

मैं एक 2d साइडक्रॉकरिंग शूटर बना रहा हूं, और मुझे गोलियों के लिए टक्कर का पता लगाने में थोड़ी परेशानी हो रही है। गोलियों सहित सब कुछ अपने स्वयं के बहुभुज / अद्यतन विधियों के साथ वस्तुएं हैं।

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

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


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

जवाबों:


9

मानक दृष्टिकोण हैं (एक चुनें):

  1. अपनी सीमा की चौड़ाई बढ़ाएँ और / या अपनी बुलेट की अधिकतम गति को कम करें ताकि यह एक भी अपडेट में दीवार के माध्यम से कभी भी कूद न सके (अधिकतम दूरी / न्यूनतम सीमा चौड़ाई का पता लगाने के लिए पाइथागोरस के एक बिट की आवश्यकता होती है);
  2. चलती वस्तु के आगे रैखिक (2) या प्लानेर (3 डी) सतहों के साथ टकराव का पता लगाने के लिए, आमतौर पर निरंतर टक्कर का पता लगाने (सीसीडी) का प्रदर्शन करें। यह अधिक महंगा है, लेकिन एक अधिक अच्छी तरह से गोल समाधान है। 2 डी लाइनों के खिलाफ Raycasting बहुत बुनियादी है, लेकिन आपको इस मामले में सीधे-सीधे बहुभुज के रूप में अपनी सभी सीमाओं को परिभाषित करने की आवश्यकता है।

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

मैं सहमत हूँ कि ज्यादातर परिस्थितियों में, टक्कर का पता लगाने के लिए ग्राफिक्स का उपयोग करना थोड़ा पथभ्रष्ट है, हालाँकि पिक्सेल-परफेक्ट टक्कर का पता लगाना बिल्कुल सही है, और यह एक स्वीकृत तकनीक है। मुझे लगता है कि यह सब इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं, और कितनी जल्दी। यदि आपको कई निकायों + क्रिया के साथ बहुत तेज़ गेम की आवश्यकता नहीं है, तो इसके लिए जाएं। ऊपर उल्लिखित दृष्टिकोणों में से एक का उपयोग करने के लिए बेहतर है।


महान जवाब के लिए धन्यवाद - आदर्श रूप से मुझे यह पसंद है कि मैं कई चलती निकायों के साथ तेजी से पुस्तक बनाऊं। कारण यह है कि मैं गोलियों को भौतिक वस्तुओं के रूप में मान रहा हूं ताकि वे गुरुत्वाकर्षण से प्रभावित हों, जैसे कि सब कुछ (जैसे कि गोली की गति के आधार पर थोड़ा नीचे चाप)। क्या यह इसे करने का एक अच्छा तरीका नहीं है? यह मेरा पहला खेल है, इसलिए मैं अभी भी सर्वोत्तम प्रथाओं के लिए शिकार कर रहा हूं। मैं भी एक परवलयिक समीकरण का उपयोग कर सकता था, लेकिन मुझे यकीन नहीं है कि मैं गोली के गति / लक्ष्य कोण से संबंधित गुणांक कैसे निर्धारित करूंगा
माला

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

हाँ, मुझे लगता है कि मैं बस गोलियों के लिए सीधी रेखाओं का उपयोग कर सकता हूं और शायद थोड़ा बाद में उन्हें नीचे की ओर बनाने का एक रास्ता खोजता हूं, अगर यह महत्वपूर्ण लगता है।
माला

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

3

यदि आप चाहते हैं कि आपकी गोलियां यथार्थवादी भौतिक वस्तुओं की तरह व्यवहार करें (जैसे कि आपकी गोलियां बंदूक-आग के बजाय एक गुलेल से तीर या पत्थर की तरह अधिक हैं), तो आप अपने भौतिकी-अपडेट की आवृत्ति बढ़ाने की भी कोशिश कर सकते हैं।

इसलिए जब आपका गेम 60 फ्रेम प्रति सेकंड के साथ चल सकता है, तो आपका भौतिक-सिमुलेशन प्रति सेकंड 120 अपडेट्स पर चल सकता है (यहां सर्वव्यापी लेख आपके टाइमस्टेप लेख को ठीक करता है जो एक अच्छा भौतिकी सेटअप बताता है जो रेंडर-लूप की तुलना में अलग गति से चल सकता है)।

बेशक, भौतिकी-इंजन पर अपडेट-अंतराल को बढ़ाने से सीपीयू पर बड़ा भार पड़ेगा। इसलिए यह दृष्टिकोण केवल समझदार है यदि आपके प्रोजेक्टाइल बहुत तेजी से आगे नहीं बढ़ रहे हैं (जो मैं मान रहा था क्योंकि आप यह बताने में सक्षम हैं कि आपके प्रोजेक्टाइल आर्क में बढ़ रहे हैं)।


धन्यवाद! मैं प्रभावी रूप से यह कर रहा हूं (साथ ही लाइन-आकार के प्रोजेक्टाइल का उपयोग कर रहा हूं) और उम्मीद कर रहा हूं कि यह संभव हो सके क्योंकि खेल अधिक जटिल हो जाता है
माला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.