2 डी प्लेटफ़ॉर्म गेम में, खिलाड़ी को ढलान वाले मैदान पर कैसे आसानी से चलना सुनिश्चित करना है?


18

मैं एक 2D प्लेटफार्म गेम के लिए एक भौतिकी इंजन विकसित कर रहा हूं। मैं टकराव का पता लगाने के लिए अलग-अलग अक्ष प्रमेय का उपयोग कर रहा हूं। ग्राउंड सरफेस का निर्माण ओरिएंटेड बाउंडिंग बॉक्स से किया जाता है, खिलाड़ी के साथ एक्सिस एलाइनिंग बाउंडिंग बॉक्स होता है। (विशेष रूप से, मैं "रीयलटाइम कॉलिजन डिटेक्शन" पुस्तक से एल्गोरिथ्म का उपयोग कर रहा हूं, जो एसएटी का उपयोग करके ओबीबी के लिए बहने वाले टकराव का पता लगाता है)। मैं एक काफी छोटा (शून्य के करीब) का उपयोग कर रहा हूं, टक्कर की प्रतिक्रिया में पुनर्स्थापना गुणांक, यह सुनिश्चित करने के लिए कि गतिशील वस्तुएं पर्यावरण में प्रवेश नहीं करती हैं।

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

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

किसी भी सुझाव के लिए बहुत आभार होगा।


एक सामान्य भौतिकी इंजन प्रभाव और गिरने वाले बक्से और उस सभी के लिए बहुत अच्छा है, लेकिन चरित्र भौतिकी के लिए नहीं, जैसा कि उत्तर अनुभाग में दिया गया है। अपने चरित्र के लिए "स्थिर" भौतिकी लिखने पर विचार करें, ताकि आप नियंत्रण में 100% हो सकें, और बाकी के लिए ठीक से सिम्युलेटेड गतिशीलता का उपयोग कर सकें।
डोमी

जवाबों:


14

प्लेटफार्म और भौतिकी

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

हल उत्पन्न करें

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

आपको टाइल-आधारित खेलों में भी इसकी आवश्यकता है, या उन स्थितियों में जहां आपके पास फर्श के रूप में अन्य अभिनय के बगल में दो एएबीबी ऑब्जेक्ट हैं। टक्कर इंजन उन ऊर्ध्वाधर किनारों को उठाएगा और खिलाड़ी को उन पर पकड़ने का कारण बनेगा। ऐसे हैक हैं जो मदद कर सकते हैं, लेकिन समस्या को खत्म नहीं कर सकते। इसका समाधान सिर्फ एक एकल खंड है जिसमें पूर्ण 2D बॉक्स की बजाय सतह का प्रतिनिधित्व होता है।

आप एक दूसरे के खिलाफ बहुभुज को क्लिप करके और एक किनारे की सूची में क्लिप बिंदुओं को जोड़कर सामान्य मामले में पतवार उत्पन्न कर सकते हैं।

झुका हुआ सतसंग

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

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

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

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


आपके जवाब के लिए धन्यवाद। मैंने उन बॉक्सों को कम करने पर विचार किया था जो जमीन को लाइनों में दर्शाते हैं, लेकिन मुझे वास्तव में ऐसा नहीं लगता कि यह समस्या को ठीक करेगा। उदाहरण के लिए, यदि ग्राउंड बॉक्स अब लाइनें हैं, और यदि खिलाड़ी लाइन C पर खड़ा है और B की ओर बाईं ओर यात्रा कर रहा है, तो अशुद्धि के कारण यह संभव है कि खिलाड़ी बॉक्स लाइन C से थोड़ा नीचे हो। फिर, खिलाड़ी बॉक्स के बाएं किनारे लाइन बी के साथ अभी भी टकरा सकता है और उस अवांछनीय टक्कर का कारण बन सकता है,
निक कोवाक

जब तक ऐसा होने से रोकने के लिए कुछ अन्य तंत्र नहीं है। यह तथ्य नहीं है कि बॉक्स 2 डी समस्या को ठीक करने वाले बक्से के बजाय लाइनों का उपयोग करता है, यह है कि बॉक्स 2 डी एक श्रृंखला आकार का उपयोग करता है, जो कुछ टकरावों को रोकने के लिए लाइन खंडों के बीच कनेक्टिविटी जानकारी का उपयोग करता है। इस समय मुख्य समस्या यह है कि यह वास्तव में यह कैसे करता है के विवरणों को मैं बिल्कुल नहीं समझता।
निक कोवाक

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

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

