2009-10-25 14 views
5

मैं एक परत में कई sprites के साथ एक खेल पर काम कर रहा हूं, और एक बार जब आप स्प्राइट को छूते हैं, तो यह कुछ करेगा।iphone z आदेश में cocos2d

मेरी समस्या ज़ेड ऑर्डर समस्या है, मेरे अधिकांश स्प्राइट्स ओवरलैपिंग कर रहे हैं और जब आप ओवरलैपिंग स्प्राइट्स को स्पर्श करते हैं, तो पीछे वाला एक (मुझे सबसे कम जेड ऑर्डर के साथ लगता है) इसके सामने प्रतिक्रिया करता है।

मुझे cocos2d के लिए z आदेश पर और अधिक समझने की आवश्यकता है।

मैं रनटाइम पर जेड ऑर्डर कैसे बदलूं?

धन्यवाद!

उत्तर

2

क्या आप 0.8 में जोड़े गए टच डिस्पैचर का उपयोग कर रहे हैं?

एक सिंगलटन जो v0.7.x (मानक) या उस समय एक स्पर्श (लक्ष्यित) में स्पर्श को प्रेषित करता है। लक्षित स्पर्शों का उपयोग करने के लाभ यह है कि आप केवल उस स्पर्श के ईवेंट (प्रारंभ, स्थानांतरित, समाप्ति, रद्द) प्राप्त करते हैं। लक्षित स्पर्शों का उपयोग करके मल्टी-टच और सिंगल-टच गेम दोनों में टच हैंडलिंग कोड को सरल बनाता है। जब तक आपको जटिल स्पर्श हैंडलिंग कोड की आवश्यकता न हो, तब तक लक्षित स्पर्शों का उपयोग करने की अनुशंसा की जाती है।

नए टचडिस्पैचर का एक अन्य लाभ यह है कि इसकी प्राथमिकता-कतार है, इसलिए आप स्पर्श उपभोक्ताओं की स्थिति को बदल सकते हैं।

आप जो चाहते हैं उसे पूरा करने के लिए प्राथमिकता-कतार का उपयोग कर सकते हैं। आप प्रत्येक स्प्राइट पर प्राथमिकता निर्धारित कर सकते हैं ताकि आप परिभाषित कर सकें कि कौन से स्प्राइट्स को पहले स्पर्श करने का जवाब देना चाहिए और क्या उन्हें स्पर्श करना चाहिए या इसे निगलना चाहिए ताकि इसे संभालने के बाद कुछ भी स्पर्श घटना न हो। http://code.google.com/p/cocos2d-iphone/source/browse/trunk/tests/TouchesTest (विशेष रूप से Paddle.m वर्ग)

अपने स्प्राइट वर्ग में onEnter विधि में आप संपर्क डिस्पैचर की प्राथमिकता निर्धारित कर सकते हैं:

Cocos2d परियोजना में छूता टेस्ट उदाहरण शायद सबसे अच्छी जगह देखने के लिए है :

- (void)onEnter 
{ 
    [[TouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; 
    [super onEnter]; 
} 

उच्च प्राथमिकता वाले प्रतिनिधि निम्न प्राथमिकता वाले लोगों से पहले जवाब देंगे।

+1

वास्तव में: कम प्राथमिकता पहले स्पर्श प्राप्त करेगी। 0 सबसे कम नहीं है, आप 0 से नीचे जा सकते हैं। इसलिए प्राथमिकता के लिए अपने जेड-ऑर्डर का उपयोग करने के लिए, ज़ेड-ऑर्डर * -1 को प्राथमिकता के रूप में लें और "उच्चतम" जेड-ऑर्डर पहले स्पर्श प्राप्त करेगा। – nash

5

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

यहां वह हिस्सा है जो वास्तव में मुझे परेशान करता था जब मुझे एक ही समस्या थी। जबकि ज़ेड ऑर्डर एक-दूसरे के शीर्ष पर उच्च संख्या रखता है, यह बिल्कुल स्पर्श के विपरीत है। कम प्राथमिकता संख्या वास्तव में पहले स्पर्श मिलती है। अपनी खुद की सैनिटी रखने के लिए, मैंने अपना कोड दोबारा दोहराया ताकि जब भी संभव हो, मैंने जेड इंडेक्स के समान क्रम में परतों को जोड़ा, इसलिए शीर्ष परतों के स्पर्श सहजता से व्यवहार करेंगे।

जब यह संभव नहीं है, तो मैं स्पर्श प्राथमिकता प्रणाली का उपयोग करता हूं, और मैं स्थिरांक परिभाषित करता हूं ताकि मैं बाद में भ्रमित न हो।कागज की परतों के रूप

-(void) registerWithTouchDispatcher { 
[[TouchDispatcher sharedDispatcher] addTargetedDelegate:self priority: DEFAULT_TOUCH_PRIORITY swallowsTouches:YES]; 

}

0

इसके बारे में लगता है कि: प्राथमिकता प्रणाली का उपयोग कर स्पर्श के लिए रजिस्टर करने के लिए निम्न का उपयोग करें। 1 0 के शीर्ष पर होगा 0 0 कहीं ऊपर है -5। 16 14 से ऊपर है। वह सब कुछ है, उच्च संख्याएं निम्न संख्याओं के शीर्ष पर हैं, चाहे आप ऋणात्मक संख्या या सकारात्मक संख्याओं का उपयोग करना चुनते हैं।