2011-01-16 16 views
25

मैं एक 2 डी टाइल इंजन विकसित कर रहा हूं और इस समय मैं मानचित्र निर्माण एल्गोरिदम पर काम कर रहा हूं। इस तरह:2 डी टाइल नक्शा पीढ़ी

मैं बुनियादी लोगों को आम तौर पर

  • पहाड़ी पीढ़ी
  • पर्लिन शोर
  • हीरा वर्ग

लेकिन मैं हमेशा एक ही समस्या मिल की तरह साधारण heightmap उत्पादन में शामिल करने की कोशिश की टाइल मैप्स से निपटने के दौरान एल्गोरिदम उपयुक्त लगता है जिसमें ऊंचाई घटक भी है लेकिन यह मेरा मामला नहीं है।

मैं मूल रूप से घास, समुद्र, रेगिस्तान और इतने पर की तरह स्प्राइट है, लेकिन वे नक्शे के अंदर रखा नहीं किया जाना चाहिए एक उत्पन्न ऊंचाई लेकिन जैसे

  • सब कुछ कुछ के अनुसार सागर
  • द्वीप हैं से शुरू होता है मानचित्र के बीच में रख दिया गया
  • रेगिस्तान उत्पन्न कर रहे हैं
  • पहाड़ और पहाड़ियों चेन उत्पन्न हुए हैं (वे सांप की तरह होना चाहिए)
  • (वे चारों ओर यादृच्छिक स्पॉट की तरह होना चाहिए) (इस जहां एल्गोरिदम कि मैंने कोशिश की ज्यादातर में विफल रहा है)

मुझे किस तरह के दृष्टिकोण की कोशिश करनी चाहिए?

मैंने जो कुछ भी आवश्यक था, करने के लिए विशेष एल्गोरिदम विकसित करके उपमहाद्वीप समस्याओं (जैसे रेगिस्तान, पहाड़ियों और पहाड़ों) को हल किया (उदाहरण के लिए पहाड़ एक बिंदु से शुरू होता है और फिर मोड़ने की संभावना के साथ एक दिशा का पालन करता है) लेकिन मैं असफल रहा हूं मूल द्वीपों की पीढ़ी के साथ (जो केवल एक पेंगा या आकार की कई डिग्री होने के लिए अनुकूलन योग्य हो सकता है)।

alt text

+1

पर एप्लिकेशन (VB.NET) का स्रोत प्राप्त कर सकते हैं, मैं इस अस्तित्व में नहीं लगता। आजकल, http://gamedev.stackexchange.com/ – Hooked

उत्तर

14

[पहाड़ी पीढ़ी, पर्लिन, हीरा वर्ग] ... इस तरह की:

बस आपको एक व्यावहारिक विचार मैं क्या देख रहा हूँ देने के लिए सभ्यता एल्गोरिथ्म की तरह कुछ है टाइल मैप्स से निपटने के दौरान एल्गोरिदम उपयुक्त लगता है जिसमें ऊंचाई घटक भी है लेकिन यह मेरा मामला नहीं है।

लेकिन यह आपका मामला है। पहाड़ मैदानों से अधिक हैं, और मैदान पानी से अधिक हैं।

     ___/ 
        ___/ ___ Mountain cutoff 
       ___/ 
     ______/ 
    ____/ ___ Water cutoff 
__/ 

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

शायद यह अच्छी तरह से ट्विकिंग लेगा, और आपको अन्य भूमि सुविधाओं (अपरिहार्य पहाड़ों के अलावा) उत्पन्न करने की आवश्यकता होगी, लेकिन आपको किसी भी सामग्री निर्माण समाधान के साथ बहुत कुछ करना होगा।

+6