हम्म ... मुझे नहीं लगता कि मैं अनुसरण करता हूं। मेरे आरेख में, अगर मैं किनारों को एक निर्बाध आकार बनाने के लिए एक साथ श्रृंखला करता हूं, तो मुझे तीन पंक्ति खंडों से बना एक आकार मिलेगा: बक्से का शीर्ष A, B, और C, सही? हालांकि यह एक एकल आकार है, फिर भी मुझे लाइन ए के खिलाफ अलग से टकराव का पता लगाने की आवश्यकता होगी, फिर बी, फिर सी, क्या मैं नहीं? जब तक आपका मतलब एक एल्गोरिथ्म नहीं था जो बॉक्स और इस संयुक्त आकार के बीच टकराव का पता लगा सकता है? मुझे लगता है कि यह नहीं होगा सैट तब, क्योंकि किनारों की एक श्रृंखला अवतल हो सकती है?
निक कोवाक

5

मुझे लगता है कि टकराव प्रतिक्रिया उद्देश्यों के लिए, आपके बक्से का इलाज करके दोनों समस्याओं को हल किया जा सकता है, जैसे कि उन्होंने गोल कोनों (आपकी संख्यात्मक त्रुटि के लिए एक समान त्रिज्या के)। यह ए और बी, और बी और सी, चिकनी के बीच बैठक कोनों की प्रभावी संयुक्त सतह बना देगा।

इस प्रकार यदि PLAYER बाईं ओर A के कोने से टकराता है, तो टक्कर सामान्य रूप से दाएं की बजाय विकर्ण होगी, इसलिए बाएं-और-अप गति को जारी रखने की अनुमति मिलती है।


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

आप कहते हैं कि आप OBBs के लिए विशेष रूप से टकराव एल्गोरिथ्म का उपयोग कर रहे हैं, लेकिन आपको अभी भी सक्षम होना चाहिए, OBB-OBB टक्कर का पता लगाने के बाद, एक आकृति के विरुद्ध एक और परीक्षण का उपयोग करें जो पूरी तरह से OBB के भीतर है।


हम्म, दिलचस्प विचार ... आप इसे कैसे लागू करेंगे? हालांकि यह बॉक्स का उपयोग करने की सादगी के खिलाफ कुछ हद तक जाता है: (मैं सहमत हूं कि ऐसा लगता है कि यह एक निश्चित समाधान के साथ एक सामान्य मुद्दा होना चाहिए, लेकिन मुझे इसके बारे में कोई कवरेज नहीं मिल सकता है ... इसके अलावा क्या किया जा रहा है Box2D में। मुझे उम्मीद है कि अधिक जानकारी पाने के लिए उनके मंच पर इसी तरह का एक प्रश्न पोस्ट किया।
निक कोवाक

मेरे पास कोई कार्यान्वयन विवरण नहीं है, क्षमा करें - मैं इस प्रकार के भौतिकी इंजन कोड का विशेषज्ञ नहीं हूं। हालांकि, मेरे पास एक समाधान के लिए एक बेहतर विचार था जो ठगना कारकों पर आधारित नहीं है - मेरा संपादन देखें।
केविन रीड

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

लेजेज: डी'ओह! ठीक है, उतना आसान नहीं जितना मैं सोच रहा था।
केविन रीड

हाँ, इसके बारे में सोचने के बाद, कैप्सूल दृष्टिकोण शायद 2 डी प्लेटफ़ॉर्मर के बजाय 3 डी गेम के लिए अधिक अनुकूल है। पिक्सेल परफेक्ट कंट्रोल होना निश्चित रूप से मेरे लिए प्राथमिकता है (जैसा कि उन सभी पुराने 2 डी प्लेटफॉर्म में था)। लेकिन एक समाधान होना चाहिए जो बक्से का उपयोग करने की अनुमति देता है!
निक कोवाक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.