मैं एक स्तर में परिभाषित वस्तुओं के लिए लगातार राज्य कैसे लागू कर सकता हूं?


17

मैं एक 2 डी मेट्रोडवानिया विकसित कर रहा हूं जिसमें परस्पर स्तर की एक श्रृंखला शामिल है जिसे पुन: संशोधित किया जा सकता है।

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

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

मेरी कुछ वस्तुओं में राज्य हैं जिन्हें मैं स्तर में बदलाव और खेल को बचाने और छोड़ने के माध्यम से लगातार रहना चाहूंगा । उदाहरण के लिए, यदि कोई खिलाड़ी किसी दरवाज़े को अनलॉक करता है और दरवाज़े की राज्य विशेषता "ओपन" पर सेट होती है, तो मैं चाहूंगा कि जब खिलाड़ी वापस लौटे तो मैं दरवाज़ा खुला रखूं। मैं लीवर के लिए कुछ ऐसा ही चाहता हूं, जिसे बाएं या दाएं और विभिन्न अन्य वस्तुओं पर सेट किया जा सके। इसके अलावा, खिलाड़ी को कभी-कभी उन वस्तुओं को इकट्ठा करना होगा जो मैं खिलाड़ी को फिर से भेजना नहीं चाहता।

मेरा सवाल इस प्रकार है कि मैं इस तरह की दृढ़ता को कैसे संभाल सकता हूं?

मैं पायथन में काम कर रहा हूं, हालांकि मुझे लगता है कि आप इससे दूर रह सकते हैं।

जवाबों:


27

मुझे लगता है कि इस मुद्दे को खत्म नहीं करने से सबसे अच्छा परिणाम मिलेगा, इसलिए मैं आपके गेम में एक सरल कुंजी-मूल्य बचत प्रणाली को लागू करूंगा, जिसे आप अपने अन्य डेटा सहेजने के साथ स्टोर करते हैं और फिर पिछली स्थिति तक पहुंचने के लिए ऑन-डिमांड लोड करते हैं।

प्रवाह कुछ इस तरह दिख सकता है:

  1. फ़ाइल से लोड स्तर
  2. एक टाइल / ऑब्जेक्ट चेक करने से पहले अगर उसमें "लगातार" संपत्ति है।
    1. यदि हाँ: संपत्ति से मेल खाते कुंजी के लिए सहेजे गए कुंजी-मूल्य जोड़े की जाँच करें और उचित मान प्राप्त करें।
    2. यदि नहीं: वस्तु को सामान्य रखें
  3. जब खिलाड़ी "स्थायी" संपत्ति के साथ सभी ऑब्जेक्ट्स के माध्यम से स्तर को बाहर निकालता है / गेम लूप बचाता है और कुंजी-मूल्य जोड़ी के रूप में उन्हें सहेजता है।

यहाँ एक छद्म कोड उदाहरण है जो मैं अपने साधारण 2 डी गेम के लिए उपयोग करता हूं:

def load_map(map):
    for y in range(0, height):
        for x in range(0, width):
            tile = map[x, y]

            for property in tile.properties:
                if is_persistent(property.name):
                    // Name prefixed with "persistent" means that it's persistent
                    // so we load the value from out persistent storage
                    property.value = persistent_values[property.name]

def save_map(map):
    ... everything in load_map ...
    if (property.name.matches("persistent_*")):
        // Name prefixed with "persistent" means that it's persistent
        // so we save the value to persistent storage
        persistent_values[property.name] = property.value

def is_persistent(name):
    return name.matches("persistent_*") and persistent_values.contains(name)

तब मैं इस संपत्ति का उपयोग करके राज्य की जांच कर सकता हूं:

def draw():
    if properties["persistent_is_pressed"].value:
        draw_sprite(button_pressed)
    else:
        draw_sprite(button_unpressed)

def on_pressed():
    properties["persistent_is_pressed"].value = not properties["persistent_is_pressed"].value

यदि आप टाइल वाले मैप एडिटर का उपयोग कर रहे हैं जैसे टाइल वाले गुणों को जोड़ना बहुत आसान है:

संपत्ति जोड़ना

उम्मीद है कि यह आपको एक विचार देगा कि कैसे संभव के रूप में लगातार राज्य को लागू करने के लिए!


यह बहुत उपयोगी है, हालांकि मैं यह देखने के लिए संघर्ष कर रहा हूं कि इसे अपनी स्थिति में कैसे लागू किया जाए। मैं इसके बारे में कुछ और सोचूंगा।
गोल्डनग्रेमलिन

मुझे लगता है कि मुझे यह देखने में परेशानी हो रही है कि मैं काम करने के लिए मूल्यों की बचत कैसे प्राप्त कर सकता हूं। जब मैं बचत कर रहा हूं, तो मैं टीएमएक्स डेटा में टाइलों पर पुनरावृत्ति नहीं करूंगा। बल्कि, मैं अपने all_sprites समूह में स्प्राइट ऑब्जेक्ट्स पर पुनरावृति कर रहा हूँ। जब मैं नक्शे लोड करता हूं, तो मैं अपने स्प्राइट ऑब्जेक्ट्स को इंस्टैंट करते समय TMX ऑब्जेक्ट्स के TMX गुणों को मापदंडों के रूप में उपयोग करता हूं, लेकिन उसके बाद मैं उन गुणों को नहीं छूता, इसलिए वे स्प्राइट ऑब्जेक्ट्स में परिवर्तन पर नज़र नहीं रख रहे हैं।
गोल्डनग्रेमलिन

1
@ डिएटेस्टस आपको शायद अपने स्प्राइट ऑब्जेक्ट्स को एक propertiesफ़ील्ड देना चाहिए जिसे आप इसके बजाय संशोधित करते हैं और केवल टाइल का उपयोग इस बात के propertiesसंकेत के रूप में करते हैं कि किस संपत्ति को संशोधित करने के लिए (लेकिन सभी डेटा आपके स्प्राइट में संग्रहीत है)। आप बस अपने स्प्राइट को टाइल पास कर सकते हैं, इसलिए आप स्प्राइट से टाइल को संशोधित कर सकते हैं :) अगर यह स्पष्ट नहीं है कि मेरा क्या मतलब है तो मैं कुछ और छद्म
कोड का मजाक उड़ा सकता हूं

3
@dietestus जैसे ही आप एक निरंतर इकाई (द्वार, लीवर) के साथ बातचीत करते हैं, आप नए राज्य को कुंजी-मान मानचित्र पर सहेजते हैं। जब आप बचत करते हैं, तो आपको नक्शे पर पुनरावृति करने की आवश्यकता नहीं होती है, आप पहले से ही अपने नक्शे में सब कुछ पा चुके हैं।
हेरब डर्ब

1
@ डिएटेस्टस हाँ आप हैं :) यह एक सरल शब्दकोष है जहाँ कुंजियाँ संपत्ति के नाम हैं और मूल्य हैं (अच्छी तरह से ... मान)। जब तक आपके पास अद्वितीय कुंजी नहीं होगी, तब तक एक ही टाइल पर कई ऑब्जेक्ट होने से कुछ भी नहीं बदलेगा।
चरनोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.