কোন স্তরে সংজ্ঞায়িত অবজেক্টের জন্য আমি কীভাবে অবিরাম অবস্থা বাস্তবায়ন করতে পারি?


17

আমি একটি 2 ডি মেট্রোডোভেনিয়া বিকাশ করছি যা আন্তঃসংযুক্ত স্তরের একটি সিরিজ নিয়ে পুনরায় দেখা যেতে পারে।

প্রতিটি স্তর একটি টাইল্ড টিএমএক্স ফাইল দ্বারা প্রতিনিধিত্ব করা হয় যেখানে আমি নির্দিষ্ট করেছি যেখানে বিভিন্ন স্প্রাইট শ্রেণীর বিভিন্ন বস্তু স্পোন করে (উদাহরণস্বরূপ, শত্রু, পিকআপস, লিভারস ইত্যাদি)। একটি নতুন গেম শুরু করার সময়, একটি সংরক্ষিত গেমটি লোড করা বা কোনও স্তর পরিবর্তন করার সময়, আমার গেম লুপটি উপযুক্ত টিএমএক্স ফাইলের মধ্য দিয়ে চলে এবং সেই স্তরের সমস্ত অবজেক্ট তৈরি করে।

আমি স্তর পরিবর্তনগুলি নিম্নরূপে পরিচালনা করি: যদি Playerবস্তুটি কোনও বস্তুকে ছেদ করে তবে এমন Portalএকটি change_map()পদ্ধতি বলা হয় যা একটি নতুন মানচিত্র (ছেদযুক্ত পোর্টালের সাথে সম্পর্কিত একটি) লোড করে এবং খেলোয়াড়কে নতুন মানচিত্রে উপযুক্ত অবস্থানে রাখে।

আমার কিছু জিনিসের স্টেট রয়েছে যা আমি স্তর পরিবর্তন এবং গেমটি সংরক্ষণ এবং ছাড়ার মাধ্যমে অবিচল থাকতে চাই । উদাহরণস্বরূপ, যদি কোনও খেলোয়াড় কোনও দরজা আনলক করে এবং দরজার রাষ্ট্রীয় বৈশিষ্ট্যটি "খোলার" সেট করা থাকে তবে আমি খেলোয়াড় ফিরে আসার পরে দরজাটি উন্মুক্ত করতে চাই। আমি লিভারের জন্য অনুরূপ কিছু চাই যা বাম বা ডান এবং অন্যান্য বিভিন্ন অবজেক্টে সেট করা যায়। তদ্ব্যতীত, প্লেয়ারটি মাঝে মাঝে আইটেম সংগ্রহ করে থাকে যা আমি প্লেয়ার যখন অঞ্চলটি ঘুরে দেখি তখন পুনরায় জিজ্ঞাসা করতে চাই না।

আমার প্রশ্ন এইভাবে আমি এই ধরণের দৃ pers়তা কীভাবে পরিচালনা করতে পারি?

আমি পাইথনে কাজ করছি, যদিও আমি মনে করি আপনি এটি থেকে দূরে বিমূর্ত করতে পারেন।

উত্তর:


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

আপনি যদি টাইল্ড মানচিত্র সম্পাদক ব্যবহার করে থাকেন যেমন টাইলযুক্ত বৈশিষ্ট্য যুক্ত করা খুব সহজ:

সম্পত্তি যুক্ত করা

আশা করি এটি কীভাবে স্থির রাষ্ট্রটিকে যথাসম্ভব সহজভাবে প্রয়োগ করতে হবে সে সম্পর্কে আপনাকে ধারণা দেবে!


এটি আমার পক্ষে যথাযথভাবে কীভাবে প্রয়োগ করা যায় তা দেখার জন্য আমি সংগ্রাম করছি যদিও এটি খুব সহায়ক। আমি এটি সম্পর্কে আরও কিছু চিন্তা করব।
গোল্ডেনগ্র্যামলিন

আমি মনে করি কীভাবে আমি মূল্যবোধগুলি কাজ করতে পারি তা দেখতে আমার সমস্যা হচ্ছে। যখন আমি সংরক্ষণ করি, আমি টিএমএক্স ডেটাতে টাইলগুলি দিয়ে পুনরাবৃত্তি করব না। পরিবর্তে, আমি আমার সমস্ত_স্প্রেট গ্রুপে স্প্রাইট বস্তুগুলির উপর পুনরাবৃত্তি করব। আমি যখন মানচিত্রগুলি লোড করি, আমি আমার স্প্রাইট অবজেক্টগুলিকে তাত্ক্ষণিক করার সময় টিএমএক্স অবজেক্টের টিএমএক্স বৈশিষ্ট্যগুলিকে পরামিতি হিসাবে ব্যবহার করি তবে এর পরে আমি সেই বৈশিষ্ট্যগুলিকে স্পর্শ করি না, সুতরাং তারা স্প্রাইট অবজেক্টগুলিতে পরিবর্তনগুলি ট্র্যাক করছে না।
গোল্ডেনগ্র্যামলিন

1
@ ডিটেস্টাস আপনার সম্ভবত আপনার স্প্রাইট অবজেক্টগুলিকে এমন একটি propertiesক্ষেত্র দেওয়া উচিত যা পরিবর্তে আপনি সংশোধন করেন এবং টাইলগুলি কেবল propertiesকোন সম্পত্তিটি সংশোধন করতে হবে তার ইঙ্গিত হিসাবে ব্যবহার করুন (তবে সমস্ত ডেটা আপনার স্প্রাইটে সঞ্চিত রয়েছে)। আপনি টাইলটি কেবল আপনার স্প্রাইটেও পাস করতে পারেন যাতে আপনি স্প্রিট থেকে টাইলটি সংশোধন করতে পারেন :) যদি এটি বোঝা যায় না তবে আমি কী বোঝাতে চাইছি আমি আরও কিছু সিউডোকোড উপস্থাপন করতে পারি
চারানর

3
@ ডিটেস্টাস আপনি অবিচ্ছিন্ন সত্তা (দরজা, লিভার) এর সাথে যোগাযোগ করার সাথে সাথে আপনি কী-মানচিত্রের মানচিত্রে নতুন রাষ্ট্রটি সংরক্ষণ করবেন। সংরক্ষণ করার সময় আপনাকে মানচিত্রে পুনরাবৃত্তি করার দরকার নেই, আপনি ইতিমধ্যে আপনার মানচিত্রে সবকিছু পেয়েছেন।
হের ডার্ব

1
@ ডিটেস্টাস হ্যাঁ আপনি হলেন :) এটি একটি সাধারণ অভিধান যেখানে কীগুলি সম্পত্তির নাম এবং মানগুলি (ভাল ... মান) হয়। আপনার অনন্য কী রয়েছে ততক্ষণ একই টাইলের একাধিক অবজেক্ট থাকা কোনও কিছুই পরিবর্তন করতে পারে না।
চরণোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.