গেম স্টেট সিস্টেমের বিকল্প?


30

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

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

আমার কাছে নির্বোধ বলে মনে হচ্ছে যে "গেম "টিকে" মেইন মেনু "এর সমান স্তরে রাখা হয়েছে। তবুও "গেম" রাষ্ট্র ভেঙে ফেলার কোনও উপায় নেই।

একটি গেম স্টেট সিস্টেম কি সেরা উপায়? "গেমের অবস্থা" পরিচালনা করার জন্য কি আরও কিছু আলাদা, আরও ভাল কৌশল রয়েছে? কোনও মুভি আঁকতে এবং প্রবেশের জন্য শোনায় এমন একটি অন্তর্ভুক্ত অবস্থা থাকা কি ঠিক আছে এবং তারপরে একটি লোডিং স্টেট যা রিসোর্স ম্যানেজারের উপরে লুপ করে এবং তারপরে গেম স্টেট যা ব্যবহারিকভাবে সবকিছু করে ? এটিও কি আপনার কাছে একরকম ভারসাম্যহীন বলে মনে হচ্ছে না? আমি কিছু অনুপস্থিত করছি?

উত্তর:


30

আমি মনে করি আপনি এখানে শব্দার্থক যুক্তি দিচ্ছেন। এটিকে গেম স্টেট বলা হয় কারণ এটি একটি সীমাবদ্ধ রাজ্য মেশিনের মতো আচরণ করে এবং তাদের মধ্যে সীমাবদ্ধ সংখ্যার রাজ্য এবং ট্রানজিশন থাকে। 'গেম স্টেট সিস্টেম' এর 'গেম' সামগ্রিক সিস্টেমকে বোঝায়, 'লোডিং', 'মাইনমেনু' ইত্যাদি গেমের রাজ্য হিসাবে। এগুলিকে সহজেই 'দৃশ্য' বা 'পর্দা' বা 'স্তর' বলা যেতে পারে। এটি ঠিক শব্দার্থক।

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

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


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

1
আমি এর জন্য উদাহরণ উত্স কোডটি দেখতে চাই! (পছন্দসই সি ++ / সি # / জাভাতে)
জোলোমন

1
দুর্ভাগ্যক্রমে, আমার কাছে কেবল এই মুহুর্তে
প্রযোজনীয়

7

গেমের অবস্থাটি বিশাল হবে তা নিশ্চিত, তবে গেমের রাজ্যে নিজেই তার ডেটা পরিচালনা করার জন্য কোনও রাজ্য মেশিন রাখতে পারে না এমন কোনও কারণ নেই। হায়ারার্কিকাল স্টেট মেশিনগুলি কার্যকর।


4

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


3

আসলে আমারও তা নিয়ে সমস্যা আছে।

ধরা যাক আপনার একটি খেলা আছে।

'গেম' কে 'লোডিং', 'মেইন মেনু' ইত্যাদির মতো একটি রাজ্য তৈরি করার পরিবর্তে - আইএমও গেমের কয়েকটি রাজ্য থাকতে দেওয়া আরও ভাল :

"লোড হচ্ছে" - "মেনু দেখাচ্ছে" - "বিরতি দেওয়া" , ইত্যাদি

গেমটি এখনও চলছে, তবে এটি যখন প্রধান মেনু দেখায় এটি 'শো মেনু' মোডে থাকবে।

এবং যখন গেমটি কোনও নির্দিষ্ট অবস্থায় নেই, কেবল চলছে just

এটি আমার কাছে কমপক্ষে আরও অনেক কিছু বোঝায়। :)


আমি রাজী. কেউ কেবল বিরতি-রাষ্ট্রে প্রবেশের জন্য গেম-স্টেট থেকে প্রস্থান করতে চায় না । অন্যদিকে: এটি এখনও একটি রাষ্ট্র ব্যবস্থা .. সবেমাত্র নেস্টেড :)
বামমজ্যাক

2

একটি অনলাইন প্রোগ্রামে (অনলাইনের প্রচলিত অর্থ, অর্থাত্ ক্রমাগত চলমান এবং ইনপুটটিতে প্রতিক্রিয়া জানানো, বরং ইন্টারনেটের সাথে সংযুক্ত অর্থের পরিবর্তে) সাধারণত 3 টি জিনিস থাকে:

  • ইনপুট সংগ্রহ এবং পরিচালনা
  • যুক্তি আপডেট
  • আউটপুট

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

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

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


1

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


আমি একই কথা বলতে যাচ্ছিলাম ... আমার সমস্ত মেনু, পর্দা, যাই হোক না কেন, কেবল অন্য স্তর।
স্পিডার

1

আমার খেলায়, আমি আছে:

