গেম-ওয়াইড ভেরিয়েবলগুলি সঞ্চয় করার সর্বোত্তম উপায়


23

অসুবিধা, রেজোলিউশন, পূর্ণ-পর্দা ইত্যাদির মতো জিনিসগুলির জন্য আমার কাছে একটি বিকল্প পর্দা রয়েছে তবে আমি রান-টাইমে এই পরিবর্তনগুলি সংরক্ষণ / গ্রহণের "সেরা" উপায়টি খুঁজে পেতে লড়াই করছি।

বর্তমানে, আমি একটি Constantsক্লাস প্রয়োগ করেছি যাতে সমস্ত GameOptionএনাম রয়েছে , তবে কীভাবে আমি এই সমস্ত বিকল্পের জন্য একটি ডিফল্ট চয়ন করব? এছাড়াও, আমি বর্তমানে নির্বাচিত এনাম কীভাবে পাব?

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

namespace V1.test.RPG
{
  public class GameOptions
  {
    public enum Difficulty { EASY, MEDIUM, HARD }
    public enum Sound { ON, QUIET, OFF }
    public enum Music { ON, QUIET, OFF }
    public enum ResolutionWidth
    {
        SMALL      = 1280,
        MEDIUM     = 1366,
        LARGE      = 1920,
        WIDESCREEN = 2560
    }
    public enum ResolutionHeight
    {
        SMALL      = 800,
        MEDIUM     = 768,
        LARGE      = 1080,
        WIDESCREEN = 1080
    }
    public Boolean fullScreen = false;
  }
}

এনবি: আমি এসও-তে জিজ্ঞাসা করেছি এবং তারা আমাকে এই জায়গায় দেখিয়েছে। সেখানে একটি মন্তব্য আছে তবে আমি এটি করার বিভিন্ন উপায় / সর্বাধিক ব্যবহৃত উপায়ে শুনতে চাই।


1
আপনি সঠিক জায়গায় জিজ্ঞাসা করেছেন; আপনাকে এখানে যে পাঠিয়েছে সে ভুল হয়েছে। আপনাকে সহায়তা করতে আমি যেভাবেই প্রশ্নের উত্তর দিয়েছি, তবে এটি কোনও গেম ডেভেলপমেন্ট নির্দিষ্ট প্রশ্ন নয়, এটি একটি সাধারণ প্রোগ্রামিং প্রশ্ন।
জোকিং করা

আমি শুধু এসও থ্রেড পড়েছি; আমি স্কট চেম্বারলিনের উত্তর পছন্দ করি।
জোকিং করা

@ জোকিং আমি গেম ডেভলপমেন্টের ক্ষেত্রে বিশেষত কোনও দিক যা কোনও সাধারণ অ্যাপ্লিকেশন থেকে পৃথক হতে পারে সে ক্ষেত্রে আমি তাকে এইভাবে নির্দেশ করেছি। আমি এও বুঝতে পেরেছিলাম যে আপনারা ইতিমধ্যে এই বিষয়টি সম্পর্কে সাধারণভাবে প্রশ্নোত্তর থাকতে পারেন যেহেতু এটি সাধারণ।
ক্রিস হেইস

গ্লোবালগুলি সম্পর্কে প্রকৃত প্রশ্নের স্পর্শকাতর, দয়া করে ধরে নিবেন না যে রেজোলিউশনের একটি নির্দিষ্ট সেট আছে।
লার্স ভিক্লুন্ড

উত্তর:


32

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

CVars:
একবার আপনার প্রকল্পের বৃদ্ধি, আপনি কটাক্ষপাত করা করতে চাইবেন CVARs । একটি সিভিএআর হ'ল "স্মার্ট ভেরিয়েবল", সুতরাং কথা বলতে গেলে, আপনি রান-টাইম সময়ে কনসোল, টার্মিনাল বা ইউআইয়ের মাধ্যমে সংশোধন করতে পারেন। সিভিএআরগুলি সাধারণত কোনও অবজেক্টের ক্ষেত্রে প্রয়োগ করা হয় যা অন্তর্নিহিত মানটি लपेटায়। বস্তুটি তারপরে, মানটি ট্র্যাক করে রাখতে পারে এবং ফাইল থেকে / এটিকে সেভ / লোড করতে পারে। নাম বা অন্যান্য অনন্য শনাক্তকারী দিয়ে অ্যাক্সেসের জন্য আপনি সিভিএআর অবজেক্টগুলিকে মানচিত্রে সংরক্ষণ করতে পারেন।

ধারণাটি আরও খানিকটা চিত্রিত করার জন্য, নিম্নলিখিত সিউডো-কোডটি একটি সিভিএআর টাইপের একটি সাধারণ উদাহরণ যা একটি intমান আবৃত করে :

// just some flags to exemplify:
enum CVarFlags {
    CVAR_PERSISTENT, // saved to file once app exits
    CVAR_VOLATILE    // never saved to file
};

class CVar {
public:
    // the constructor registers this variable with the global list of CVars
    CVar(string name, int value, int defaultValue, int flags);

    int getValue();
    void setValue(int v);
    void reset(); // reset to the default value

