मैं एक 2 डी प्लेटफ़ॉर्मर में खिलाड़ी को कुचलने का पता कैसे लगा सकता हूं?


19

मैं एक platformer चरित्र के लिए टक्कर की जाँच कर रहा हूँ जैसा कि # 1 में दिखाया गया है। लाल डॉट्स ऐसे पिक्सेल होते हैं जिनकी जाँच की जाती है और ग्रे लाइन उन अक्षों को इंगित करती है जिनसे वे संबंधित होते हैं। मुझे इस तरह से टकराव की जाँच से मिलने वाले परिणाम पसंद हैं (बनाम, कहते हैं, बाउंडिंग बॉक्स)। सब कुछ ठीक वैसे ही काम करता है जैसे मैं एक समस्या को छोड़कर इसे पसंद करता हूं: क्रश डिटेक्शन।

निम्नलिखित छवियों में, हल्का नीला बॉक्स जमीन का प्रतिनिधित्व करता है, नारंगी बॉक्स एक वस्तु है, और तीर आंदोलन की दिशा का संकेत देते हैं।

जब खिलाड़ी को कुचल दिया जाता है, तो यह पता लगाने का सरल उपाय है कि क्या विपरीत पक्षों पर टकराव के बिंदु दोनों ट्रिगर होते हैं। यदि वे हैं, तो खिलाड़ी को कुचल दिया जा रहा है। # 2 में, आप एक सामान्य क्रश परिदृश्य देख सकते हैं। खिलाड़ी मैदान में है और शीर्ष टकराव के बिंदु गिरने वाली वस्तु के साथ प्रतिच्छेद कर रहे हैं। यह एक क्रश चलाता है।

# 3, 4, और 5 वर्तमान समस्याग्रस्त परिदृश्य। # 3 में, खिलाड़ी ऑब्जेक्ट की ओर बढ़ रहा है, जो ऊपर जा रहा है। राइट-साइड टक्कर बिंदु ऑब्जेक्ट को मार रहा है, जिससे टकराव होता है और खिलाड़ी को रोकता है।

