2011-10-18 24 views
11

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

  1. मुख्य चरित्र वह नीचे बाएँ कोने में एक आर्चर जो चारों ओर ले जाने नहीं करता है, को छोड़कर वह अपने शरीर के ऊपरी हिस्से के लिए कदम है क्योंकि आप जहां कोण शूटिंग कर रहे हैं के कोण बदलने के लिए की आवश्यकता होगी ..

  2. दुश्मनों की छड़ी के आंकड़े आप पर आते हैं जिनके पास टक्कर का पता लगाना पड़ता है और एक तीर स्प्राइट द्वारा गोली मार दी जाती है।

मुझे 1 और 2 कदम कैसे बनाना चाहिए? क्या मुझे एंकर पॉइंट्स मास्टर करना चाहिए और उनको इस्तेमाल करना चाहिए? (मुझे वास्तव में बेवकूफ एंकरपॉइंट्स से नफरत है जो काम करने के लिए बहुत कठिन हैं ... लेकिन अगर वे बेहतर होते हैं तो मैं इनका उपयोग करूंगा) या कई एनिमेशन बनाते हैं, या क्या कई स्प्राइट्स को एक ही आंदोलन में गठबंधन करने का एक और आसान तरीका है?

उत्तर

44

मेरी सामान्य सलाह: कभी भी डिफ़ॉल्ट एंकरपॉइंट (0.5 एफ, 0.5 एफ) को कभी भी संशोधित न करें, जब तक कि आपके पास यह वास्तव में अच्छी समझ न हो कि यह क्या करता है और यह आपको चीजों को पूरा करने में कैसे मदद करता है। अन्य सभी मामलों में, स्थिति संपत्ति को संशोधित करें।

विशेष रूप से यदि आप बाध्यकारी बॉक्स या त्रिज्या आधारित टकराव का पता लगाते हैं, तो एंकर पॉइंट को संशोधित करने से काउंटर-उत्पादक होता है।

के अपने आयताकार स्प्राइट छवि एक डिफ़ॉल्ट लंगर बिंदु है, जो बनावट के केंद्र में है का उपयोग करता है मान लेते हैं:

._______. 
|  | 
|  | 
| * | 
|  | 
|  | 
°-------° 

* बनावट की anchorPoint चिह्नित करता है। यदि आप इस स्प्राइट को स्थिति (250, 100) पर रखते हैं तो स्प्राइट का एंकरपॉइंट समन्वय (250, 100) पर होगा।

के आप (0.1f, 0.1f) करने के लिए ले जाने के anchorPoint मान लीजिए:

._______. 
    |  | 
. |  . | 
    |  | 
    |  | 
    | *  | 
    °-------° 

°  ° 

स्प्राइट की स्थिति (250, 100) पर अपरिवर्तित रहता है। एंकरपॉइंट स्थिति भी बदलती नहीं है। क्या परिवर्तन इस बिंदु के आसपास बनावट केंद्रित है। फ़्लोटिंग डॉट्स को देखकर एंकर पॉइंट को संशोधित करने से पहले आप पिछली छवि स्थिति देख सकते हैं। असल में, एंकरपॉइंट को संशोधित करके आप जो भी करते हैं वह है (ऑफसेट) जहां नोड की बनावट नोड की स्थिति के सापेक्ष खींची जाती है।

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

इसके अलावा, घूर्णन या स्केलिंग हमेशा एंकरपॉइंट पर केंद्रित होगी। एंकरपॉइंट को संशोधित करने से नोड्स घूर्णन या स्केलिंग के दौरान अवांछित व्यवहार हो सकता है।

     ._______. 
        |  | 
        |  | 
        |  | 
    *     |  | 
        |  | 
        °-------° 

कि स्प्राइट की स्थिति इसका मतलब है कि जहां वास्तविक के बाईं ओर दूर ऑफसेट है:

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