है यदि आप प्रक्रियात्मक सामग्री निर्माण एल्गोरिदम, तकनीकों, अनुभवों आदि पर अधिक जानकारी चाहते हैं, तो मैंने हाल ही में [यह विकी पृष्ठ पाया] (http://pcg.wikidot.com/श्रेणी-PCG-एल्गोरिदम)। यह एक महान संसाधन की तरह प्रतीत होता है, और आपके प्रश्न में उल्लिखित हाइटमैप एल्गोरिदम को शामिल करता है। मेरी साइट नहीं, न ही मैं उनके साथ किसी भी तरह से शामिल हूं - यह बहुत ही शानदार लगता है इसलिए मैं इसे प्लग करना चाहता था :) –

15

मैंने एक दृष्टिकोण का उपयोग किया जिसे दूसरों ने यादृच्छिक इलाके बनाने के लिए "चींटियों" का उपयोग करने के रूप में संदर्भित किया है।उपयोग किए गए दृष्टिकोण का विवरण:

सबसे पहले, मैंने एक विशिष्ट टाइल वर्ग के एक दोहरी आयामी आयताकार सरणी (x, y) का उपयोग करके एक टाइलमैप उत्पन्न किया। टाइल क्लास टाइल से संबंधित जानकारी जैसे ड्रॉपॉइंट, और इलाके के प्रकार रखती है।

फिर मैंने एक विशेष "चींटी" कक्षा बनाई, जिसे एक अदृश्य इकाई के रूप में सोचा जा सकता है जो टाइलमैप के चारों ओर "कदम" लेता है। जब भी चींटी एक नई टाइल पर जाती है, अंतर्निहित इलाके का प्रकार बदल जाता है। चींटी 8 दिशाओं में स्थानांतरित हो सकती है और यह हर बार एक टाइल ले जाने पर दिशा बदलती है। प्रत्येक चरण के बाद यह दिशा यादृच्छिक है।

मैं या तो निश्चित या यादृच्छिक राशि के साथ एक निश्चित या यादृच्छिक मात्रा में चींटियों को जन्म देता हूं। लाइफटाइम उन टाइल्स की मात्रा है जो इसे हटाए जाने से पहले ट्रैवर्स/चरणबद्ध कर सकते हैं।

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

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

पैरामीटर (चींटी राशि, चींटी जीवनकाल, इलाके के प्रकार सरणी) में थोड़ा सा बदलाव होता है, लेकिन मैं अब तक कुछ वाकई अच्छे इलाकों को प्राप्त कर रहा हूं।

इसे और अधिक परिष्कृत प्रकार के चींटी वर्गों का उपयोग करके आगे बढ़ाया जा सकता है, उदाहरण के लिए विशेष पैटर्न में घुसपैठ आदि। समुद्र में विश्वासयोग्य द्वीप बनाने के लिए, आप शायद चींटी व्यवहार को संशोधित करना चाहते हैं ताकि उन्हें कुछ बाधाएं हो किस तरह से स्थानांतरित करने के मामले में (इसलिए आप यादृच्छिक रूप से जमीन की लंबी "स्पाइक्स" नहीं लेते हैं, बहुत छोटे द्वीपों को फैलाते हैं आदि)।

नीचे एक जंगल का एक उदाहरण टाइलमैप है, जो कि एंट दृष्टिकोण का उपयोग करके किए गए एक छोटे से ऐप द्वारा प्रक्रियात्मक रूप से उत्पन्न होता है। उम्मीद है कि यह आपको अपने रास्ते पर सेट कर सकता है!

आप पूछ के समय Github

Procedurally generated 2D tile map of a forest section

+1

+1; यह एक दिलचस्प दृष्टिकोण है, कुछ हद तक [सेलुलर ऑटोमाटा] (http://pcg.wikidot.com/pcg-algorithm:cellular-automata) के समान है। ऐसा लगता है कि आप मूल रूप से समूह के साथ एक यादृच्छिक वितरण प्राप्त करेंगे, जो इसके चेहरे पर आपको लगता है कि आप क्या चाहते हैं। मुझे नहीं लगता कि आपको इस दृष्टिकोण के साथ चिकनी ग्रेडियेंट प्राप्त होने की संभावना है, खासकर जब पर्लिन शोर की तुलना में, मुझे लगता है कि यह कुछ टाइल प्रकारों (जैसे वृक्ष) के लिए अधिक आकर्षक हो सकता है। आपकी "संख्याओं की तालिका" के लिए, यह मेरे उत्तर के समान है [पीआरएनजी कैसे वजन करें] (http://stackoverflow.com/questions/3966809)। –

संबंधित मुद्दे