পুনরায় আরম্ভ না করে কীভাবে আমি বিকল্পগুলির স্ক্রীন থেকে প্রদর্শন সেটিংস আপডেট করতে পারি?


9

আমি বর্তমানে সি ++ 11 এ অ্যালেগ্রো 5 এবং বুস্টের সাথে একটি 2 ডি আরপিজি তৈরি করছি।

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

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

বিস্তারিত ব্যাখ্যা

স্ক্রিন ম্যানেজারে GameScreenবর্তমানে বিদ্যমান সমস্ত বস্তুর একটি তালিকা রয়েছে । এটি পপআপ সহ গেমের বিভিন্ন স্ক্রিন হবে। এই নকশাটি সি # / এক্সএনএ-তে গেম স্টেট ম্যানেজমেন্ট নমুনার কম-বেশি মেনে চলে ।

ScreenManagerআমার একটি রেফারেন্স রয়েছে Gameঅবজেক্ট। Gameবস্তুর সূচনা এবং মডিফাই খেলা এর সেটিংস। আমি যদি রেজোলিউশনটি পরিবর্তন করতে চাই, পূর্ণস্ক্রিনে যাই, বা ভলিউমটি নিঃশব্দ করে আমি Gameক্লাসে এটি করব।

তবে বর্তমানে অপশনস্ক্রিন গেম ক্লাসে অ্যাক্সেস করতে পারে না। নীচের চিত্রটি দেখুন:

একটি গেমস্ক্রিন তিনটি ইভেন্ট onFinished, onTransitionStartএবং সিগন্যাল করতে পারে onTransitionEndonOptionsChangedকেবলমাত্র একটি পর্দা এটি করে বলে কোনও কারণ নেই। স্ক্রিন ম্যানেজার সেটির জন্য ইভেন্ট হ্যান্ডলিং সেট আপ করতে পারে না কারণ এটি সমস্ত স্ক্রিনকে GameScreenগুলি হিসাবে পরিচালনা করে ।

আমার প্রশ্ন হ'ল আমি কীভাবে আমার নকশাটি পরিবর্তন করতে পারি যাতে বিকল্পমেনুতে কোনও পরিবর্তন পুনরায় আরম্ভের প্রয়োজন না হয় তবে অবিলম্বে পরিবর্তিত হয়? Gameএকবার প্রয়োগ বোতামটি ক্লিক করা হলে আমি আমার অবজেক্টটি আপডেট করার জন্য অনুরোধ করব ।


এই প্রশ্নটি (যদিও এটি গেম সম্পর্কিত) যদিও প্রোগ্রামার্স.স্ট্যাকেক্সচেঞ্জ.কমের জন্য একদম উপযুক্ত বলে মনে হচ্ছে কারণ এটি আসল গেমের চেয়ে সাধারণ ওও ডিজাইনের বিষয়ে বেশি
বুগী

এমন দুর্দান্ত দেখতে গ্রাফগুলি আপনি কোথায় পাবেন?
জোলটমোড

@psycketom: প্রথমটি ভিজিও ২০১৩ এবং দ্বিতীয়টি ভিএস ২০১২ দ্বারা কোড থেকে উত্পন্ন হয়েছে। আশা করি এইটি কাজ করবে!
আইএই

উত্তর:


1

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

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

গেমটি আবার চালু হয়ে গেলে, (এখন নতুন) ডিসপ্লে সেটিংসটি আবার ফাইল থেকে পড়ে।

--EDIT--

আনন্দে ... আমি যদি এই শেষ বাক্যটি লক্ষ্য করি তবে এটি সহায়তা করত। আপনি পুনরায় আরম্ভ করতে চান না। আপনার বাস্তবায়ন এবং আপনার ব্যাক-এ গ্রাফিক্স লাইব্রেরির উপর নির্ভর করে জিনিসগুলিকে কিছুটা আরও কঠিন করে তোলে।

আইআইআরসি, অ্যালেগ্রোতে একটি ফাংশন কল রয়েছে যা আপনাকে ফ্লাইতে প্রদর্শন সেটিংস পরিবর্তন করতে দেয়। আমি ঠিক এখনও অ্যালেগ্রো 5 তে আপ-আপ নই, তবে আমি জানি আপনি 4 সালেও পারেন।