आपका गेम विकसित करना बहुत आसान होगा यदि आप यह सुनिश्चित कर सकते हैं कि स्प्राइट की स्थिति हमेशा अपने बनावट के केंद्र में है, कुछ मनमाना बिंदु के बजाय कि आप कुछ डीबग ड्राइंग की सहायता के बिना भी नहीं देख सकते हैं।

प्रश्न बना रहता है:

जब आप लंगर बिंदु को संशोधित करना चाहते हैं?

मैं केवल निम्न परिस्थितियों में ऐसा कर लिया, और अन्य सभी स्थितियों में यह से बचने:

  1. स्क्रीन/विंडो सीमाओं या इसी तरह
  2. सही करने के लिए के साथ गैर-एनिमेटेड बनावट संरेखित करने के लिए/नोड स्थिति को संशोधित किए बिना संशोधित छवि (यानी कलाकार अपडेट) को संरेखित करने के लिए बाएं/ऊपर/नीचे लेबल, बटन या छवि
  3. संरेखित करें।

1) समझाना आसान है। मान लें कि आपके पास पूर्ण स्क्रीन पृष्ठभूमि छवि है। यह पूरे स्क्रीन को कवर करने के लिए, आप कर सकते हैं दो चीजों में से एक:

  • परिवर्तन की स्थिति में: (स्क्रीन चौड़ाई/2, स्क्रीन ऊंचाई/2)
  • परिवर्तन anchorPoint को (0, 0) उर्फ ​​CGPointZero

आप कल्पना कर सकते बाद करना आसान है। यदि आप पृष्ठभूमि को कभी नहीं ले जाएंगे, तो यह ठीक है। हालांकि स्क्रोलिंग पृष्ठभूमि के लिए मैं एंकरपॉइंट नहीं बदलूंगा।

2) विभिन्न बटन और छवियों को दाईं ओर संरेखित स्क्रीन के दाईं बॉर्डर के साथ वास्तव में होने के लिए अपने मेनू प्रणाली कॉल मान लें। सभी बटन और छवियां चौड़ाई में भिन्न होती हैं: यानी खेल, क्रेडिट, सेटिंग्स, अधिक कूल गेम्स खेलें!

प्रत्येक छवि/बटन के लिए अलग-अलग पदों को जानने के बजाय, एंकरपॉइंट को (1.0f, 0.5f) में संशोधित करके उन्हें सही-सही करना आसान है और फिर छवियों/बटन को बिल्कुल स्क्रीन चौड़ाई पर रखें (और परिवर्तनीय स्क्रीन ऊंचाई): स्थिति = (स्क्रीन चौड़ाई, 100)।

मान निम्न छवि की स्थिति को किसी डिफ़ॉल्ट anchorPoint (0.5f, 0.5f) के साथ (स्क्रीन चौड़ाई, स्क्रीन ऊंचाई/2) में है करते हैं। आप देख सकते हैं छवि के दाईं आधी स्क्रीन क्षेत्र के बाहर है:

__________. 
      | 
     .___|___. 
     | | | 
     | | | 
     | * | 
     | | | 
     | | | 
     °---|---° 
      | 
----------° 

का एक संशोधित anchorPoint (1.0f, 0.5f) बड़े करीने से सही स्क्रीन/विंडो की सीमा के साथ दाएँ संरेखित हो सकता है छवि के साथ, इसकी बनावट की चौड़ाई के बावजूद। स्थिति वही बना है: (स्क्रीन चौड़ाई, स्क्रीन ऊंचाई/2)।

(screen width - contentSize.width * anchorPoint.x, screen height/2) 

:

__________. 
      | 
    ._______. 
    |  | 
    |  | 
    |  * 
    |  | 
    |  | 
    °-------° 
      | 
----------° 