    // etcetera...

private:
    int flags; // flags like: save-to-file, etc.
    int value; // the actual value
    int defaultValue; // the default value to reset the variable to
};

// global list of all CVars:
map<string, CVar> g_cvars;

গ্লোবাল অ্যাক্সেস:
উপরের উদাহরণে, আমি ধরে নিয়েছি যে নির্মাতা CVarসর্বদা বৈশ্বিক cvarsমানচিত্রের সাথে চলকটি নিবন্ধন করে ; এটি বেশ কার্যকর, যেহেতু এটি আপনাকে এর মতো একটি ভেরিয়েবল ঘোষণা করার অনুমতি দেয়:

CVar my_var = new CVar("my_var", 0, 42, CVAR_PERSISTENT);

এই পরিবর্তনশীলটি স্বয়ংক্রিয়ভাবে বৈশ্বিক মানচিত্রে উপলভ্য হয়ে গেছে এবং আপনি ভেরিয়েবলের নামের সাথে মানচিত্রটি সূচী করে অন্য যে কোনও জায়গা থেকে এটি অ্যাক্সেস করতে পারেন:

CVar v = g_cvars.find("my_var");

অধ্যবসায়:
যখন গেমটি বন্ধ হয়ে যাচ্ছে তখন মানচিত্রটি পুনরাবৃত্তি করুন এবং চিহ্নিত সমস্ত ভেরিয়েবল CVAR_PERSISTENTএকটি ফাইলে সংরক্ষণ করুন। পরের বার যখন খেলা শুরু হবে, সেগুলি পুনরায় লোড করুন।

কেস আইন:
একটি শক্তিশালী সিভিএআর সিস্টেমের আরও সুনির্দিষ্ট উদাহরণের জন্য, ডুম 3-এ প্রদর্শিত বৈশিষ্ট্য প্রয়োগটি দেখুন ।


4

প্রথমে একটি এনাম সংজ্ঞা দেয় যে মানগুলি কী হতে পারে , মানগুলি কী নয় । এনামটি ঘোষণা করার পরে আপনাকে আরও একটি পরিবর্তনশীল ঘোষণা করতে হবে। উদাহরণ স্বরূপ:

public enum Sound
{
    ON,
    QUIET,
    OFF
}

public Sound soundValue;

এই উদাহরণে, আপনি এখন চালু করতে পারেন soundValue, ক্যুইট, বা বন্ধ।


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


1

গ্ল্যাম্পার্ট সমাধান খুব সম্পূর্ণ, তবে আমি আমার ব্যক্তিগত অভিজ্ঞতা যুক্ত করব।

আমি এই একই সমস্যার মধ্যে দৌড়েছি, এবং আমার সমাধানটি ছিল একটি স্ট্যাটিক ভেরিয়েবল ক্লাস ব্যবহার করা।

ভেরিয়েবল শ্রেণি অভ্যন্তরীণভাবে স্ট্রিং থেকে স্ট্রিং পর্যন্ত একটি মানচিত্র রাখে (এখনও পর্যন্ত আমার সমস্ত ভেরিয়েবল কেবল স্ট্রিং হয়) এবং গেটরস এবং সেটারগুলির মাধ্যমে অ্যাক্সেস করা হয়।

মুল বক্তব্যটি হ'ল বৈশ্বিক চলকগুলিতে অ্যাক্সেস পাওয়া সমস্ত ধরণের সূক্ষ্ম ত্রুটিগুলি পরিচয় করিয়ে দিতে পারে কারণ কোডের সম্পূর্ণ সম্পর্কহীন অংশগুলি হঠাৎ একে অপরের সাথে হস্তক্ষেপ করে।

এটি এড়ানোর জন্য, আমি নিম্নলিখিত শব্দার্থবিজ্ঞান চাপিয়েছি: setপদ্ধতিটি ব্যবহার করে অভিধানে ইতিমধ্যে যদি নামের সাথে একটি ভেরিয়েবল উপস্থিত থাকে এবং getএটি পরিবর্তন করার আগে অভিধান থেকে ভেরিয়েবল মুছে দেয় exception

দুটি অতিরিক্ত পদ্ধতি আপনি যা আশা করবেন তা সরবরাহ করে setAndOverwriteএবং getAndKeep। অন্যান্য পদ্ধতির শব্দার্থকতার বিষয়টি হ'ল আপনি সহজেই এই ধরণের ত্রুটিগুলি চিহ্নিত করতে পারেন "এই পদ্ধতিটি এই পরিবর্তনশীলটি আরম্ভ করার কথা, তবে অন্য পদ্ধতিটি আগে এটি করেছিল"।

অভিধানটি আরম্ভ করার জন্য, প্রাথমিক ভেরিয়েবলগুলি একটি জসন ফাইলে সংরক্ষণ করা হয় এবং তারপরে খেলা শুরু হওয়ার পরে পড়ুন।

দুঃখের বিষয় আমি এখনও আমার গেমটি নিয়ে খুব বেশি দূরে যাইনি তাই আমি এই পদ্ধতির দৃust়তার জন্য সাক্ষ্য দিতে পারি না। তবুও, সম্ভবত এটি সিভিএআর শীর্ষে আকর্ষণীয় কিছু সরবরাহ করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.