এক্সিকিউশন ম্যানেজার , যা অ্যাপ্লিকেশনটিকে (গেম) ইনটাইটালাইজ করে, রিসোর্সগুলি লোড করে, অ্যাপ্লিকেশন থেকে বের হওয়ার সময় রিসোর্স রিলিজ করে।

গেম স্টেট ম্যানেজার , যা গেমলজিকঙ্গিনে থাকে এবং গেমের মূল লুপ সম্পর্কিত বিষয়গুলি নিয়ন্ত্রণ করার জন্য দায়ী: সংঘর্ষ সনাক্তকরণ, পদার্থবিজ্ঞানের গণনা, কীবোর্ড পাঠ, গণিতের ক্রিয়াকলাপ, ইত্যাদি ...

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

এখন জিনিসগুলি আমার কাছে আরও স্বচ্ছ দেখাচ্ছে এবং আমি নকশায় খুশি।


0

'গেম' স্টেটটির নাম 'গেমপ্লে' জাতীয় কিছুতে করুন তাহলে আপনার যুক্তি আরও ভাল মনে হচ্ছে; আপনি মেনুতে যেতে বাজানো বন্ধ করেছেন: আপনি মেইনমেনু রাজ্যে যেতে গেমপ্লে অবস্থাটি থেকে প্রস্থান করবেন।

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


0

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

আমার ইঞ্জিনে, গেম-স্টেটগুলি আসলে গেম সত্ত্বার তালিকাগুলি। আমার তখন সত্ত্বা রয়েছে যা মেনু হিসাবে কাজ করে। আমার মেনু-রাজ্যগুলি হয় গেমটি থামিয়ে দেয় (স্ট্যাকের উপরের আইটেমটি আপডেট না করে) তবে অন্য রাজ্য (গুলি) তাদের মডেলগুলিকে রেন্ডারে চাপায় যাতে আমার বিরতি-মেনু (যা পুরো স্ক্রিনটি কভার করে না) এখনও পিছনে গেমের রেন্ডারিং রয়েছে।

আমি আশা করি যে এটি কিছুটা আলাদা সিস্টেমের ধারণা দেয় যা কোনও রাষ্ট্র-মেশিনের ভিত্তিতে নয়।


0

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

এটা পুরোপুরি ঠিক আছে। বা কমপক্ষে, "এটি যে গেমটি হয় তার রাজ্যের উপর নির্ভর করে একটি বড় কুরুচিপূর্ণ সুইচ থাকা" এর চেয়ে উন্নতি।

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

আপনার যদি পর্যাপ্ত বিমূর্ত ফিনাইট স্টেট মেশিন থাকে তবে আপনি এটিকে গেম অবজেক্ট এবং আপনার এআই উভয়ের জন্য পুনরায় ব্যবহার করতে পারেন; হঠাৎ আপনি গেমের রাজ্যে প্রচুর পরিশ্রম "বিনিয়োগ" করছেন না - পরিবর্তে আপনি যে কোড ব্যবহার করেছেন তা পুনরায় ব্যবহার করছেন।

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


0

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

মূলত, একটি বৈষম্যমূলক ইউনিয়ন এমন এক ধরণের যা সর্বদা nক্ষেত্রে একটি হয় এবং সঞ্চিত ডেটা প্রতিটি ক্ষেত্রে পৃথক হতে পারে।

উদাহরণ স্বরূপ:

type GameState =
  | Menu of MenuState
  | Playing of SimulationState

এখানে, আমাদের GameStateধরণ হয় হয় Menuবা হয় Playing। যদি এটি হয় Menuতবে এটিতে কোনও MenuStateবস্তু থাকবে। যদি এটি হয় Playingতবে এটিতে কোনও SimulationStateবস্তু থাকবে।

আপডেট করার জন্য, আমরা matchরাজ্যে যাব এবং সেই অনুযায়ী একটি আলাদা ফাংশন কল করব:

let update gameTime = 
  let nextState = 
    match gameState with
    | Menu menuState -> updateMenu gameTime menuState
    | Playing simulationState -> updateSimulation gameTime simulationState

  // Mutate the current state
  gameState <- nextState

এবং একইভাবে রেন্ডারিংয়ের জন্য:

let render gameTime = 
  let nextState = 
    match gameState with
    | Menu menuState -> renderMenu menuState
    | Playing simulationState -> renderSimulation simulationState

এই পদ্ধতির একটি সুবিধা হ'ল আপনি বিশ্বব্যাপী রাজ্যগুলিতে জিনিসগুলি হ্যান্ডেল করতে পারবেন (যেমন সংস্থান হিসাবে) গ্লোবাল ছাড়াই বা "পরিষেবা" অবজেক্টগুলি অতিক্রম না করে easily

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