मैं एक 2 डी साइड स्क्रॉलिंग गेम में "कमरे" का पता कैसे लगा सकता हूं?


24

मैं एक ऐसी प्रणाली बनाने के लिए देख रहा हूँ जो कुछ प्रकार की इमारतों और कमरों को पहचानती है जिन्हें आप खेल में बना सकते हैं, जैसे कि टेरारिया "निवास" का पता लगाता है। उस खेल में, शर्तों के एक सेट को संतुष्ट करने वाले ब्लॉकों के एक क्षेत्र का निर्माण करके टाइल आधारित दुनिया में एक घर का निर्माण किया जा सकता है:

  1. ज़ोन पूरी तरह से खिलाड़ी द्वारा रखे गए ब्लॉक द्वारा "बाहर" से अछूता रहता है।
  2. ज़ोन 5x7 आयत में फिट हो सकता है।
  3. कम से कम एक टेबल, एक प्रकाश स्रोत और संलग्न क्षेत्र में कुर्सी है।
  4. एक दरवाजा है जो ज़ोन से निकलता है।
  5. टेरारिया में एक अग्रभूमि और पृष्ठभूमि टाइल परत दोनों हैं। ज़ोन की पूरी पृष्ठभूमि खिलाड़ी-आधारित ब्लॉकों से भरी जानी चाहिए।

जब एक खिलाड़ी ने उपयुक्त आकार के क्षेत्र का निर्माण किया है, तो मैं कुशलता से कैसे पता लगा सकता हूं और मैं कैसे कुशलता से जांच सकता हूं कि उस क्षेत्र में सभी आवश्यक सामान / घटक शामिल हैं?

आंतरिक क्षेत्र का उदाहरण जो आवास की सभी आवश्यकताओं को पूरा करता है:

यहाँ छवि विवरण दर्ज करें


5
क्या आप विस्तृत कर सकते हैं? "बिल्ड्स के प्रकार" से आपका क्या मतलब है और टेरारिया में "निवास" क्या है? ध्यान रखें कि हर किसी ने उस खेल को नहीं खेला है, एक सवाल पर भी ध्यान केंद्रित करें यदि आप चाहते हैं कि लोग मदद करें, और यह सुनिश्चित करें कि प्रश्न का एक निश्चित उत्तर है (राय नहीं)
TomTsagk

1
प्रकारों के साथ मेरा मतलब विभिन्न घटकों / टाइलों से है। मेरा प्रश्न नीचे हल है। मैं और अधिक विस्तार करने की कोशिश करूंगा और भविष्य के सवालों पर अधिक विशिष्ट बनूंगा, मदद के लिए धन्यवाद।
बर्नार्डो बेकर

1
एक तरफ के रूप में, सुनिश्चित करें कि एक कमरे और निवास के बीच अंतर है । आपकी बुलेट सूची बताती है कि आप उन्हें उसी परिभाषा के रूप में देखते हैं। उदाहरण के तौर पर टेरारिया का उपयोग करते हुए, दुश्मन कमरे में नहीं घूमते हैं, भले ही वे निवास के रूप में पात्र नहीं हैं (उदाहरण के लिए एक मेज गायब है, या केवल 5x5 आयाम में)
10

जवाबों:


37

मैं टेरारिया से परिचित नहीं हूं, लेकिन बाढ़-भराव एल्गोरिथ्म का उपयोग करके आसानी से किया जा सकता है ।

पिक्सेल के बजाय, आप टाइलों की जांच करते हैं, और प्रत्येक टाइल की जाँच के लिए, आप मूल्यांकन करते हैं कि क्या एल्गोरिथ्म किसी अन्य टाइल की जाँच कर सकता है, जबकि एक सरणी या सूची में संग्रहीत होता है जो प्रक्रिया के दौरान वस्तुओं को मिला है।

एल्गोरिथ्म टाइल पर शुरू होता है जहां चरित्र है। आप प्रत्येक 1 सेकंड 2 शुरू कर सकते हैं ... यह सबसे अच्छा अंतराल खोजने के लिए tweaking की बात है।

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

