2d टाइल आधारित खेल में, स्क्रॉल करने के लिए एक अच्छी विधि क्या है?


9

मैं डायरेक्टड 3 डी का उपयोग कर रहा हूं, ताकि स्क्रीन पर टाइल खींचने के लिए डी 3 डीएक्सएसपीआरआईइट आवरण के साथ। मेरे पास एक टाइल वर्ग है जिसमें टकराव और टाइल प्रकार जैसे सदस्य हैं, फिर मेरे पास टाइल्स की एक सरणी है जैसे

टाइल ग्रिड [256] [256];

कौन सा बेहतर तरीका होगा?

स्क्रीन के केंद्र में खिलाड़ी को टैप करें और मानचित्र को ड्रॉ होने पर ऑफ़सेट करें।

निम्नलिखित कैमरे के साथ खिलाड़ी को नियंत्रित करें।

मैं पहली विधि का उपयोग कर रहा था, लेकिन यह वास्तव में जटिल हो रहा है जब आप नक्शे के शीर्ष बाएं किनारे पर पहुंचते हैं, और जब अन्य खिलाड़ी / दुश्मन मानचित्र पर होते हैं और उसी समय आगे बढ़ते हैं

अगर मैं कैमरे को खिलाड़ी का अनुसरण करता हूं, तो क्या मुझे हर एक ग्रिड टाइल के लिए स्प्राइटबैच-> ड्रा (...) कॉल करना होगा, भले ही स्क्रीन पर केवल कुछ ही फिट हो सकते हैं?

जवाबों:


4

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


आप शायद केवल उन स्प्राइट्स को आकर्षित करने के लिए कोड लिखना चाहते हैं जो दिखाई दे रहे हैं, खासकर अगर आपको लगता है कि आपको अपने ग्रिड का आकार बढ़ाने की आवश्यकता है।

2

दुनिया के निर्देशांक में कैमरा ले जाना और दुनिया भर में आपका चरित्र बढ़ना इस समस्या से निपटने का सबसे आसान तरीका है, दुनिया के निर्देशांक में काम करने का मतलब है कि आपको किसी भी अतिरिक्त गणना को करने की आवश्यकता नहीं है जब यह सभी अन्य प्रणालियों के लिए उबलता है जो एक पर काम करना चाहिए रिश्तेदार निर्देशांक प्रणाली और यह भी समझते हैं कि वे दुनिया के निर्देशांक में कहां हैं।

चूँकि आप 2D में काम कर रहे हैं, एक और अच्छा टिप यह है कि वर्चुअल वर्ल्ड ग्रिड सिस्टम बनाने के लिए सबसे आसान तरीका है कुछ स्थानिक विभाजन करना, यह आपको प्रत्येक टाइल के आधार पर स्प्राइट और अन्य संसाधनों को जोड़कर प्रत्येक टाइल को व्यक्तिगत रूप से प्रबंधित करने की अनुमति देगा, इसलिए संक्षेप में यह प्रक्रिया होगी:

  • कुछ टाइल वर्ग बनाएं जो टाइल के लिए सीमा निर्देशांक पकड़ सकते हैं और जो भी संसाधन विशिष्ट टाइल की आवश्यकता हो सकती है (स्प्राइट्स, दुश्मन, आदि ..)।

  • अपनी दुनिया के आकार पर निर्णय लें और एक 2 डी सरणी बनाएं (आप एक आयाम का उपयोग कर सकते हैं और इसे 2 डी के रूप में एक्सेस कर सकते हैं) प्रत्येक एक अपने सभी संबंधित संसाधनों के साथ अपनी दुनिया का थोड़ा सा प्रतिनिधित्व करते हुए।

  • केवल उस टाइल से संसाधन निकालें जो खिलाड़ी और उसके पड़ोसियों में है।

ग्रिड के साथ आप आसानी से पता लगा सकते हैं कि खिलाड़ी किस टाइल के आधार पर है यह ग्रिड की शुरुआत के सापेक्ष है।

आपके द्वारा कैमरे के बारे में बताई गई समस्या के आसपास काम करने के लिए आपको खिलाड़ी और कैमरा को दो स्वतंत्र सिस्टम बनाने की ज़रूरत है जहाँ कैमरा किनारे की टाइलों के केंद्र की तुलना में आगे की यात्रा नहीं करता है, इसलिए जब खिलाड़ी उस टाइल की यात्रा करता है तो वह अभी भी यात्रा कर सकता है पूरी दुनिया के निर्देशांक से बंधी हुई टाइल (यानी अब स्क्रीन पर केंद्रित नहीं है) लेकिन कैमरा बंद है।


0

मैं एक सतह का उपयोग करता हूं। मैं एक ऑफ स्क्रीन सतह पर पूरी दुनिया बनाता हूं और एक x और y समन्वय रखता हूं। मैं खिलाड़ी चाल के रूप में इन्हें बदल देता हूं और प्रत्येक फ्रेम सतह से बैकबफ़र तक x और y का उपयोग करते हुए 1028 x 768 आयत खींचता है।

अन्य लोगों के लिए जैसा कि मैं उन्हें एक एक्स और वाई देता हूं और उन्हें दुनिया भर में घूमने देता हूं, जैसा कि वे कृपया करते हैं, जब मैं यह जांचता हूं कि क्या 1028 x 768 आयत में x और y है या नहीं, तो उन्हें ड्रा करें (मैं लोगों के लिए बनावट का उपयोग करता हूं) ।

