2012-05-13 34 views
5

मेरे ऐप में मेरे पास एक ऐसा चरित्र है जिसमें पैर हैं और मैं इसे बनाना चाहता हूं ताकि मेरे ऐप में ऐसा लगता है कि यह एक और सीसीएसप्रेट के शीर्ष पर खड़ा है क्योंकि यह यूपी स्क्रीन (एनीमेशन) की यात्रा करता है। सब कुछ ठीक काम कर रहा है इसके अलावा एक छोटी स्थिति मुद्दा है कि मैं बस पता नहीं लगा सकता! जब मैं सीसीएसप्रिट के शीर्ष पर है, तो मुझे इस मुद्दे को थोड़ा और समझाएं, ऐसा लगता है जैसे चरित्र बहुत तेज़ अंतराल में लगभग 10 अंक ऊपर/नीचे चला जाता है।अन्य CCSprite के शीर्ष पर CCSprite पोजिशनिंग समस्या यह स्क्रीन को एनिमेट करती है?

क्या किसी को पता है कि यह क्यों हो रहा है?

धन्यवाद!

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

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

मेरे cocosGameLoop लॉग कोड का पता लगाने, लेकिन अभी भी खेल loop.f

में मैं अपने NSLogs में एक पैटर्न देखा है के रूप में आप नीचे देख सकते बाहर और टक्कर के सभी से पहले है:

2012-05-27 17:00:54.791 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.811 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.825 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.841 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.858 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.874 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.891 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.908 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.924 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.928 App[2769:707] collisiontwo 
2012-05-27 17:00:54.929 App[2769:707] two 
2012-05-27 17:00:54.941 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.944 App[2769:707] collisiontwo 
2012-05-27 17:00:54.945 App[2769:707] two 
2012-05-27 17:00:54.958 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.974 App[2769:707] cocosGameLoop 
2012-05-27 17:00:54.991 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.008 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.025 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.043 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.058 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.076 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.078 App[2769:707] collisiontwo 
2012-05-27 17:00:55.078 App[2769:707] two 
2012-05-27 17:00:55.091 App[2769:707] cocosGameLoop 
2012-05-27 17:00:55.094 App[2769:707] collisiontwo 

जब मैंने चरित्र वाई समन्वय एनएसएलओजी किया है तो यह भी देखा गया है कि यह कुछ इंटरैक्शन के लिए एक ही बिंदु के आसपास रहता है (यहां तक ​​कि जब इसे टकराया जाना चाहिए, तो यह उपरोक्त एनएसएलओजी में कोकोसगेम लूप कॉल के समूह के साथ मिल जाएगा), फिर कब यह वास्तव में टक्कर (प्रोग्रामेटिक रूप से) टकराता है, यह पहले वाई समन्वय से लगभग 14 अंक ऊपर चला जाता है। तो लगभग 14 अंक ऊपर/नीचे एक जिटर है।

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

आखिरकार, मैंने सोचा कि गुरुत्वाकर्षण की वजह से मेरे ऐप में गोल बिंदु त्रुटियां थीं, लेकिन जब भी मैंने गुरुत्वाकर्षण बल को एक पूर्णांक में बदलने जैसे मूल्यों के साथ गड़बड़ की, तो यह झटके को ठीक नहीं किया गया, इसलिए यह 100% मुद्दा मैंने उपरोक्त उल्लेख किया है।

वैसे भी, यह इस मुद्दे का दिल है और मुझे लगता है कि आप ऐसा कुछ देख सकते हैं जो मैं नहीं कर सकता! मुझे बताएं कि आप क्या सोचते हैं :)

बहुत बहुत धन्यवाद!

+0

क्षमा करें, लेकिन आपने जो कोय रखा है वह मुझे संदर्भ से बाहर कर रहा है। क्या आप WHOLE कथन को और नहीं दे सकते हैं। – Coder404

+0

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

+0

आपको शायद अपने टैग (यातायात में वृद्धि के लिए) में बॉक्स 2 डी जोड़ना चाहिए और – Coder404

उत्तर

3

पहली बात जो अजीब लगती है वह आपकी 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 पिक्सेल के क्षेत्र में है, तो यह विश्व की स्थिति बनाम स्क्रीन स्थिति की तलाश में लायक हो सकता है। इन मानों को लॉग इन करना प्रत्येक फ्रेम को डीबगर रोकने से जांचना बहुत आसान होगा।

+0

उपरोक्त मेरे संपादन 1 की जांच करें! –

+0

आपके अतिरिक्त विवरण के जवाब में मेरे उत्तर में अतिरिक्त विवरण प्रदान किए गए हैं :) –

+0

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