संपादित करें

जैसा कि टिप्पणियों में कहा गया है, आप एल्गोरिथ्म को शुरू करने के लिए अन्य तरीकों का उपयोग कर सकते हैं, जैसे कि जब खिलाड़ी एक टाइल बदलता है, या एक am I modified?चर वाले टाइल्स , यदि true, एल्गोरिथ्म को प्रारंभ करें। हालाँकि, आपको इस दृष्टिकोण से सावधान रहना चाहिए:

  • क्या होगा यदि एक टाइल जो कमरे का हिस्सा है, लेकिन एक टाइल नहीं है जो आपके चरित्र पर है, संशोधित है? हो सकता है कि टाइल को अन्य खिलाड़ी, या एक पर्यावरण घटना, या टाइल के जीवन-समय द्वारा बदल दिया गया था। आपका चरित्र संशोधन से अनजान होगा और अपडेट किए गए कमरे, एक त्रुटि-स्थिति का पता लगाने के लिए एल्गोरिथ्म को निष्पादित नहीं करेगा।

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

संपादन का अंत


9
केवल "खिलाड़ी द्वारा रखी गई ब्लॉक" टाइलों के बीच बाढ़-भराव क्यों नहीं? यह खुले क्षेत्रों में अनंत बाढ़-बाढ़ को रोक सकता है या कम कर सकता है (जब तक कि गुफाएं / हवेली "खिलाड़ी-आधारित ब्लॉक" से भर नहीं जाती हैं)।
jimbo1qaz

20
आप इसे एक निश्चित अंतराल पर क्यों चलाएंगे? निश्चित रूप से आप इसे केवल तब चला सकते हैं जब कोई ब्लॉक रखा जाता है (या नष्ट किया जाता है, यदि लागू हो, और उन दोनों मामलों को संभवत: प्रति ब्लॉक बार-बार परिशोधित किया जा सकता है) या मानचित्र के किसी विशेष हिस्से को लोड करते समय, और तब से परिणाम संग्रहीत करें क्या आप वहां मौजूद हैं।
NotThatGuy

3
@ मिनीबिस: मुझे पूरा यकीन है कि टेरारिया को आपको मंजिल बदलने की आवश्यकता नहीं है। मुझे यह भी उम्मीद नहीं है कि एक खेल को बदलने के लिए यह उस कमरे को पहचानने वाला व्यवहार होगा जो टाइल रखा गया था। क्या होगा अगर मैं उदा एक चट्टान से सटे कमरे का निर्माण?
फ्लेटर

3
टेरारिया को पृष्ठभूमि की दीवारों को लगाने के लिए एक की आवश्यकता होती है और यह प्राकृतिक पृष्ठभूमि गंदगी / चट्टान के साथ एक घर नहीं बनाएगा। यह वास्तव में केवल खिलाड़ी-आधारित ब्लॉक की जांच करता है।
loa_in_

3
सीपीयू को बचाने के लिए, मैं केवल ब्लॉक चेंज पर एल्गोरिथ्म चलाऊंगा और फिर प्रत्येक ब्लॉक के लिए स्टेट को स्टोर करूंगा। इसके साथ, यह एक सरल हैisRoom()
हेर डर्ब

3

जैसे @ फेरेरा दा सेलवा ने कहा, बाढ़ भराव एल्गोरिथ्म का प्रयास करें। हालाँकि, यह निर्धारित करने के लिए कि एल्गोरिथ्म चलाते समय आप कुछ अलग मानदंडों का उपयोग कर सकते हैं।

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

इनके संयोजन के उपयोग से आप इसे अधिक कुशलता से और प्रभावी ढंग से कर सकेंगे।


3

कंप्यूटर विज्ञान में 2 कठिन समस्याएं हैं। चीजों का नामकरण, कैश अमान्यकरण और ऑफ-बाय-एक त्रुटियां।