मेरे पास स्क्रीन के केंद्र में खिलाड़ी है और जांचें कि क्या दुनिया का किनारा स्क्रीन के किनारे तक पहुंच गया है। इस परिस्थिति में खिलाड़ी स्क्रीन के बारे में दुनिया के किनारे और केंद्र में वापस चला जाता है और फिर दुनिया फिर से चलना शुरू कर देती है। यह कठिन लगता है और मुझे कुछ समय लगा लेकिन ऐसा करने के लिए बुरा नहीं है।

मैं 64 x 64 टाइलों का उपयोग करता हूं और मैंने अब तक की सबसे बड़ी दुनिया में 50 x 60 टाइल्स का उपयोग किया है।

यह सब सी ++ के साथ प्रत्यक्ष एक्स में किया जाता है


1
यह एक विशाल मेमोरी हॉग की तरह लगता है। पूरी दुनिया को एक सतह के परदे पर खींचे रखना एक बार आपको स्मृति के मुद्दों में ले जाने वाला है, जब आप अपनी दुनिया के लिए कई (एनिमेटेड) परतें बनाने जैसी चीजों को करना चाहते हैं और अब आपके पास जो है उससे अधिक विस्तार कर रहे हैं। दुनिया के बारे में जानकारी रखना बेहतर होगा और केवल उन हिस्सों / वस्तुओं को खींचना चाहिए जिन्हें खींचने की आवश्यकता होती है। बस मेरे 2 सेंट। :)
रिचर्ड मार्स्केल - Drackir

@ डॉकिर मुझे लगता है कि आप गलत समझ रहे हैं। केवल दुनिया को स्क्रीन से खींचा जाता है, अन्य लोगों की तरह चीजों को ट्रैक किया जाता है और जब उन्हें ज़रूरत होती है तो बैकर बफर पर खींचा जाता है। इसके अलावा, मैं खुद को 70 x 70 दुनिया में ऐसा करते हुए नहीं देखता। जब मैं कहता हूं कि दुनिया में मेरा मतलब क्षेत्र है, तो यह शहर एक कालकोठरी या एक घर के अंदर हो सकता है, जब खिलाड़ी उनके बीच चलता है तो ऑफ स्क्रीन सतह का पुनर्निर्माण होता है। हाँ, यह मेमोरी लेता है, लेकिन आधुनिक टेराबाइट ड्राइव पर 2d टाइलें इसे नगण्य बनाती हैं और कुछ सेकंड लोड हो रहा है, स्मूथ स्क्रॉलिंग और एनीमेशन के लिए भुगतान करने के लिए एक छोटी सी कीमत है। लेकिन हाँ वहाँ बेहतर और कठिन तरीके हैं :)
Skeith

सतह को हार्ड ड्राइव पर नहीं, बल्कि GFX कार्ड मेमोरी में स्टोर किया जाना चाहिए। हालांकि, मुझे विश्वास है कि अगर GFX कार्ड मेमोरी बहुत बड़ी है, तो यह सतहों को HD पर ले जाएगा, जो काफी धीमी गति से चीजों को धीमा कर देगा। बेशक, यह एक समय हो गया है क्योंकि मैंने उस सामान को निपटा दिया है, इसलिए मुझे याद नहीं है कि यह कैसे काम करता है, लेकिन मुझे लगता है कि जब तक आप दुनिया के बहुत बड़े ड्राइंग नहीं कर रहे हैं यह ठीक होगा। :)
रिचर्ड मार्स्केल - Drackir

@ डाकिर यह जानना दिलचस्प है, मैंने ऐसा कभी नहीं सोचा था। मैंने पाया कि इस तरह से मुझे एक स्मूथ स्क्रॉल मिलता है कि अगर मैंने गतिशील रूप से नई टाइलें खींची हैं, तो मुझे लगता है कि यह ठीक है, लेकिन मुझे उस पर गौर करना होगा।
स्कीथ

मैं एक ऐसे खेल पर काम कर रहा था जहाँ मेरे पास 31x31 के नक्शे थे लेकिन वे एक-दूसरे से जुड़े हुए थे। मैं किसी और के इंजन से काम करने की कोशिश कर रहा था और वे उस खिलाड़ी के आसपास के सभी नक्शों को आकर्षित करेंगे जो खिलाड़ी पर था; तो कुल नौ नक्शे। प्रत्येक नक्शे में कई (मुझे लगता है कि 6) परतें थीं। तो जैसे 31x31x9x6 = 51894 टाइलें खींची जा रही हैं (निश्चित रूप से, सभी टाइलें भरी हुई नहीं थीं) हर बार उपयोगकर्ता स्विच मैप करता है। मेरे लिए यह बहुत धीमा था, इसलिए मैंने ड्रॉइंग रूटीन को केवल खिलाड़ी के आसपास की टाइलें खींचने के लिए फिर से लिखा, जहां तक ​​कि स्क्रीन के किनारे पर 1 टाइल अतीत में है (चलते समय आंशिक टाइलों को संभालने के लिए)।
रिचर्ड मार्स्केल - Drackir 17'11

0

एक टाइल वाली दुनिया के कोनों में थोड़ा दर्द पाने के लिए कोड के लिए यह काफी सामान्य है, जब वर्कआउट करना होता है कि कौन सा टायर खींचना है, और साथ ही यह सुनिश्चित करना है कि कैमरा 'ऑफ-वर्ल्ड' नहीं है। उन किनारे के मामलों में मूल रूप से एक 2D टाइल-आधारित दुनिया को लागू करने के बारे में सबसे जटिल बात है कि स्क्रीन रेस से बड़ा है। यदि आप ज़ूम इन और ज़ूम-टू-कर्सर: D का समर्थन करते हैं तो यह बहुत अधिक जटिल हो जाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.