अब, यदि ऑब्जेक्ट आगे बढ़ना जारी रखता है और खिलाड़ी सही चलता रहता है (जैसा कि # 4 में दिखाया गया है), ऑब्जेक्ट खिलाड़ियों को राइट-साइड टकराव बिंदु को साफ करता है और खिलाड़ी दाईं ओर ले जाता है। लेकिन अब, ऐसा करने से, वस्तु एक शीर्ष टक्कर बिंदु को काट रही है, जिससे अवांछित ऊर्ध्वाधर क्रश होता है।

एक समान परिदृश्य # 5 में दिखाया गया है। नीचे के टकराव बिंदुओं को साफ करने के लिए दो वस्तुएं काफी दूर हैं, जिससे खिलाड़ी गिर सकता है, लेकिन अभी तक कोई भी पक्ष टक्कर बिंदुओं को साफ करने की अनुमति नहीं देता है, जिससे अवांछित क्षैतिज क्रश होता है।

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

यहाँ छवि विवरण दर्ज करें

कुछ भ्रम को दूर करने के लिए, लाल टकराव बिंदु स्प्राइट के भीतर होगा और ग्रे लाइनों का उपयोग केवल प्रत्येक टकराव बिंदु के लिए प्रासंगिक अक्ष को दर्शाने के लिए किया जाता था। उदाहरण के लिए, यदि चरित्र का स्प्राइट एक साधारण हरा वर्ग होता, तो टक्कर बिंदु कुछ इस तरह दिखाई देते:

यहाँ छवि विवरण दर्ज करें

जवाबों:


34

मुझे लगता है कि आपको बॉक्स के आंदोलन को ध्यान में रखना होगा । यही है, केवल तभी क्रश करें यदि बॉक्स खिलाड़ी की ओर बढ़ रहा है।

यह platformers में अन्य समस्याओं के समान है, जहां आंदोलन महत्वपूर्ण है। प्लेटफ़ॉर्म के लिए जैसे कि आप नीचे और ऊपर से कूद सकते हैं, यदि खिलाड़ी ऊपर की ओर बढ़ रहा है तो टकराव की जांच न करें।

तो एक ब्लॉक खिलाड़ी को ऊपर से ही कुचल सकता है यदि ब्लॉक नीचे की ओर बढ़ रहा हो; नीचे से केवल अगर ब्लॉक ऊपर की ओर बढ़ रहा है; बाईं ओर से केवल अगर ब्लॉक दाईं ओर बढ़ रहा है, और इसी तरह।


13
+1 यह ध्यान में रखें कि ब्लॉक यहां कार्य कर रहा है, खिलाड़ी नहीं। इसलिए यदि आप चेक करते हैं कि क्या बॉक्स खिलाड़ी को कुचलने के बजाय जाँच कर रहा है कि क्या खिलाड़ी को कुचल दिया जा रहा है तो समस्या को हल करना आसान होना चाहिए
नील्स

जब ब्लॉक हिल नहीं रहे हैं तो क्या होगा? मुझे अब एहसास हुआ कि मैंने # 5 में ब्लॉकों पर तीर लगाया, लेकिन इसका मतलब दो स्थिर ब्लॉक होना था।
इलानलर्सन

यदि आप तय करते हैं कि स्थिर ब्लॉकों को क्रश नहीं करना चाहिए, बस सुनिश्चित करें कि खिलाड़ी फंस नहीं रहा है और रास्ते से हट सकता है।
कॉन्गसबोंगस

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

9

"क्रश टेस्ट" अंक आपकी छवि # 1 में दिखाए गए ग्रे बॉक्स के अंदर हों - यानी खिलाड़ी को तभी मारें जब आप वहां के किसी पिक्स पर हिट का पता लगा लें।


1
क्या आप का मतलब है कि क्रश चेक पॉइंट्स को "अंदर" टकराव के बिंदुओं की सीमा के अलावा? मेरे द्वारा देखी जाने वाली समस्या यह है कि टक्कर का रिज़ॉल्यूशन प्रत्येक धुरी में तब होगा जब टकराव बिंदुओं में से एक "ट्रिगर" होगा, इससे पहले कि ऑब्जेक्ट को अंदर के क्रश चेक पॉइंट तक पहुंचने का मौका मिलता है।
इयानलर्सन

6

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

इसे ध्यान में रखते हुए, क्षैतिज और ऊर्ध्वाधर टक्कर के लिए अलग-अलग बिंदु होने का विचार बस नहीं उड़ता है। तो आपके मामले 3 और 5 मौजूद नहीं हैं।

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

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


3
मामूली बिंदु - आप नहीं जानते कि उसका प्रेत कैसा दिखता है। सभी के लिए हम जानते हैं कि यह ऊपर की छवियों में दिखाया जा सकता है, इसलिए 3 और 5 पूरी तरह से मान्य हो सकते हैं।
एलेक्स

1
एलेक्स सही है। मैंने स्पष्ट करने के लिए एक संपादन किया। मैं मानता हूँ कि अनिश्चित टकराव बक्से से बदतर कुछ भी नहीं है। मुझे लगता है कि मैं अलग-अलग अक्षों के लिए अलग-अलग बिंदुओं का उपयोग नहीं करने के बारे में आपकी बात समझता हूं। अगर मैं करता हूं, तो उपरोक्त उदाहरण आठ बिंदुओं से लेकर चार तक, प्रत्येक कोने में एक, सही होगा? मैंने वास्तव में उस के साथ कुछ परीक्षण किया है (वांछनीय परिणामों से कम के साथ), लेकिन मैं ऐसा करने में बहुत संकोच कर रहा हूं, क्योंकि कोनों को "अलग" करने से वह व्यवहार प्राप्त होता है जो मैं लगभग पूरी तरह से देख रहा हूं। ये वास्तव में एकमात्र समस्या परिदृश्य हैं जिन्हें मैंने चलाया है।
इलानलर्सन

0

आप ऑब्जेक्ट को जमीन की तुलना में "कठिन" बना सकते हैं, जिसका अर्थ है कि टकराव को मानते हुए, खिलाड़ी को "जमीन" में धकेल दिया जाता है, जैसा कि चलती वस्तु में धकेल दिया जाता है।

यह मानता है कि खिलाड़ी खुद को "या तो वस्तुओं या मैदान में" धकेलने में सक्षम नहीं है।


0

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

BTW, यदि केवल सीमित संख्या में आकृतियों के संयोजन टकरा सकते हैं, तो यह "टकराव का पता लगाने" के बिटमैप्स की पूर्व-गणना करने के लिए उपयोगी हो सकता है, जैसे कि यदि कोई पिक्सेल ऑफसेट में पहले सेट किया जाता है (X1, y1) और दूसरे में दूसरे के ऑफसेट (x2, y2) पर, ऑफसेट (X1-x2, y1-y2) पर पिक्सेल को टक्कर के नक्शे में सेट किया जाएगा। इस तरह की पूर्व-गणना की गई टक्कर का नक्शा टकराव के नक्शे में एकल पिक्सेल की स्थिति की जांच करके दोनों स्प्राइट्स के बीच टकराव का पता लगाना संभव बनाता है।


0

एक खिलाड़ी को कुचलने के लिए दो ऑब्जेक्ट लगते हैं। आपके क्रश का पता लगाने के लिए खिलाड़ी को दो वस्तुओं के बीच होना चाहिए, उनके बीच का स्थान खिलाड़ी के आकार के बराबर होना चाहिए, और दूरी घटती जाएगी।


0

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

विचार यह है: कोल्हू चल रहा है या नहीं यह जांचने के लिए क्यों हम वास्तव में परवाह करते हैं यदि चरित्र चल रहा है। दोनों जवाब दे सकते हैं कि क्रश चरित्र के आंदोलन के कारण गलत है या क्रशर ऑब्जेक्ट आंदोलन द्वारा सही क्रश है।

यदि चरित्र आगे बढ़ रहा है और कुचला हुआ है (आने वाले फ्रेम के लिए विरोधी पक्षों पर टकराव) तो अंतिम फ्रेम / पुनरावृत्ति निर्देशांक पर क्रश के लिए फिर से जांचें:

  1. यदि फिर से पुष्टि नहीं की जाती है, तो यह चरित्र के अपने आंदोलन के कारण है और चरित्र को अंतिम फ्रेम पर लौटाया जाना चाहिए / पुनरावृत्ति निर्देशांक केवल एक टक्कर की तरह है

  2. यदि दूसरी बार क्रश की पुष्टि हो जाती है तो क्रश के साथ आगे बढ़ें।

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