बौद्ध धर्म के चार आर्य सत्य - संक्षेप में बुद्ध की शिक्षाओं के बारे में
बौद्ध धर्म दुनिया की धार्मिक शिक्षाओं में से एक है, जो हर साल अधिक से अधिक लोकप्रिय हो जाता है और नए दिल जीत लेता है ...
इस लेख में, मैं आपको सिखाऊंगा कि लगभग किसी भी शैली के लिए स्तर कैसे बनाएं और उनके विकास को बहुत आसान बनाएं। हम एक टाइल मैप इंजन बनाएंगे जिसका उपयोग आप अपनी परियोजनाओं में कर सकते हैं। हम Haxe और OpenFL का उपयोग करेंगे, लेकिन निर्माण प्रक्रिया कई भाषाओं के लिए समान है।
लेख में क्या वर्णित किया जाएगा इसके बारे में थोड़ा
मुझे लगता है कि टाइल खोजने में कोई समस्या नहीं होनी चाहिए, इसलिए मैं इस पर विस्तार से ध्यान नहीं दूंगा।
एक बार जब आप एक प्रोग्राम चुन लेते हैं, तो आप अपनी खुद की टाइलों के साथ प्रयोग करना शुरू कर सकते हैं। चूंकि यह लेख आपको दिखाएगा कि अपना खुद का टाइल ग्राफिक्स इंजन कैसे बनाया जाए, मैं खुद टाइलों पर नहीं रहूंगा।
एक बार जब आपकी सभी टाइलें प्रोजेक्ट एसेट फ़ोल्डर में हों, तो आप एक साधारण टाइल क्लास लिख सकते हैं। यहाँ हैक्स पर एक उदाहरण दिया गया है
फ्लैश आयात करें। डिस्प्ले। स्प्राइट; फ्लैश आयात करें। डिस्प्ले। बिटमैप; ओपनएफएल.एसेट्स आयात करें; क्लास टाइल स्प्राइट का विस्तार करती है (निजी संस्करण छवि: बिटमैप; सार्वजनिक कार्य नया () (सुपर (); छवि = नया बिटमैप (Assets.getBitmapData ("संपत्ति / ग्रासलेफ्टब्लॉक.पीएनजी")); AddChild (छवि);))
अब, हम केवल स्क्रीन पर एक टाइल लगाते हैं। केवल एक चीज जो वर्ग करता है वह है छवि को संपत्ति फ़ोल्डर से आयात करना और इसे एक बच्चे के रूप में जोड़ना। यह कक्षा कैसी दिखेगी यह इस बात पर निर्भर करता है कि आप किस प्रोग्रामिंग भाषा का उपयोग कर रहे हैं।
अब जब हमारे पास एक टाइल वर्ग है, तो हमें टाइल को तुरंत चालू करना होगा और इसे अपने मुख्य वर्ग में जोड़ना होगा।
फ्लैश आयात करें। डिस्प्ले। स्प्राइट; फ्लैश आयात करें।इवेंट।इवेंट; फ्लैश आयात करें। लिब; क्लास मेन स्प्राइट (सार्वजनिक फ़ंक्शन नया () (सुपर (); var टाइल = नई टाइल (); ऐडचाइल्ड (टाइल);) सार्वजनिक स्थैतिक फ़ंक्शन मुख्य () (Lib.current.addChild (नया मुख्य ());)) बढ़ाता है।
जब कंस्ट्रक्टर को कॉल किया जाता है तो मुख्य वर्ग एक नई टाइल ऑब्जेक्ट बनाता है और इसे डिस्प्ले लिस्ट में जोड़ता है।
जब खेल शुरू होता है, तो मुख्य () फ़ंक्शन को कॉल किया जाएगा और मुख्य प्रकार की एक नई वस्तु को मंच में जोड़ा जाएगा। कृपया ध्यान दें कि आपका नई टाइलेंस्क्रीन के ऊपरी बाएँ कोने में दिखाई देता है।
हमारे पास एक विकल्प है: नियमित सरणी या मैट्रिक्स का उपयोग करें। यदि आप मैट्रिक्स से परिचित नहीं हैं, तो बस यह जान लें कि यह एक ऐसा सरणी है जिसमें अधिक सरणियाँ हैं। अधिकांश प्रोग्रामिंग भाषाएं इसे nameOfArray [x] [y] के रूप में दर्शाती हैं।
हम स्क्रीन पर निर्देशांक के रूप में X और Y का उपयोग करते हैं। हो सकता है कि हम इन X और Y का उपयोग अपनी टाइलें प्रदर्शित करने के लिए कर सकें? तो आइए एक नजर डालते हैं मैट्रिक्स पर
निजी वर उदाहरणArr = [,,,,
ध्यान दें कि इस सरणी में शून्य तत्व पांच संख्याओं की एक सरणी है। इसका मतलब है कि आपको पहले y और फिर x मिलता है। यदि आप कोई वस्तु लेने का प्रयास करते हैं, तो आप छठी टाइल तक पहुंच प्राप्त कर लेंगे।
अगर आपको समझ में नहीं आता कि मैट्रिसेस कैसे काम करता है, तो चिंता न करें। इस लेख में, मैं अपने कार्य को सरल बनाने के लिए एक नियमित सरणी का उपयोग करूंगा।
निजी संस्करण उदाहरणArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0];
उदाहरण उपरोक्त दिखाता है कि नियमित सरणी का उपयोग करना बहुत आसान है। हम एक साधारण सूत्र का उपयोग करके निर्देशांक की गणना करके एक विशिष्ट आइटम प्रदर्शित कर सकते हैं।
अब, उस कोड को लिखते हैं जो हमारी सरणी बनाता है। आइए इसे 1 में भरें। नंबर एक का मतलब होगा हमारी पहली टाइल की आईडी।
ऐरे को स्टोर करने के लिए, हमें मेन क्लास के अंदर एक वेरिएबल बनाने की जरूरत है।
निजी वर नक्शा: ऐरे
यह थोड़ा अजीब लग सकता है, इसलिए मैं समझाता हूँ।
परिवर्तनीय नाम नक्शा है और प्रकार ऐरे है। इसका मतलब है कि सरणी में संख्याएं हैं।
अब, हमारे मानचित्र को आरंभ करने के लिए हमारी कक्षा के लिए हमारे कंस्ट्रक्टर में कुछ कोड जोड़ें।
नक्शा = नया ऐरे
यह स्निपेट एक खाली सरणी बनाता है, जिसे हम शीघ्र ही भरेंगे। लेकिन पहले, आइए गणित में हमारी मदद करने के लिए कुछ चर घोषित करें।
सार्वजनिक स्थिर संस्करण TILE_WIDTH = 60; सार्वजनिक स्थिर संस्करण TILE_HEIGHT = 60; सार्वजनिक स्थिर संस्करण SCREEN_WIDTH = 600; सार्वजनिक स्थिर संस्करण SCREEN_HEIGHT = 360;
हमारे कार्यक्रम में कहीं से भी हमें उन तक पहुंच प्रदान करने के लिए ये चर सार्वजनिक स्थैतिक हैं। आपने देखा होगा कि दिए गए नंबरों के आधार पर, हम तय करेंगे कि ऐरे में कितने सेल स्टोर करने हैं।
var w = Std.int (SCREEN_WIDTH / TILE_WIDTH); वर एच = Std.int (SCREEN_HEIGHT / TILE_HEIGHT); के लिए (i में 0 ... w * h) (मानचित्र [i] = 1)
जैसा कि मैंने कहा, यहां हमने वेरिएबल w के लिए मान 10 और h के लिए 6 सेट किया है। इसके बाद, हमें 10 * 6 नंबरों को फिट करने के लिए सरणी के माध्यम से लूप करना होगा।
अब हमारे पास एक साधारण नक्शा है, लेकिन हमें टाइलों को सही ढंग से व्यवस्थित करने की आवश्यकता है, है ना? ऐसा करने के लिए, आइए टाइल वर्ग पर वापस जाएं और एक फ़ंक्शन बनाएं जो हमें ऐसा करने की अनुमति देता है।
सार्वजनिक समारोह सेटलोक (x: Int, y: Int) (image.x = x * Main.TILE_WIDTH; image.y = y * Main.TILE_HEIGHT;)
जब हम setLoc () फ़ंक्शन को कॉल करते हैं, तो हम x और y निर्देशांक में गुजर रहे होते हैं। फ़ंक्शन इन मानों को लेता है और उन्हें TILE_WIDTH और TILE_HEIGHT से गुणा करके पिक्सेल में निर्देशांक में परिवर्तित करता है
केवल एक चीज जो करना बाकी है, वह है मुख्य वर्ग में मानचित्र पर टाइलें बनाने और उन्हें स्थापित करने की प्रक्रिया का वर्णन करना।
for (i in 0 ... map.length) (var टाइल = new टाइल (); var x = i% w; var y = Math.floor (i / w); टाइल.सेटलोक (x, y); addChild (टाइल);)
हां! सब कुछ सही है। स्क्रीन टाइल्स से भरी हुई है। आइए देखें कि ऊपर क्या हो रहा है
हम x की गणना करते हैं, इसे i के शेष भाग को w से भाग देकर निर्धारित करते हैं। यह प्रत्येक पंक्ति की शुरुआत में x मान 0 वापस करने के लिए किया जाता है।
y के लिए हम i/w से तल () लेते हैं।
अंत में, मैं लेवल स्क्रॉलिंग के बारे में कुछ कहना चाहूंगा। आमतौर पर आप ऐसा स्तर नहीं बना पाएंगे जो पूरी तरह से स्क्रीन पर फिट होगा। आपके नक्शे स्क्रीन से काफी बड़े होंगे, इसलिए मानचित्र के उस हिस्से को खींचने की कोई आवश्यकता नहीं है जिसे उपयोगकर्ता नहीं देख पाएगा। इसे उसी गणित का उपयोग करके ठीक किया जा सकता है। आपको गिनना होगा कि कौन सी टाइल स्क्रीन पर दिखाई देगी और कौन सी नहीं।
उदाहरण के लिए: स्क्रीन 500x500 है, और टाइलें 100x100 हैं, और आपकी दुनिया 1000x1000 है। टाइल खींचने से पहले आपको एक साधारण जांच करने की आवश्यकता है।
हमारे लिए जो कुछ बचा है वह विभिन्न प्रकार की टाइलें बनाना और कुछ सुंदर प्रदर्शित करना है।
आइए मुख्य वर्ग के निर्माता के पास वापस जाएं और हमारे लूप को संपादित करें
के लिए (i 0 में ... map.length) (var टाइल = नई टाइल (मानचित्र [i]); var x = i% w; var y = Math.floor (i / w); टाइल.सेटलोक (x, y); AddChild (टाइल);)
एकमात्र परिवर्तन यह है कि अब हम ब्लॉक प्रकार को कंस्ट्रक्टर को पास करते हैं। यदि आपने इस संपादन के बिना प्रोग्राम को चलाने का प्रयास किया, तो निष्पादन से पहले एक त्रुटि के साथ समाप्त हो जाएगा।
अब सब कुछ ठीक हो गया है, लेकिन आपको नक्शे को यादृच्छिक ब्लॉकों से भरने के बजाय एक डिजाइन के साथ आने की जरूरत है। सबसे पहले, मेन के कंस्ट्रक्टर में लूप को हटा दें जो कि एरे को भर देता है। और फिर अपना नक्शा मैन्युअल रूप से बनाएं
नक्शा = [0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 6 , 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3];
यदि आप सरणी को प्रारूपित करते हैं, जैसा कि मैंने किया है, तो आप आसानी से स्तर की अनुमानित उपस्थिति देख सकते हैं। लेकिन कोई भी आपको केवल एक पंक्ति में किसी सरणी को हथियाने के लिए मना नहीं करता है।
जब आप प्रोग्राम शुरू करते हैं, तो आपको कई त्रुटियां दिखाई देंगी। समस्या यह है कि हमारे मानचित्र में एक शून्य ब्लॉक प्रकार है जिसमें कोई छवि नहीं है और हमारी कक्षा को यह नहीं पता कि इसके साथ क्या करना है। आइए इस गलतफहमी को दूर करें
अगर (छवि! = शून्य) addChild (छवि);
यह संक्षिप्त जांच हमें कष्टप्रद नल सूचक त्रुटि से बचाएगी। अंतिम बार संशोधितसेटलोक () फ़ंक्शन को प्रभावित करेगा। हम चर x और y का उपयोग करने का प्रयास कर रहे हैं जिन्हें प्रारंभ नहीं किया गया है
सार्वजनिक समारोह सेटलोक (x: Int, y: Int) (यदि (छवि! = शून्य) (छवि। x = x * Main.TILE_WIDTH; image.y = y * Main.TILE_HEIGHT;))
इन दोनों को धन्यवाद सरल शब्दअब आप खेल शुरू कर सकते हैं और एक साधारण स्तर देख सकते हैं। हम उन टाइलों को देखते हैं जिनकी आईडी 0 खाली जगह है। कुछ पृष्ठभूमि जोड़ें। इसे और अधिक आकर्षक बनाने के लिए।
मानचित्र बनाना
कोई भी नक्शा एक सरणी है जो इसकी परतों पर टाइलों के स्थान के साथ-साथ उनके मापदंडों को निर्दिष्ट करता है। सबसे अधिक साधारण कार्डएक एमएक्सएन मैट्रिक्स है, जहां इसके प्रत्येक तत्व में पारंपरिक रूप से स्वीकृत अनुक्रम से एक टाइल नंबर होता है। यदि आपने कभी 2डी रणनीति या आरपीजी मानचित्र संपादक (या फ़ोटोशॉप में काम किया) का उपयोग किया है, तो आपको आसानी से बात मिल जाएगी। कब एक ही टाइल ऊंचाई में भिन्न हो सकती है,
जब आधारभूत पद्धति का उपयोग किया जाता है। नई परतें जोड़ी जाती हैं, मैट्रिक्स अधिक जटिल हो जाता है, मैट्रिक्स का एक सेट (संरचना) पहले ही प्राप्त हो जाता है, और किसी भी प्रभाव की शुरूआत के साथ, हमें अपना स्वयं का नक्शा प्रारूप मिलता है, जो डिस्क पर एक से अधिक मेगाबाइट लेता है।
टाइलों को अनुक्रमिक क्रमांक देने की आवश्यकता नहीं है। इसके विपरीत, अपनी संपूर्ण संख्या श्रृंखला को कई अंतरालों में तोड़कर शुरुआत करना अच्छा होगा। उदाहरण के लिए, 0 से 63 की सीमा में साधारण टाइलें शामिल हैं जिन पर आप चल सकते हैं (जमीन, स्लैब)। 63 से 127 तक - अभेद्य जंगल के घने, दीवारें और अन्य ठोस वस्तुएं। अगला अंतराल - झीलों और दलदलों का पानी, अंत में, विशेष समूह जो किसी भी क्रिया को करते हैं जब नायक उन पर "कदम" रखता है: पोर्टल, जाल, और इसी तरह। अब, जैसा कि फ़ोटोशॉप ग्राफिक्स का उत्पादन करता है, आप स्वीकृत नियमों के आधार पर नए लोगों को नंबर देते हैं, और भविष्य में आपको साइट की निष्क्रियता का निर्धारण करने या नायक के पोर्टल में प्रवेश करने पर कैसे प्रतिक्रिया करनी है, इससे जुड़ी कई समस्याओं से राहत मिलती है।
नक्शा बनाते समय, पहले आपको आइसोमेट्रिक टाइलें खींचने में समस्या हो सकती है, क्योंकि वे इतने "वक्र" हैं कि यह स्पष्ट नहीं है कि एक को कहाँ खींचना है और दूसरे के साथ जारी रखना है। स्क्रीन द्वारा सुचारू रूप से स्क्रॉल करने या मानचित्र के कुछ हिस्सों को काटने की प्रोग्रामिंग करते समय कठिनाइयाँ उत्पन्न हो सकती हैं। वैसे, टाइल का आकार दो (16x16 या 32x32) की कुछ शक्ति में सबसे अच्छा किया जाता है, यह गणना में आपको और प्रोसेसर दोनों के लिए बहुत मदद करता है। वही नक्शे के आकार के लिए जाता है। यह यथासंभव वर्गाकार होना चाहिए और घटक "ईंटों" के आकार से आयामों से विभाजित होना चाहिए। इस प्रकार, गणना करते समय, आपके पास कभी भी भिन्नात्मक मान नहीं होंगे जिनके साथ काम करना असंभव है। इसलिए, अधिकांश कार्डों में 128x128 या 512x512 जैसे आयाम होते हैं।
वैसे, सममितीय मानचित्र पर वर्णों की गति भी एक कारण से होती है। आखिरकार, हमारा नक्शा "अंदर की ओर" घुमाया गया है और इसका पूर्ण आकार लंबवत रूप से क्षैतिज रूप से आधा है। इसलिए, किसी भी चलने वाली वस्तु को "ऊपर" उसी के अनुसार चलना चाहिए। सामान्यतया, यहां सूत्रों को लागू करना आवश्यक है, सरलतम स्थिति में, दो कदम पक्ष में एक कदम गहरा लेते हैं। यदि आप सटीक गणना में रुचि रखते हैं, तो उन्हें इंटरनेट पर खोजना आसान होगा, चरम मामलों में, सलाह के लिए "साबुन"। यह किसी भी आइसोमेट्रिक आंदोलन पर लागू होता है जो पूरी तरह से सपाट खोज में भी होता है।
सौभाग्य से, ये सभी प्रश्न लंबे समय से कम अध्ययन वाली प्रौद्योगिकियों की श्रेणी से संबंधित नहीं हैं, और वेब पर प्रोग्रामिंग आइसोमेट्रिक 2 डी इंजन पर बहुत सारी पाठ्यपुस्तकें हैं। मैं आपको सलाह देता हूं कि आप साइटों के लेख अनुभाग देखें जैसे कि www.gamedev.net
तथा www.flipcode.com
, या बस उपयुक्त कीवर्ड के साथ कुछ Yahoo जैसे खोज इंजन को फ़ीड करें।
आइसोमेट्रीएक्स
खैर, उन लोगों के लिए जो "कार्यक्रमों को चुनना" पसंद करते हैं, हम विशेष रूप से नाम का एक इंजन लगाते हैं आइसोमेट्रीएक्स... यह अपने आप में वह सब कुछ जमा करता है जो ऊपर कहा गया था। पिछले समोपाल में चर्चा किए गए अधिकांश 3D इंजन और गेम कंस्ट्रक्टर के विपरीत, यह इंजन आपके गेम की रीढ़ बनने के लिए अभिप्रेत नहीं है। यह मुख्य रूप से आपके लिए व्यवहार में देखने के लिए है कि सभी प्रकार के सैद्धांतिक प्रश्नों को कैसे पूरा किया जा रहा है। इंजन पूरी तरह से लिखा है विजुअल सी ++, का स्रोत कोड और इसका अपना स्तर संपादक है। यदि आप प्रोग्रामिंग में रुचि नहीं रखते हैं, तो भी आप कुछ भी संकलित किए बिना परीक्षण स्तर से भटक सकते हैं।
कार्यों के संदर्भ में, IsometriX मामूली से अधिक लग सकता है: 8-बिट रंग में 640x480, निश्चित रूप से, ऐसा नहीं है। लेकिन जैसा कि मैंने कहा, यह एक और उदाहरण है जिससे आप सीख सकते हैं कि नक्शे के साथ कैसे काम करें, पात्रों को स्थानांतरित करें, टकराव की जांच करें, और बहुत कुछ। साथ ही, विंडोज 9x/2000 पर सब कुछ ठीक काम करता है और संभवतः XP पर होगा।
बिदाई शब्द
वे जो कुछ भी कहते हैं, द्वि-आयामी टाइल इंजन अभी भी सभी जीवित चीजों की तुलना में अधिक जीवित हैं। ड्राइंग के विवरण और सुंदरता के मामले में अभी तक कोई भी 3D गेम क्लासिक 2D के साथ तुलना नहीं कर सकता है। उदाहरण के लिए फॉलआउट टैक्टिक्स को लें - इस गेम में कुछ सबसे उन्नत 2D एडवांस हैं। और कोई भी भाषा इस खेल के ग्राफिक्स को मनहूस कहने के लिए नहीं मुड़ेगी।
इसके अलावा, टाइलें विशाल दुनिया बनाने के लिए आदर्श हैं। विभाजन का उपयोग करते हुए, जब नक्शा कई टुकड़ों में विभाजित होता है, जिनमें से प्रत्येक गतिशील रूप से लोड होता है, तो आप शानदार आकार के नक्शे बना सकते हैं। और यह आरपीजी शैली के खेलों में सक्रिय रूप से उपयोग किया जाता है। यह एक और कारक है जिसके द्वारा डेवलपर्स को त्वरक और मल्टीटेक्स्चरिंग की दुनिया में जाने की कोई जल्दी नहीं है।
और अंत में, टाइल ग्राफिक्स किसी भी 3D इंजन की तुलना में सीखना बहुत आसान है (हालाँकि यह मेरी व्यक्तिपरक राय हो सकती है)। और स्प्राइट्स के साथ संचालन के लिए DirectDraw सीखना Direct3D और यहां तक कि OpenGL की तुलना में अतुलनीय रूप से आसान और स्पष्ट है। इसलिए, तुरंत अग्रिम पंक्ति में आने का प्रयास न करें। शायद आपको अच्छी पुरानी 2डी दुनिया पर भी ध्यान देना चाहिए। खैर, शायद थोड़ा 2.5D ...
सामान्य तौर पर, कुछ सुंदर होता है और फिर से नहीं रूसी शब्द - मौज़ेक... याद रखें कि यह क्या है। यह तब होता है जब आप एक साथ एक बड़ी तस्वीर बनाते हैं, वह एक ही चीज़ के बारे में है, और वहाँ तंग हैं। या याद रखें कि उन्होंने पैसे कैसे देखे और टाइलें बिछाईं।
// बुरा विचार, ब्लॉग विषयों को यहाँ मिलाना ...
किस तरह की छत? टिल्ड। एक अद्भुत गुण, आप संज्ञा को विशेषण में बदल सकते हैं, लेकिन फिर इसका सामान्य रूप से अनुवाद नहीं किया जा सकता है, लेकिन इसे समझना आसान है।हमारे विषय पर वापस, खेलों में टाइल ग्राफिक्स, यह क्या है?
यह एक ग्राफिक है जिसमें टाइलें होती हैं। (कैप)... उदाहरण:
कभी-कभी यह बहुत ही खूबसूरत हो जाता है
इसके अलावा, टाइल ग्राफिक्स कुछ हद तक सिद्धांत के अनुसार पिक्सेल कला की याद दिलाते हैं, मोज़ेक की तरह, एक चित्र पिक्सेल द्वारा पिक्सेल खींचा जाता है। तत्व द्वारा तत्व।
अधिक पिक्सेल कला यहाँ
गेम मेकर स्टूडियो में टाइल्स का एक विशिष्ट उदाहरण
हम वही स्क्रीन लेते हैं और उसे बड़ा करते हैं।
टाइल दोहराता नहीं है
शैतान ही जानता है कि कब और पहले से ही वे इस बात के साथ आए। और अब कुछ गेम निर्माता एक ही प्रकार की टाइलों को पंक्तियों में धकेलना जारी रखते हैं।
खेलों में ग्राफिक्स के साथ मुद्दा बहुत महत्वपूर्ण है, क्योंकि यह अंतिम बजट और विकास के समय को दृढ़ता से निर्धारित करता है।
आप मानचित्र संपादक की तरह उपकरण विकसित करते हैं, और फिर उन्हें वहां रखते हैं, वे पहले से ही यह सब खूबसूरती और समझदारी से व्यवस्थित करते हैं। उनके पास जितने अधिक उपकरण होंगे, वह उतना ही सुंदर होगा, लेकिन यह एक बहुत बड़ा काम है।
न केवल यह सब ड्रा करें, बल्कि फिर इसे व्यवस्थित करें, और फिर तत्वों को यादृच्छिक बनाने का कोई तरीका लेकर आएं, यदि यह किया जाएगा।
यदि आप चाहते हैं कि खेल अंत में और अधिक सुंदर हो, तो आपको एक बार में एक पेड़ के लिए कई स्प्राइट्स बनाने होंगे। और नहीं, पेड़ और ओक अलग-अलग टाइलें और रोशनी हैं, वे अलग-अलग होंगे। आपको एक साथ कई पेड़ और एक साथ कई ओक चाहिए।
टाइलें आमतौर पर एक बंडल (सेट) के रूप में बनाई जाती हैं, जिसे टाइलों का मैट्रिक्स कहा जाता है। यह एक बड़ा टुकड़ा है, जिसे छोटे टुकड़ों में बांटा गया है। कुछ इस तरह:
सब कुछ एक ही समय में काफी सरल और सुंदर है। हिमपात विषय। टाइल्स का तैयार सेट होने के कारण, आपके पास पहले से ही आधा काम हो चुका है, आपको केवल उन्हें खूबसूरती से व्यवस्थित करने की आवश्यकता है।
टाइलें वस्तुओं की तुलना में हल्की होती हैं, वे खेल की गति के लिए बेहतर होती हैं, यदि आप वस्तुओं के बजाय उनका उपयोग करते हैं तो उनके पास उच्च एफपीएस और प्रदर्शन होगा। यदि आप उनके साथ बातचीत करते हैं तो आपको केवल स्प्राइट्स वाली वस्तुओं की आवश्यकता होती है। मान लीजिए कि अगर फ्लेमेथ्रोवर जंगल को जला देगा, तो हाँ, सबसे अधिक संभावना है कि आपको वस्तु के माध्यम से पेड़ बनाने होंगे।
लेकिन लगभग सभी सजावटी (विशुद्ध रूप से दृश्य)तत्वों को टाइल्स के माध्यम से किया जा सकता है।
और एक टक्कर के लिए, आप बस एक ठोस अदृश्य क्षेत्र को एक वस्तु बना सकते हैं, और पहले से ही इसे स्तंभ के नीचे बता सकते हैं। फिर खंभे के माध्यम से (स्प्राइट - टाइल)पारित करना संभव नहीं होगा, आंदोलन "ठोस" क्षेत्र से अवरुद्ध हो जाएगा।
जिसमें, जिसके बारे में मैं अब एक वीडियो बना रहा हूं, टाइल्स के साथ काम करने के लिए नए कार्य सामने आए हैं, एनिमेटेड टाइलें दिखाई दी हैं। आप उन्हें कोड के माध्यम से कॉल (और हटा भी) सकते हैं। एक बहुत ही जिज्ञासु बात। इसके अलावा, वहां अब आप एक ही बार में एक गुच्छा में टाइलें रख सकते हैं और मानचित्र-कक्ष को टाइलों से शीघ्रता से भर सकते हैं।
काफी सुविधाजनक, खासकर छोटी टाइलों के लिए।
लेकिन जब आप आरपीजी बनाना शुरू करते हैं (या किसी अन्य शैली में एक खेल)बिना ग्राफ़िक्स के, आपको टाइल्स की आवश्यकता होगी। मुझे आशा है कि मैंने इस प्रश्न का उत्तर दिया - टाइल क्या हैं और खेलों में टाइल ग्राफिक्स के स्वीकार्य उदाहरण दिए।
और यदि आप विशिष्ट उदाहरणों में रुचि रखते हैं और गेममेकर स्टूडियो 2 में यह सब कैसे काम करता है, तो आप मेरी जांच कर सकते हैं वीडियो (9 मिनट)... मेरी सदस्यता लें ईकॉन ड्यूड चैनल - स्क्रैच से गेम बनाने के बारे में अगर आपने अभी तक सब्सक्राइब नहीं किया है।
एक टाइल क्या है
आप शायद कल्पना करें कि टाइल क्या है, लेकिन आइए इसे बेहतर तरीके से जानें। टाइल एक निश्चित आकार की तस्वीर की तरह दिखती है। इसके अलावा, इसे इस तरह से खींचा जाता है कि जब अन्य टाइलों के साथ तुलना की जाती है, तो ध्यान देने योग्य "सीम" के बिना एक एकल छवि प्राप्त की जाती है। टाइलों के बारे में सोचना सबसे आसान है क्योंकि टाइलें दीवारों या फर्श को लाइन करने के लिए उपयोग की जाती हैं। सबसे सरल टाइल एक वर्गाकार छवि है, जो लंबवत और क्षैतिज रूप से सममित है (आप इसे चित्रण में देख सकते हैं)। यदि आप इन तस्वीरों को एक साथ रखते हैं, तो आपको टर्फ का एक बड़ा कैनवास मिलता है। और यदि आप परिवर्तन के लिए इस सुरम्य चित्र में एक और प्रकार की टाइल जोड़ते हैं, कहते हैं, एक सड़क का चित्रण, तो आप पहले से ही एक आदिम नक्शा तैयार कर सकते हैं।
आइए अब उन लागतों की गणना करें जो हमें 512x512 कोशिकाओं के आकार के साथ एक नक्शा बनाने के लिए आवश्यक होंगी। मान लीजिए कि टाइल स्वयं 32x32 पिक्सेल आकार की होगी, तो यह 1024 बाइट्स - 1 किलोबाइट मेमोरी पर कब्जा कर लेगी। गणना के बाद, यह पता चला है कि टाइलों की छवियों को संग्रहीत करने के लिए सबसे सरल कार्ड मेमोरी प्लस मेमोरी में लगभग 262 किलोबाइट लेता है। लेकिन अगर हम उसी क्षेत्र को हाथ से खींचते हैं, तो हमें 268 मेगाबाइट (!) तकनीकी प्रगति की वेदी पर रखना होगा। और यह इस तथ्य के बावजूद कि मैंने सादगी के लिए 256 रंग मोड लिया। यह स्पष्ट है कि अब भी हर कंप्यूटर में इतनी मेमोरी नहीं होती है, इसलिए मानचित्रों की टाइल वाली संरचना का उपयोग दो-आयामी के भारी बहुमत और पर्याप्त संख्या में त्रि-आयामी खेलों में किया जाता है।
मानचित्र बनाना
कोई भी नक्शा एक सरणी है जो इसकी परतों पर टाइलों के स्थान के साथ-साथ उनके मापदंडों को निर्दिष्ट करता है। सबसे सरल नक्शा एक एमएक्सएन मैट्रिक्स है, जहां इसके प्रत्येक तत्व में पारंपरिक रूप से स्वीकृत अनुक्रम से एक टाइल नंबर होता है। यदि आपने कभी 2डी रणनीति या आरपीजी मानचित्र संपादक (या फ़ोटोशॉप में काम किया) का उपयोग किया है, तो आपको आसानी से बात मिल जाएगी। कब नई परतें जोड़ी जाती हैं, मैट्रिक्स अधिक जटिल हो जाता है, मैट्रिक्स का एक सेट (संरचना) पहले ही प्राप्त हो जाता है, और किसी भी प्रभाव की शुरूआत के साथ, हमें अपना स्वयं का नक्शा प्रारूप मिलता है, जो डिस्क पर एक से अधिक मेगाबाइट लेता है।
टाइलों को अनुक्रमिक क्रमांक देने की आवश्यकता नहीं है। इसके विपरीत, अपनी संपूर्ण संख्या श्रृंखला को कई अंतरालों में तोड़कर शुरुआत करना अच्छा होगा। उदाहरण के लिए, 0 से 63 की सीमा में साधारण टाइलें शामिल हैं जिन पर आप चल सकते हैं (जमीन, स्लैब)। 63 से 127 तक - अभेद्य जंगल के घने, दीवारें और अन्य ठोस वस्तुएं। अगला अंतराल - झीलों और दलदलों का पानी, अंत में, विशेष समूह जो किसी भी क्रिया को करते हैं जब नायक उन पर "कदम" रखता है: पोर्टल, जाल, और इसी तरह। अब, जैसा कि फ़ोटोशॉप ग्राफिक्स का उत्पादन करता है, आप स्वीकृत नियमों के आधार पर नए लोगों को नंबर देते हैं, और भविष्य में आपको साइट की निष्क्रियता का निर्धारण करने या नायक के पोर्टल में प्रवेश करने पर कैसे प्रतिक्रिया करनी है, इससे जुड़ी कई समस्याओं से राहत मिलती है।
नक्शा बनाते समय, पहले आपको आइसोमेट्रिक टाइलें खींचने में समस्या हो सकती है, क्योंकि वे इतने "वक्र" हैं कि यह स्पष्ट नहीं है कि एक को कहाँ खींचना है और दूसरे के साथ जारी रखना है। स्क्रीन द्वारा सुचारू रूप से स्क्रॉल करने या मानचित्र के कुछ हिस्सों को काटने की प्रोग्रामिंग करते समय कठिनाइयाँ उत्पन्न हो सकती हैं। वैसे, टाइल का आकार दो (16x16 या 32x32) की कुछ शक्ति में सबसे अच्छा किया जाता है, यह गणना में आपको और प्रोसेसर दोनों के लिए बहुत मदद करता है।
|
बिदाई शब्द
|
इस पोस्ट में, मैं रंगीन टाइलों के सरल सेट से जटिल प्रक्रियात्मक दुनिया बनाने के लिए और उन टाइलों के स्थान की बाधाओं के आधार पर दो एल्गोरिदम का वर्णन करूंगा। मैं आपको दिखाऊंगा कि कैसे, इन टाइलसेटों को ध्यान से डिजाइन करके, आप दिलचस्प प्रक्रियात्मक रूप से उत्पन्न सामग्री बना सकते हैं, जैसे कि शहरों के साथ परिदृश्य या जटिल आंतरिक संरचनाओं के साथ काल कोठरी। नीचे दिया गया वीडियो एक प्रणाली दिखाता है जो 43 रंगीन टाइलों में एन्कोड किए गए नियमों के आधार पर एक प्रक्रियात्मक दुनिया बनाता है।
सही टाइलिंग इस तरह दिखती है:
यह एक टाइलिंग है जो पानी, समुद्र तट, घास, इमारतों वाले शहरों (नीली आयत) और बर्फीली चोटियों वाले पहाड़ों के साथ एक मानचित्र का प्रतिनिधित्व करना चाहिए। काली रेखाएँ टाइलों के बीच की सीमाएँ दिखाती हैं।
मुझे लगता है कि यह दुनिया का वर्णन करने और बनाने का एक दिलचस्प तरीका है, क्योंकि प्रक्रियात्मक पीढ़ी एल्गोरिदम में अक्सर टॉप-डाउन दृष्टिकोण का उपयोग किया जाता है। उदाहरण के लिए, एल-सिस्टम एक पुनरावर्ती वस्तु विवरण का उपयोग करते हैं, जिसमें उच्च-स्तरीय, बड़े विवरण निम्न-स्तर वाले की तुलना में पहले पहचाने जाते हैं। इस दृष्टिकोण में कुछ भी गलत नहीं है, लेकिन मुझे लगता है कि टाइलसेट बनाना दिलचस्प है जो केवल साधारण निम्न-स्तरीय संबंधों को एन्कोड कर सकता है (उदा। समुद्र का पानीऔर घास को तट से अलग किया जाना चाहिए, इमारतों में केवल उत्तल कोण 90 डिग्री पर होने चाहिए) और उच्च-स्तरीय पैटर्न (जैसे, वर्गाकार भवन) दिखाई देने चाहिए।
यह सहज रूप से स्पष्ट है कि कार्य सही रचनागैर-तुच्छ टाइलिंग मुश्किल है क्योंकि टाइलसेट मनमाने ढंग से व्यापक निर्भरता को एन्कोड कर सकते हैं। जब हम औपचारिक दृष्टिकोण से एक टाइलसेट को समग्र रूप से मानते हैं, तो यह बाधाओं को संतुष्ट करने का एक एनपी-पूर्ण कार्य है। टाइलिंग बनाने के लिए भोले एल्गोरिथ्म में टाइलिंग के स्थान की संपूर्ण खोज होती है और इसे घातीय समय में निष्पादित किया जाता है। आशा है कि हम बना सकते हैं दिलचस्प दुनियाखोज द्वारा हल किए गए टाइलसेट के आधार पर, जिसे अनुमानी द्वारा त्वरित किया जा सकता है। एक अन्य विकल्प टाइलिंग बनाना है जो लगभग सही हैं, लेकिन उनमें कम संख्या में गलत स्थान हैं। मुझे दो एल्गोरिदम मिले हैं जो कुछ दिलचस्प टाइलसेट के साथ अच्छी तरह से काम करते हैं, और मैं उनका वर्णन नीचे करूंगा।
संपूर्ण मानचित्र को अनसुलझे के रूप में प्रारंभ करें
जब तक मानचित्र पर अनसुलझी टाइलें हैं
यदि मानचित्र पर कोई उपयुक्त टाइल लगाई जा सकती है
टी<- коллекция всех возможных расположений подходящих тайлов
मैं<- случайная выборка из t, взвешенная по вероятностям тайлов
l को मानचित्र पर रखें
अन्यथा
एक यादृच्छिक UNSOLVED टाइल का चयन करें और उसके सभी पड़ोसियों को UNSOLVED स्थिति असाइन करें
इस बात की कोई गारंटी नहीं है कि एल्गोरिथ्म अपना काम पूरा करेगा। दो टाइलों वाला एक साधारण टाइलसेट जिसमें कोई सामान्य रंग नहीं है, एल्गोरिथ्म को अनिश्चित काल तक लूप करने का कारण बनेगा। एक और भी सरल मामला एक टाइल होगा जिसमें ऊपर और नीचे अलग-अलग रंग होंगे। यह निर्धारित करने का कोई तरीका खोजना बुद्धिमानी होगी कि टाइलसेट सही टाइलिंग नहीं बना सकते हैं। हम कह सकते हैं कि एक टाइलसेट निश्चित रूप से सही है यदि यह एक अनंत विमान को टाइल कर सकता है। कुछ मामलों में, यह साबित करना आसान है कि एक टाइलसेट एक अनंत विमान को टाइल कर सकता है या नहीं, लेकिन सामान्य तौर पर यह समस्या अनसुलझी है। इसलिए, डिजाइनर का कार्य सही टाइलिंग बनाने में सक्षम टाइलसेट बनाना है।
यह एल्गोरिथ्म पोस्ट की शुरुआत में वीडियो से कालकोठरी टाइलसेट के लिए अच्छे समाधान खोजने में असमर्थ है। यह सरल टाइलसेट के साथ अच्छी तरह से काम करता है। हम सीखना चाहते हैं कि टाइलों और विभिन्न कोडित नियमों के बीच कई संभावित प्रकार के संक्रमणों के साथ अधिक जटिल टाइलसेट को कैसे हल किया जाए (उदाहरण के लिए, कि सड़कों को इमारतों के बगल में शुरू और समाप्त होना चाहिए)।
हमें एक एल्गोरिदम की आवश्यकता है जो आगे देख सके और टाइल लेआउट बना सके, किसी तरह उन विकल्पों को महसूस कर सके जिनके लिए ये लेआउट भविष्य के टाइल लेआउट के लिए खुले हैं। यह हमें जटिल टाइलसेटों को कुशलतापूर्वक हल करने की अनुमति देगा।
यह खोज किसी स्थानीय अखंडता पद्धति का उपयोग नहीं करती है। अर्थात्, हम टाइलों की व्यवस्था करने का प्रयास नहीं करते हैं, जो बाद में भविष्य में एक खोज चरण के बाद भी एक अनसुलझी स्थिति की ओर ले जाती है। वर्तमान बिंदु से संभावित स्थानों पर कई टाइलों के प्रभाव को ट्रैक करके खोज को गति देना संभव है। उस ने कहा, उम्मीद है, यह खोज को अपना काम रद्द करने में इतना समय खर्च करने से रोकेगा। यह वही है जो हमारा एल्गोरिदम करता है।
सही टाइलिंग बनाने की कठिनाई दो प्रकार की टाइलों के बीच संक्रमण के लिए आवश्यक संक्रमणों की संख्या पर अत्यधिक निर्भर है। एक साधारण टाइलसेट में केवल रेत, पानी और घास हो सकती है। यदि घास और पानी एक दूसरे को नहीं छू सकते हैं, तो उनके बीच रेत में संक्रमण होना जरूरी है। यह एक सरल उदाहरण है जिसे पहले प्रस्तुत किया गया एल्गोरिथम आसानी से हल कर सकता है। अधिक जटिल मामले में, टाइल प्रकारों के कई अंतर्निहित स्तरों का प्रतिनिधित्व किया जा सकता है। उदाहरण के लिए, हमारे पास गहरा पानी, पानी, रेत, घास, एक ऊंचा मैदान, एक पहाड़ और एक बर्फीली चोटी हो सकती है। इन सभी प्रकार की टाइलों को मानचित्र पर प्रदर्शित करने के लिए, सात संक्रमण होने चाहिए, यदि हम मानते हैं कि ये प्रकार मेरे द्वारा बताए गए क्रम को छोड़कर एक दूसरे को स्पर्श नहीं कर सकते हैं। टाइलें बनाकर अतिरिक्त जटिलता जोड़ी जा सकती है जो स्वाभाविक रूप से टाइलों के बीच व्यापक निर्भरता पैदा करती है, जैसे कि सड़कें जो कुछ टाइल प्रकारों के पास शुरू और समाप्त होनी चाहिए।
सहज रूप से, इस कार्य के लिए एल्गोरिथम "आगे देखने" में सक्षम होना चाहिए और कम से कम कुछ बदलावों पर विचार करना चाहिए जो चुने हुए स्थान के परिणाम बन सकते हैं। ऐसा करने के लिए, आप टाइलमैप को प्रत्येक बिंदु पर टाइल्स के लिए संभाव्यता वितरण के रूप में सोच सकते हैं। जब एल्गोरिथम एक टाइल रखता है, तो यह अपने स्थान के जवाब में उस टाइल के चारों ओर संभाव्यता वितरण को इस तरह से अद्यतन करता है कि यह पड़ोसी टाइलों की संभावनाओं को बढ़ाता है जो वर्तमान स्थान के साथ संगत होने की संभावना है।
उदाहरण के लिए, यदि मानचित्र पर पानी की टाइल है, तो उसके आगे की टाइलों में पानी होना चाहिए। उनके बगल की टाइलों में भी पानी हो सकता है, लेकिन अन्य संभावनाएं भी हैं, उदाहरण के लिए, घास, यदि मूल जल टाइल के बगल में एक तट रखा गया है। हम तैनात टाइल से जितना आगे बढ़ते हैं, उतने ही अधिक टाइल प्रकार संभव होते जाते हैं। इस अवलोकन का लाभ उठाने के लिए, हम मूल टाइल के बगल में प्रत्येक टाइल के स्थान तक पहुंचने के तरीकों की संख्या की गणना कर सकते हैं। कुछ मामलों में, संक्रमण के केवल एक क्रम से एक टाइल से दूसरी टाइल में दी गई दूरी पर संक्रमण हो सकता है। अन्य मामलों में, कई अलग-अलग संक्रमण अनुक्रम हो सकते हैं। टाइल रखने के बाद, हम आसन्न बिंदुओं पर टाइलों के संभाव्यता वितरण का निर्धारण उन तरीकों की संख्या की गणना करके कर सकते हैं जिनसे हम उस टाइल से संक्रमण कर सकते हैं जिसे हमने आसन्न टाइलों में रखा है। इस एल्गोरिथम द्वारा किया गया लुक-फ़ॉरवर्ड एल्गोरिथम इन संक्रमणों की संख्या को ट्रैक कर रहा है और उन्हें संभाव्यता वितरण के रूप में मान रहा है जिससे नई टाइलें चुनी जा सकती हैं।
यह सबसे कुशल एल्गोरिदम है जिसे मैं इस कार्य के लिए लागू करने में सक्षम हूं। इसका एक और फायदा है: निष्पादित होने पर यह सुंदर प्रस्तुतिकरण बनाता है। शायद बैकट्रैकिंग के कुछ रूपों को पेश करके इस एल्गोरिदम को बेहतर बनाने का एक तरीका है। यदि परिणामी समाप्त टाइलिंग में कोई गलत बिंदु है, तो आसन्न टाइलों की व्यवस्था को रद्द करना और उनके बिंदुओं पर परिणामी वितरण से पुन: नमूनाकरण करना हमें इस तैयार टाइलिंग के लिए एक सुधार खोजने की अनुमति दे सकता है। बेशक, यदि आप सही टाइलिंग मिलने तक खोज जारी रखना चाहते हैं, तो निर्दिष्ट गारंटीकृत निष्पादन समय को पार करें।
कल्पना कीजिए कि एक टाइल पूरी तरह से खाली कार्ड पर रखी जा रही है। यह स्थान आसन्न टाइलों की संभावनाओं को अद्यतन करेगा। हम इन अद्यतन वितरणों को पिछले टाइल स्थानों द्वारा दिए गए पिछले वितरण के रूप में देख सकते हैं। यदि कई टाइलें रखी गई हैं, तो यह पिछला वितरण साझा किया जाएगा। मैं पिछले संयुक्त को अतीत में प्रत्येक स्थान के वितरण के उत्पाद के रूप में दिए गए इस पश्च संभाव्यता का अनुमान लगाता हूं।
आसन्न टाइलों के संभावित असाइनमेंट की संख्या को कम करके, हम उस खोज स्थान को काफी कम कर देते हैं जिसे एल्गोरिथम को प्रत्येक स्थान के बाद संसाधित करना चाहिए। हम जानते हैं कि इस छोटे से पड़ोस में असंगत टाइलों के दिखने की सभी संभावनाएं शून्य हैं। यह इन बिंदुओं पर वैरिएबल स्कोप से इन मानों को हटाने के समान है। यही है, स्थित टाइल के आस-पास के क्षेत्र के पड़ोसी बिंदुओं की प्रत्येक जोड़ी की परिभाषा क्षेत्र में एक निश्चित टाइल है, जो पड़ोसियों की परिभाषा के क्षेत्र में अभी भी कुछ टाइल के साथ संगत है। जब एक ईआर समस्या में दो चर एक बाधा से जुड़े होते हैं, और उनके डोमेन में केवल वे मान होते हैं जो बाधा को संतुष्ट करते हैं, तो उन्हें चाप संगतता कहा जाता है, यानी, यह विधि वास्तव में चाप संगतता शुरू करने के लिए एक प्रभावी रणनीति है।
ZUO में, किसी दिए गए आंशिक असाइनमेंट में "सबसे प्रतिबंधित" चर परिभाषा के क्षेत्र में शेष सबसे कम संभव मूल्यों वाला एक है। मानचित्र पर न्यूनतम एन्ट्रापी वितरण के साथ एक बिंदु पर एक टाइल की स्थिति का सिद्धांत एससीडी में सबसे प्रतिबंधित चर के लिए एक मान निर्दिष्ट करने के समान है, जो एक खोज का उपयोग करते हुए एससीडी को हल करते समय चर को ऑर्डर करने के लिए एक मानक अनुमानी है।
इस सिद्धांत का उपयोग करने वाला एक उदाहरण नीचे दिखाया गया है। ठोस पानी की टाइल दिखाई देने की संभावना को बदलकर, मैं मानचित्र पर पानी के निकायों के आकार और आवृत्ति को समायोजित कर सकता हूं।
"मोस्ट कॉन्स्ट्रेन्ड प्लेसमेंट विद फ़ज़ी आर्क कंसिस्टेंसी" सॉल्वर ट्विटर के वेव फंक्शन कोलैप्स प्रोजेक्ट के समान है