यह कैश अमान्य समस्या है।

यदि आपके पास "यह अंदर है" का रिकॉर्ड है, तो जब भी एक ब्लॉक रखा जाता है या हटाया जाता है, तो इसे और इसके क्षेत्र को बाढ़ के माध्यम से अपडेट करना बहुत आसान होता है।

इसे अनुकूलित करने के लिए आप "पागलपन" के स्तरों का एक सेट हो सकता है।

एक "सेल" एक क्षेत्र है जो खिलाड़ी द्वारा रखे गए ब्लॉकों (एक निश्चित आकार तक) से घिरा हुआ है।

एक "कमरा" पृष्ठभूमि टाइल के साथ एक सेल है।

"अंदर" एक दरवाजा, एक प्रकाश और एक कुर्सी के साथ एक कमरा है।

जब आप खिलाड़ी-आधारित अग्रभूमि ब्लॉक रखते हैं, तो यह देखने के लिए कि क्या एक नया सेल बनता है, एक दक्षिणावर्त / वामावर्त वॉक करें। जब आप एक खिलाड़ी-आधारित अग्रभूमि ब्लॉक को हटाते हैं, तो जांच लें कि क्या यह किसी भी सेल को तोड़ता है - यदि हां, तो देखें कि क्या दोनों को विलय करके एक नया सेल बनता है।

जब एक नया सेल बनता है या विकृत नहीं होता है, तो इसे एक कमरा या अंदर होने की जांच करें।

कक्ष एक कमरे के लिए कितने पृष्ठभूमि टाइल की आवश्यकता है, इसका ट्रैक रख सकते हैं। फिर एक साधारण गिनती जब एक कोशिका बनती है, तो एक पृष्ठभूमि टाइल को सेल से जोड़ा जाता है या हटा दिया जाता है, यह निर्धारित कर सकता है कि क्या यह एक कमरा है।

इसी तरह, कोशिकाएं अपने भीतर कितनी कुर्सियां ​​और प्रकाश स्रोत (और वास्तव में सभी प्रकार की वस्तुएं) का ट्रैक रख सकती हैं। फिर अंदर का चेक तुच्छ है।

प्रवेशों की गिनती भी की जा सकती है।


इसलिए हम "कोशिकाओं" के साथ मानचित्र को बढ़ाते हैं। जब टाइलें जोड़ी या हटा दी जाती हैं, तो हम स्थान के सेल की जांच करते हैं, और सेल में गिनती बढ़ा / घटाते हैं।

जब एक अग्रभूमि ब्लॉक जोड़ा या हटाया जाता है, तो सेल के आंतरिक और बाहरी को परिभाषित करने के लिए दक्षिणावर्त / वामावर्त घूमना का उपयोग करें। जैसे-जैसे कोशिकाओं का आकार सीमित होता है, यह चलना एक सीमित संख्या में कदम उठाएगी।

एक बोनस के रूप में, अब आपके पास "ऑपुलेंट" कमरों के बारे में बात करने का एक सस्ता तरीका है, या "कमरा एक पवित्र फव्वारा द्वारा धन्य है", या एक कमरे के बारे में कुछ और, क्योंकि कमरों में उनके भीतर प्रत्येक वस्तु प्रकार की गिनती होती है। (या, जैसा कि कमरे आकार में बंधे हैं, बस एक पुनरावृत्ति करते हैं; यह एक कैश निकालता है)।

प्रत्येक स्थान अधिकतम एक सेल में है, इसलिए आप प्रत्येक स्थान के सेल-आईडी को मुख्य मानचित्र पर संग्रहीत कर सकते हैं।


0

बाढ़ भराव एल्गोरिथ्म का उपयोग करते समय, एक चर भी बनाएं, जिसमें प्रत्येक टाइल की जाँच के साथ वृद्धि होगी, इसलिए यदि यह 35 (7 * 5, कमरे के अधिकतम आकार) से अधिक है, तो यह बस जाँच करना बंद कर देता है!


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