बस की तुलना के लिए, यदि आप anchorPoint को संशोधित किए बिना सही-align इस छवि, मेनू बटन, या लेबल करना चाहता था, तो आप इस सूत्र के अनुसार अपनी स्थिति को सेट करने के लिए होगा सूत्र अभी भी बहुत सरल है, यह एक कोर बन जाता है, हालांकि यदि नोड का सामग्री आकार बदलता है, जो अक्सर लेबल के मामले में होता है, उदाहरण के लिए स्कोर 1 अंकों से शुरू होता है लेकिन समय के साथ 2, 3 और 4 अंकों तक बढ़ जाता है। ऐसे मामलों में एंकरपॉइंट को संशोधित करके नोड को सही-संरेखित करना उचित है क्योंकि यह नोड के परिवर्तनों के आकार के हर बार स्थिति को पुन: गणना करने से बचाता है।

3) दुर्लभ मामले हैं जहां एक कलाकार ने मुझे गेम ऑब्जेक्ट की एक अद्यतन छवि प्रदान की है। छवि का आकार बदल गया है, इसलिए यह अब खेल के ग्राफिक्स में स्वाभाविक रूप से फिट नहीं है। दूसरी ओर, ऑब्जेक्ट की स्थिति गेमप्ले परीक्षण के माध्यम से पहले से ही अच्छी तरह से स्थापित की जा चुकी है और खेल को फिर से परीक्षण से बचने के लिए बदला नहीं जाना चाहिए।

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

सारांश में:

संशोधित anchorPoint है कि केवल अगर यह आसान अन्य नोड या एक स्क्रीन/खिड़की की सीमा के साथ नोड्स संरेखित करने के लिए, या गेमप्ले को प्रभावित किए बिना फ़ाइन-ट्यून करने के लिए अंतिम कला बनाता है।

अन्य सभी मामलों में, नोड्स को स्थानांतरित करने के लिए विशेष रूप से उपयोग की स्थिति का उपयोग करें।

+0

मान लीजिए कि मैं दो छोटी रेखाओं को जोड़ रहा था जैसे कि _ और/एक प्रकार का हाथ बनाने के लिए ... एक कोहनी के साथ ताकि हाथ चारों ओर घूम सके। तो यह _/जैसा दिखता है। क्या आपको लगता है कि/ccp (0.5f, 0.0f) के लिए एंकर पॉइंट सेट करना कोई समस्या पैदा करेगा? मेरा मतलब है कि ऐसा लगता है कि यह काम करता है ... लेकिन क्या आपके पास इस विषय पर कोई इनपुट है :) – Gabe

+3

@Gabe: हाथ का उदाहरण समझ में आता है क्योंकि घूर्णन एंकरपॉइंट के आसपास केंद्रित होता है, इसलिए इस मामले में एंकरपॉइंट को स्थानांतरित करने की अनुमति मिलती है कोहनी संयुक्त पर घूर्णन। अधिक जटिल डिजाइनों के लिए मैं कोहनी संयुक्त के रूप में एक CCNode ऑब्जेक्ट का उपयोग करता हूं, और ऑफसेट पर कोहनी संयुक्त में निचली बांह जोड़ता हूं। यह आपको कोहनी-संयुक्त-नोड घुमाएगा और आपको अधिक लचीलापन देता है। विशेष रूप से यदि प्रत्येक अंग को "संयुक्त नोड्स" जोड़ने के लिए अपने स्वयं के टकराव परीक्षण करना चाहिए। – LearnCocos2D

+1

एक साइड टिप्पणी के अलावा, जब तक कि आपके पास कोई सबूत न हो कि लोग किसी दिए गए प्रश्न के स्पैम या गैर-उत्तर पोस्ट कर रहे हैं, तो हम प्रश्नों को पूर्ववत रूप से सुरक्षित नहीं करना पसंद करते हैं। एक बार समस्या बनने के बाद हम उनकी रक्षा कर सकते हैं, लेकिन हम नए उपयोगकर्ताओं को अनावश्यक रूप से पुराने प्रश्नों का उत्तर देने से रोकना नहीं चाहते हैं। –