আমি মনে করি না সমস্যাটি অ্যালেগ্রো এবং এর ক্ষমতার সাথে সম্পর্কিত। "আমার প্রশ্ন হ'ল আমি কীভাবে আমার নকশাটি পরিবর্তন করতে পারি যাতে অপশনমেনুতে কোনও পরিবর্তন পুনরায় আরম্ভের প্রয়োজন না হয় তবে অবিলম্বে পরিবর্তিত হয়?" পুনঃসূচনাটি হ'ল কারণ "অপশনস্ক্রিন বর্তমানে গেম শ্রেণিতে অ্যাক্সেস করতে পারে না" এবং যদি আমি সঠিকভাবে বুঝতে পারি তবে সেটিং ফাইল থেকে সেগুলি লোড করতে হবে।
ক্লাসিকথান্ডার

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

আমি "পুনরায় আরম্ভ না করে" বিটটি হাইলাইট করেছি যাতে অন্যরা একই শেষ বাক্যে ট্রিপ আপ না করে। এ জাতীয় গুরুত্বপূর্ণ ঘটনাটি শেষ পর্যন্ত হওয়া উচিত ছিল না, আমি ক্ষমাপ্রার্থী):
আইএইই

@ সোলবিভার কে বলেছে যে আপনাকে এটি পুনরায় আরম্ভ না করার জন্য আপনাকে অবশ্যই এটি তৈরি করতে হবে? এটির প্রয়োজনের পক্ষে এটি একটি ব্যবহার্য জিনিস, বাস্তবে এটি এখনকার দিনে বেশি সাধারণ হয়ে উঠছে । বিগ-বাজেটের গেমগুলির কয়েকটি সাম্প্রতিক প্রকাশগুলি (এক্সসিএম: শত্রু অজানা, স্কাইরিম, ইত্যাদি) পুনরায় আরম্ভের প্রয়োজন। (সত্য যে তারা বাষ্পে রয়েছে তার বিকল্পগুলির সার্ভার-সাইড সিঙ্কিংয়ের কারণে অপরাধী হতে পারে তবে আসুন সেখানে যাবেন না ...)
কেসি

1
@ ক্যাসি: সত্য, এবং নির্দিষ্ট বিকল্পগুলির জন্য আমি দেখতে পাচ্ছি কেন এটি প্রয়োজনীয় কেন, তবে ফুলস্ক্রিন / উইন্ডোড বা পর্দার সমাধানের মতো জিনিসগুলির জন্য? আমি কখনই এমন কোন খেলা দেখিনি যা এই সেটিংগুলির জন্য পুনঃসূচনা প্রয়োজন। আমার মূল প্রশ্নটি: গেমটি স্বয়ংক্রিয়ভাবে সেটিংস পরিবর্তন করতে পারলে আমি কেন আমার ব্যবহারকারীকে পুনরায় চালু করতে বাধ্য করব?
আইএই

1

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

init();
bool quit = false;
while( !quit )
{
    createWindow();
    reset();

    bool settings_changed = false;
    while( !quit && !settings_changed )
    {
        ... main loop
        // set quit=true if user clicks 'quit' in main menu
        // set settings_changed=true if user clicks 'apply' in options
    }

    destroyCurrentWindow();
}

আমি অ্যালেগ্রোর সাথে পরিচিত নই, তবে আমার উত্তরটি বেশ সাধারণ, তাই আমি আশা করি এটি আপনাকে বা অন্য কাউকে একই ধরণের সমস্যায় সহায়তা করে।


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

1

আপনার বর্তমান আর্কিটেকচারকে জঞ্জাল না করে আমি দুটি উপায় দেখতে পাচ্ছি two প্রথমত, আপনি ক্লাসে Gameউদাহরণের জন্য একটি পয়েন্টার সঞ্চয় করতে পারেন OptionsScreen। দ্বিতীয়ত, আপনি Gameক্লাসটি একটি নির্দিষ্ট ব্যবধানে বর্তমান সেটিংস আনতে পারতেন , প্রতি সেকেন্ডে বলে।

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

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

একটি গ্লোবাল ইভেন্ট ম্যানেজারের সাহায্যে, OptionsScreenবিশ্বব্যাপী কেবল পুনরায় চিত্র ছড়িয়ে দিতে পারে যা Gameপূর্বে শোনার জন্য নিবন্ধিত হয়েছে।

