पहली बात जो अजीब लगती है वह आपकी Some other tag collision checking before
टिप्पणी के बाद टैग की जांच है। जैसे -
else if ((spriteA.tag == 1 && spriteB.tag == 5) || (spriteB.tag == 1 && spriteA.tag == 5))
...
else if ((spriteA.tag == 6 && spriteB.tag == 1) || (spriteB.tag == 6 && spriteA.tag == 1))
...
यानी यह मानता है कि टक्कर संपर्क के खिलाफ परीक्षण कर रहे हैं तो आपके पास दो निकायों में या तो आदेश दे सकता है: यह अधिक मतलब होगा चरित्र और जमीन कहने के लिए दो वस्तुओं के लिए, संपर्क श्रोता शरीर ए के रूप में जमीन और शरीर बी के रूप में पैर या शरीर ए के रूप में पैर और शरीर बी के रूप में जमीन दे सकता है।ऊपर दिया गया बयान गारंटी देगा कि आदेश के बावजूद, आप एक ही सशर्त ब्लॉक निष्पादित करते हैं। क्या यह संभव है कि आपका निष्पादन पथ दो else if
ब्लॉक के बीच हो रहा है और इसलिए गलत ब्लॉक में जाने पर गलत स्थिति निर्धारित कर रहा है?
ठीक है, तो यह मानते हुए कि ये सशर्त सभी सही हैं (और मैं बस यह नहीं देख सकता क्योंकि मुझे नहीं पता कि टैग कौन से निकायों को संदर्भित करता है, संपर्क श्रोता कैसे स्थापित किया गया है आदि), फिर आवेश भौतिकी सिमुलेशन के कारण होना चाहिए। क्या होता है जब आप Box2D के साथ Cocos2d में CCSprite की स्थिति निर्धारित करते हैं? क्या स्प्राइट की स्थिति को स्थापित करने से भौतिकी निकाय की स्थिति भी बदल जाती है, या दो अलग होते हैं (आमतौर पर भौतिकी शरीर के स्थान पर स्प्राइट के साथ)? यह थोड़ी देर के बाद से मैंने कोकोस 2 डी का उपयोग किया था, और शुरुआती दिनों से यह काफी बदल गया है, इसलिए मुझे नवीनतम संस्करण खोलने और एक नज़र डालने के बिना इस पर यकीन नहीं है। यदि सीसीएसप्रिट की स्थिति बदलना भौतिक विज्ञान निकाय की स्थिति को भी बदल रहा है, तो यह करना एक बुरी चीज है - सभी आंदोलन भौतिकी सिमुलेशन द्वारा नियंत्रित किया जाना चाहिए (इसलिए यदि आप भौतिकी शरीर को चारों ओर ले जाना चाहते हैं, तो आपको होना चाहिए बल या आवेग लागू करना, स्थिति को सीधे सेट नहीं करना)। भौतिकी के बाहर शरीर की स्थिति बदलने से शरीर के लिए लागू होने वाले असंतोष या गलत आवेगों का कारण बन जाएगा जब भौतिकी सिमुलेशन का अगला चरण चलता है। यदि आप भौतिकी सिमुलेशन को परेशान किए बिना एक स्प्राइट की स्थिति बदलना चाहते हैं, तो उस समय भौतिकी सिमुलेशन से उस स्प्राइट से जुड़े भौतिकी निकाय को हटाने पर विचार करें, जब भी आप स्थिति को सीधे सेट करना चाहते हैं, और उसके बाद इसे बाद में दोबारा जोड़ दें यदि आप इसे भौतिकी के तहत कार्य करना चाहते हैं। इसका अर्थ यह हो सकता है कि भौतिकी के शरीर को हटाने और इसे बाद में पुन: प्रयास करना अगर भौतिकी दुनिया से इसे जोड़ने/निकालने का कोई साफ तरीका नहीं है।
एक और समाधान उन निकायों के बीच संयुक्त बनाना होगा जिन्हें आप एक साथ स्थानांतरित करना चाहते हैं। एक दूरी में शामिल या वेल्ड संयुक्त सबसे उपयुक्त होगा। इससे उन्हें जुड़े रहने का कारण बन जाएगा, इसलिए जब आप एक को चारों ओर ले जाते हैं तो दूसरा भी आगे बढ़ेगा, दोनों निकायों के बीच एक ही दूरी बनाए रखेगा। इस मामले में, वे दोनों भौतिकी सिमुलेशन के तहत काम करेंगे।
दरअसल, बस मेरे पास हुआ कि आप चरित्र और सीसीएसप्रेट दोनों के भौतिकी निकायों की स्थिति बदल रहे हैं जो यह शीर्ष पर खड़ा है। इस मामले में, न केवल यह बुरा है क्योंकि भौतिकी सिमुलेशन नियंत्रण में नहीं है, लेकिन आपकी स्थिति की गणना भी दोनों निकायों को थोड़ा ओवरलैप कर सकती है, इसलिए जब भौतिकी अनुकरण अगले भाग में चलता है तो यह दोनों निकायों के लिए एक बड़ी शक्ति लागू करता है उन्हें अलग करने के लिए, लेकिन फिर आप पदों को फिर से ओवरलैप करने के लिए बदलते हैं ताकि अगला अपडेट फिर से एक बड़ी ताकत में हो।
यदि आपकी सीसीएसप्रेट की स्थिति बदल रही है तो वास्तव में भौतिकी निकाय की स्थिति में बदलाव नहीं कर रहा है, और आप मूल रूप से केवल खिलाड़ी की रेंडर स्थिति को एक अलग स्थिति में स्थापित कर रहे हैं जहां भौतिकी शरीर में है दुनिया, तो आपको भौतिकी निकाय के साथ क्या हो रहा है पर विचार करने की जरूरत है। क्या यह दुनिया भर से गिर रहा है, कुछ अन्य वस्तुओं या कुछ और के बीच घूम रहा है? मेरे खेल के बारे में और जानने के बिना मेरे साथ क्या हो रहा है यह तय करना मेरे लिए मुश्किल है। लेकिन इससे क्या हो रहा है आपकी स्थिति की गणना को प्रभावित कर सकता है। भौतिकी दुनिया से भौतिकी वस्तु को हटाने पर विचार करें यदि आप भौतिकी सिमुलेशन के अधीन होने के बिना sprites के चारों ओर स्थानांतरित करना चाहते हैं। भौतिकी निकायों से निपटने के दौरान किसी प्रकार का डीबग ड्रॉ अमूल्य है, इसलिए आप अपने शरीर के किसी भी आकार या स्थिति को देख सकते हैं और यह किसी भी अपने स्वयं के sprites या अन्य कलाकृति के बावजूद बातचीत कर रहा है। यह सुनिश्चित नहीं है कि कोकोस 2 डी/बॉक्स 2 डी कॉम्बो बॉक्स से बाहर प्रदान करता है, लेकिन यदि नहीं, तो इसे लागू करने पर दृढ़ता से विचार करें, इसे चालू/बंद करने का एक आसान तरीका है।विचार करने के लिए
एक और बात दो बयान कर रहे हैं:
if (spriteA.position.x - spriteA.boundingBox.size.height*.5 <= spriteB.position.x + spriteB.boundingBox.size.height*.5)
और
if (spriteB.position.x - spriteB.boundingBox.size.height*.5 <= spriteA.position.x + spriteA.boundingBox.size.height*.5)
, तो आप उन दो बयानों को दूर करने की कोशिश की है कि आप एक नया स्थिति हर फ्रेम के बजाय इंतजार कर सेट इतना है कि कुछ फ्रेम पर निर्माण करने की स्थिति में कुछ त्रुटि के लिए? यदि आप एक ऑब्जेक्ट को चारों ओर ले जा रहे हैं और आप चाहते हैं कि दूसरे दृढ़ता से जुड़े हुए हों, तो आप प्रत्येक फ्रेम को स्थिति अपडेट करना चाहते हैं। यह हो सकता है कि आप केवल इस सशर्त को हर 30 में से 10 फ्रेमों को पार कर रहे हैं, इसलिए 30 एफपीएस मानते हुए यह आपके इच्छित चिकनी आंदोलन के विपरीत एक बहुत ही दृश्यमान झटकेदार आंदोलन देगा।
आशा है कि उपरोक्त वर्णित कुछ आपके मुद्दे को हल करता है, या कम से कम आपको कहां दिखना शुरू करना है इसका बेहतर विचार देता है। अपने प्रश्न में और अधिक जानकारी उपलब्ध कराना - शायद मान्यताओं/अज्ञात है कि मैं उल्लेख किया है में से कुछ का जवाब - हमें अपनी समस्याओं :)
संपादित करें 1
हमें भरने के लिए धन्यवाद की तह तक पहुंचने की मदद करनी चाहिए अतिरिक्त विवरण के साथ - जो चीजों को और अधिक स्पष्ट बनाता है। आप जो कर रहे हैं वह अब पूरी समझ में आता है कि मुझे पता है कि आप केवल बॉक्स 2 डी के साथ टकराव का पता लगा रहे हैं।
मैं कहूंगा कि आपकी समस्या को ठीक करने के लिए, अपने for
लूप में जहां आप संपर्कों को देखते हैं, जहां आप उस संपर्क को पहचानते हैं, आपको इस बिंदु पर चरित्र की स्थिति बदलने के बजाय ध्वज सेट करना चाहिए जैसे BOOL characterOnPlatform
- जब संपर्क पता चला है तो इसे YES
पर सेट करें। उस for
लूप के बाहर (जरूरी नहीं कि एक ही विधि में - यह कहीं भी हो सकता है जिसे हर फ्रेम कहा जाता है, और जहां भी अधिक समझ में आता है) आप उस ध्वज की जांच करेंगे और characterOnPlatfom == YES
, तो चरित्र की स्थिति को स्थिति गणना में सेट करें आप वर्तमान में संपर्क श्रोता for
पाश में कर रहे हैं। यानी संपर्क श्रोता for
लूप में कुछ भी नहीं करें को छोड़कर कुछ राज्य बदलें जो आप कहीं और देखेंगे।
वह परिवर्तन आपके चरित्र को मंच के साथ बिल्कुल ठीक कर देगा। यदि आप अभी भी चरित्र को मंच से कूदने में सक्षम होना चाहते हैं, तो आपको उस ध्वज को NO
पर सेट करना होगा यदि खिलाड़ी कूद जैसे इनपुट करता है, अन्यथा उनके वांछित आंदोलन को हम उन्हें स्थिति में मजबूर कर देंगे प्लैटफ़ार्म पर।
संपादित 2
यह वास्तव में संभव देखने के लिए वास्तव में क्या अपने नए कोड के साथ हो रहा है है। उदाहरण के लिए, आपके resetgravity
विधि में क्या चल रहा है? आप hasCollided
को NO पर कैसे सेट करते हैं (यानी आप प्लेटफ़ॉर्म पर अब वर्ण का पता कैसे लगाते हैं)? क्या आपका चरित्र अभी भी ऊपर और नीचे गति में झटकेदार है, या क्या आप पहले से अलग झटका लग रहे हैं?
मान लीजिए कि आप अभी भी ऊपर और नीचे आंदोलन प्राप्त कर रहे हैं, मुझे अभी भी उम्मीद है कि यह आपके द्वारा पोस्ट किए गए कोड के कारण होगा, प्रत्येक फ्रेम को नहीं कहा जा रहा है, या यह किसी अन्य स्थिति कोड से लड़ रहा है (उदाहरण के लिए जहां भी आप खिलाड़ी के इनपुट के जवाब में चरित्र को स्थानांतरित करते हैं, जहां आप गुरुत्वाकर्षण आदि लागू करते हैं)।
सुनिश्चित करें कि प्लेटफॉर्म पर चरित्र रखने वाला कोड स्थिति को बहुत अधिक सेट नहीं करता है और प्लेटफ़ॉर्म पर नहीं के रूप में वर्ण का पता लगाता है, तब आप एक दुष्चक्र में समाप्त हो जाएंगे:
- चरित्र मंच से टकरा
- चरित्र की स्थिति अभी
- चरित्र नहीं रह गया है मंच के साथ टकराने है मंच से ऊपर हो सेट है, इसलिए स्थिति कोड मंच पर उसे बदलने के लिए
- चरित्र नीचे की ओर गिर जाता है नहीं चलता देय गुरुत्वाकर्षण के प्रभाव (या तथापि आप इस अनुकरण)
- चरित्र मंच
- से टकरा ...
अगर ऐसी बात है, तो आप जब चरित्र टकराने नहीं है का पता लगाने में सुधार की आवश्यकता मंच के साथ, या अपने पोजीशनिंग कोड को ऑफसेट करें ताकि चरित्र प्लेटफ़ॉर्म के साथ थोड़ा अंतर कर रहा हो (यदि यह दृष्टि से खराब दिखता है, तो आप बॉक्स 2 डी आकार से थोड़ा सा स्प्राइट ऑफसेट करना चाहते हैं, ताकि भौतिकी शरीर प्लेटफॉर्म के साथ थोड़ा अंतर कर सके लेकिन चरित्र के पैर बिल्कुल मंच पर दिखाई देते हैं।
संपादित 3
ऐसा लगता है कि आप चीजों को कि jittering कारण हो सकता है की एक बहुत कुछ की संभावना से इनकार कर दिया है! मैंने एक और गेम डेवलपर से पूछा और उसने सुझाव दिया कि आपकी समस्या संभवतः विश्व अंतरिक्ष से स्क्रीन स्पेस के रूपांतरण के कारण हो सकती है। तो आप अपने चरित्र की दुनिया की स्थिति को लॉग आउट करने का प्रयास कर सकते हैं, और स्क्रीन की स्थिति जहां इसे प्रस्तुत किया जाता है (इसका मतलब यह हो सकता है कि यह रूपांतरण कोकोस 2 डी में बदल रहा है)। लॉग इन किए गए मूल्यों को कम से कम देखकर कम से कम कुछ मूल्यों को कम करने में मदद मिल सकती है जो झटकेदार/ओसीलेटरिंग हैं। आप किसी भी गोलाकार बिंदु त्रुटियों की भी तलाश कर सकते हैं जिन्हें आप उदाहरण के लिए प्रस्तुत कर सकते हैं उदाहरण के लिए पूर्णांक के लिए फ़्लोटिंग पॉइंट परिशुद्धता को छोटा करना। यदि आपका झटकेदार दिखता है तो यह केवल + या - 1 पिक्सेल के क्षेत्र में है, तो यह विश्व की स्थिति बनाम स्क्रीन स्थिति की तलाश में लायक हो सकता है। इन मानों को लॉग इन करना प्रत्येक फ्रेम को डीबगर रोकने से जांचना बहुत आसान होगा।
क्षमा करें, लेकिन आपने जो कोय रखा है वह मुझे संदर्भ से बाहर कर रहा है। क्या आप WHOLE कथन को और नहीं दे सकते हैं। – Coder404
मैंने अधिक संदर्भ प्रदान करने के लिए कुछ और कोड जोड़ा। बड़ी टिप्पणी के बाहर लाइन के अलावा यह एक और के साथ शुरू होता है अगर मेरे पास टकराव का पता लगाने के लिए बयान है तो मेरे पास कुछ और है लेकिन इस मुद्दे में प्रासंगिक नहीं हैं। –
आपको शायद अपने टैग (यातायात में वृद्धि के लिए) में बॉक्स 2 डी जोड़ना चाहिए और – Coder404