मैं एक 2D, ग्रिड-आधारित Pacman गेम की प्रोग्रामिंग कर रहा हूं। सभी टाइल्स आकार में 8x8 हैं। इन-गेम, मैप टाइल्स को 16x16 माना जाता है और पात्रों (पैकमैन और भूत) को 32x32 माना जाता है। वास्तविकता में, वे सभी 8x8 टाइल के स्प्राइटशीट से खींचे जाते हैं। मैं प्रत्येक चरित्र के केंद्र बिंदु के रूप में पदों को संग्रहीत करता हूं। चूँकि चरित्र टाइलें मानचित्र टाइलों से बड़ी होती हैं, इसलिए नक्शा एक तरह से बनाया जाता है, जिसके लिए अवरुद्ध टाइलों पर पात्रों को "ओवरलैप" करने में सक्षम होने की आवश्यकता होती है।
समस्याओं के इस सेट से निपटने के लिए, मैंने एक अदृश्य आयत बनाई और इसे चरित्र की स्थिति से जोड़ दिया। जहाँ स्थिति एक है। (x,y)
बिंदु, आयत उस बिंदु के चारों ओर एक बॉक्स है। यह आयत अनिवार्य रूप से 16x16 इन-गेम है, और चरित्र के केंद्र में है, जो ओवरलैप के लिए आवश्यक है।
यह ठीक काम करता है यदि आप 8px के साथ काम कर रहे हैंवैश्विक गति की गति, लेकिन मैं "100% गति" के रूप में 8px का इलाज करना पसंद करता हूं और एक डबल के साथ वर्ण गति पर पूरा नियंत्रण रखता हूं जो कि सीमा [0,1) में है। पदों को दोहरे अंक के रूप में संग्रहीत किया जाता है, इसलिए स्तर, यह ठीक है। मैं पदों को पूर्णांक के रूप में पढ़ता हूं, हालांकि, जब से मैं पिक्सल के साथ काम कर रहा हूं।
तो मैं जो प्रश्न पूछता हूं वह अनिवार्य रूप से है "यदि यहपिक्सेल की X राशि को Y की दिशा में ले जाता है, क्या मेरी टक्कर बॉक्स एक अवरुद्ध टाइल को छू रहा है? लेकिन अगर आप एक समय में 5px आगे बढ़ रहे हैं, तो यह अंततः एक बहुत ही स्पष्ट समस्या का कारण बनता है। कहो कि आप "x = 0" पर फिर से चल रहे हैं। टाइल्स 16x16 इन-गेम हैं, जैसा कि पहले कहा गया है, और आपके पास इनमें से दो तीसरे से पहले खुले हैं, जो अवरुद्ध है। तो आप चलते हैं, x = 5, x = 10, x = 15, x = 20, हम सिर्फ 2nd टाइल, x = 25, x = 30, x = 35 से प्राप्त करते हैं, अब हम "3rd टाइल में ... लेकिन रुको। हम वहां नहीं जा सकते, क्योंकि एक्स = 35 टकराता है। और दुर्भाग्यवश, हमें मुड़ने और नीचे जाने की आवश्यकता थी, लेकिन हम "t- कर सकते हैं, क्योंकि अब हमारे Y- अक्ष isn" t को ग्रिड के साथ ठीक से संरेखित नहीं किया गया है। हमारे एक्स की स्थिति 32 होनी चाहिए, लेकिन "टी" हो सकती है।
यहाँ सभी के लिए मेरा प्रश्न है, मेरे विकल्प क्या हैं? आपके पास कुछ विचार या अंतर्दृष्टि हैं? मुझे ऐसा लग रहा है कि मैं इसे ज़रूरत से ज़्यादा मुश्किल बना रहा हूँ।
उत्तर:
उत्तर № 1 के लिए 1लगता है तुम्हारे पास ...
अपने "पीएसी-मैन" को एक वेग वेक्टर क्यों नहीं दें? वेक्टर न केवल उस गति का वर्णन करेगा जिस पर "पीएसी-मैन" यात्रा कर रहा है, बल्कि किस दिशा में है, जिसका अर्थ आप आगे देख सकते हैं।
"पीएसी-मैन" की गणना और अंत में होना चाहिएनिम्नलिखित वार्तालाप के आधार पर निर्णय लेते हुए ... "अरे, इस गति से और इस दिशा में आगे बढ़ रहा है। इतने सेकंड मैं" एक दीवार को हिट करने जा रहा हूं, यह कब होता है? "। सेकंड सेकंड भी नहीं होता है। सेकंड होना चाहिए ... वे "वर्ग" हो सकते हैं।
आपको एक फंक्शन की आवश्यकता होगी जो इसमें लेता हैप्रारंभिक गति वेक्टर (दिशा और गति) जो एक एक्स, वाई बिंदु का एक समन्वय देता है, जहां "पीएसी-मैन" को रोकना चाहिए, जहां वह आगे नहीं बढ़ सकता है और दिशा (एक दीवार से सटे एक टाइल का केंद्र) को बदलना होगा। हर बार "पीएसी-मैन" दिशा बदलता है, इस गणना को फिर से चलाएं ... आपको यह जांचने की आवश्यकता नहीं है कि क्या अगला वर्ग पास होने योग्य है। यदि उसकी दिशा में परिवर्तन नहीं हुआ है और उसकी गति स्थिर है..तो आपको केवल एक बार गणना करने की जरूरत है और समन्वय प्रणाली को बाकी काम करने देना चाहिए।
इस दृष्टिकोण के साथ, वर्ग आकार और वेग अप्रासंगिक है ... जब तक "पीएसी-मैन" हिट या उसके अगले आंदोलन के भीतर रोक बिंदु से अधिक हो जाता है, वेक्टर के साथ आगे बढ़ना जारी रखता है।