সাধারণত আপনি কোনও হ্যাশ মানচিত্রে ম্যানেজার শ্রেণির স্টোর ইভেন্টগুলি এবং কলব্যাকগুলি শোনার প্রয়োগ করতে পারেন। তারপরে আপনি সেই ব্যবস্থাপকের একক উদাহরণ তৈরি করতে পারেন এবং এটিতে আপনার উপাদানগুলিতে পয়েন্টার পাঠাতে পারেন। নতুন সি ++ ব্যবহার করা এটি বেশ সহজ, যেহেতু আপনি std::unordered_mapহ্যাশ ম্যাপ হিসাবে এবং std::functionকলব্যাকগুলি সঞ্চয় করতে পারেন । কী হিসাবে আপনি কী হিসাবে ব্যবহার করতে পারেন তা বিভিন্ন পদ্ধতির রয়েছে। উদাহরণস্বরূপ, আপনি ইভেন্ট ম্যানেজার স্ট্রিং ভিত্তিক করতে পারেন যা উপাদানগুলিকে আরও স্বাধীন করে তোলে। std::stringসেক্ষেত্রে আপনি হ্যাশ ম্যাপে কী হিসাবে ব্যবহার করবেন । আমি ব্যক্তিগতভাবে এটি পছন্দ করি এবং এটি অবশ্যই কোনও পারফরম্যান্সের সমস্যা নয়, তবে বেশিরভাগ traditionalতিহ্যবাহী ইভেন্ট সিস্টেমগুলি ক্লাস হিসাবে ইভেন্টগুলির সাথে কাজ করে।


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

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

1

ভাল, এটি পর্যবেক্ষক প্যাটার্নের কিছু নির্দিষ্ট ক্ষেত্রে।

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

মূলত, আপনার কিছু ধরণের থাকা দরকার SettingsStore। সেখানে আপনি সেটিংস সংরক্ষণ করুন। আপনি যখন একটি নতুন স্ক্রিন তৈরি করবেন তখন তাদের দোকানে পয়েন্টার লাগবে need OptionsScreenএটির ক্ষেত্রে সেটিংসের মানটি নিজেই পরিবর্তন করে। এর ক্ষেত্রে GameScreenএটি কেবল তাদের পড়বে। সুতরাং, আপনার গেমটিতে আপনি কেবল একটি উদাহরণ তৈরি করতে পারবেন যা সমস্ত স্ক্রিনের সাথে পাস হবে যার একটি প্রয়োজন।

এখন, এই SettingsStoreশ্রেণীর একটি তালিকা থাকবে notifiables। তারা এমন একটি ক্লাস যা একটি নির্দিষ্ট ISettingChangedইন্টারফেস প্রয়োগ করে । ইন্টারফেসটি এমন এক সাধারণ হতে পারে যাতে নিম্নলিখিত পদ্ধতিটি থাকে:

void settingChanged(std::string setting);

তারপরে আপনার স্ক্রিনে আপনি প্রতিটি সেটিংয়ের জন্য যুক্তিটি প্রয়োগ করবেন। তারপর, নিজেকে স্টোরে যোগ বিজ্ঞাপিত হবে: store->notifyOnChange(this);। যখন একটি সেটিং পরিবর্তন করা হয়, সেটিং নাম সহ কলব্যাক কল করা হয়। এরপরে নতুন সেটিং মানটি পুনরুদ্ধার করা যাবে SettingsStore

এখন, নিম্নলিখিত ধারণাগুলির সাথে এটি আরও বাড়ানো যেতে পারে:

  • সেটিংসের স্ট্রিংগুলি সঞ্চয় করে এমন একটি ক্লাস ব্যবহার করুন - SettingsStoreচারপাশে অনুলিপি-পেস্টিং স্ট্রিংগুলি রোধ করার জন্য এমনকি (কনস্ট্রিং স্ট্রিংগুলি) হতে পারে।
  • আরও ভাল, স্ট্রিংয়ের পরিবর্তে, আপনার কী সেটিংস রয়েছে তা নির্দিষ্ট করতে একটি এনাম ব্যবহার করুন
  • আপনি কলব্যাকটিতে আর্গুমেন্ট হিসাবে পুরানো এবং নতুন মানগুলি নির্দিষ্ট করতে পারেন তবে এটি আরও সংশ্লেষিত হবে, কারণ আপনার স্ট্রিং বা ইনট মান থাকতে পারে বা নোট নন। এটা আপনার উপর নির্ভর করছে.

0

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

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