উপাদান-ভিত্তিক সত্তা সিস্টেমগুলিতে গেমের অবস্থা এবং ইনপুট হ্যান্ডলিং


16

আমার প্রশ্নটি হ'ল:

গেম স্টেটের সামগ্রীর চারপাশে একটি স্ট্যাক রাখার অবলম্বন না করে আমি কীভাবে আমার সত্তা সিস্টেমে গেমের রাজ্যগুলি পরিচালনা করতে পারি?

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

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

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

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

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

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

এটি করার জন্য অন্য কারও কি কোনও ধারণা আছে?

সম্পাদনা করুন যখন আমি এই প্রশ্নে বিশেষত ইনপুট নিয়ে কথা বলি, এর অর্থ সংস্থাগুলি / ইভেন্টগুলি সংঘর্ষ, টাইমার ইভেন্টগুলি ইত্যাদিতে বার্তা / ইভেন্ট প্রেরণে সক্ষম এমন কোনও সিস্টেমের অর্থ হতে পারে ...


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

1
এগুলি কি আপনার প্রশ্নের উত্তর দেয়? gamedev.stackexchange.com/questions/31153/... gamedev.stackexchange.com/questions/40672/... gamedev.stackexchange.com/questions/40608/...
MichaelHouse

2
@ বাইট 6 really সত্য নয়, কেবল প্রথমটিই গেমস্টেটগুলির সাথে করতে হবে (অন্যান্য ২ টি সত্তার মধ্যে রাজ্য) এবং এটি আমার যে সমস্যাটি ঘটছে তা সত্যিই মোকাবেলা করে না। গেমটি যখন বিরতি অবস্থায় থাকে তখন প্লেয়ার সত্তাকে (যেমন উদাহরণস্বরূপ) কোনও আন্দোলনের বার্তা পাঠানো বন্ধ করার জন্য ইনপুট সিস্টেমের সাথে কিছু ঘটতে হয়, আমি এটি করার ভাল উপায়টি বুঝতে পারি না।
#Farto

1
ঠিক আছে, তাদের সাথে সম্পর্কিত বিবেচনা করুন। ভাল প্রশ্ন.
মাইকেলহাউস

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

উত্তর:


14

যা প্রায়শই ব্যবহৃত হয় তা হ'ল একটি মধ্যবর্তী Intent Systemযা ইনপুট বিমূর্ত করে এবং প্রসঙ্গ এবং প্রাসঙ্গিক গেমস্টেটগুলি ট্র্যাক করে।

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

এইভাবে আপনার অন্যান্য উপাদানগুলি নির্দিষ্ট গেমপ্যাড / ইনপুটগুলির উপর নির্ভরশীল নয় (বুটোন_এ, বাটটন_বি বনাম বোটন_এক্স, বোতামন_ও ...) তবে তারা সকলেই একই অভিপ্রায় নিয়ে প্রতিক্রিয়া জানায় (ইনট্রেটান, ইনট্রেলোড ...)।

আর একটি সুবিধা হ'ল অভিপ্রায় সিস্টেম উপলব্ধ কন্ট্রোলারগুলিকে যোগ / অপসারণের বিষয়ে সচেতন হতে পারে, কারণ এটি যে কোনও গ্রাহকের কাছে ইন্টেন্টগুলি যেমন পছন্দ করতে পারে তেমন সিমুলেশনের বাইরেও পাঠাতে পারে AddPlayer(controllerID)

ইভেন্টগুলি / বার্তাগুলির মাধ্যমে আপনি সরাসরি গেমের অবস্থা সম্পর্কে কতটা তথ্য সিস্টেমকে সরবরাহ করেন বা সরাসরি আপনার উপর নির্ভর করে। তবে ইন্টেন্ট সিস্টেমে যে সময় বিনিয়োগ করা হয় তা সাধারণত মূল্যবান হয়।

আপনি ইন্টেন্ট কনটেক্সট পরিচালনা করতে পারেন যা যখন সিস্টেমে সংযুক্ত থাকে তখন উদ্দেশ্যগুলি উত্পন্ন করে।

প্রসঙ্গটিকে অগ্রাধিকার দেওয়া যেতে পারে, যেমন:

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

এইভাবে আপনি বর্তমানে প্রাসঙ্গিক প্রসঙ্গগুলি যুক্ত করতে বা মুছতে পারেন।

এবং পুরো অভিপ্রায় সিস্টেমগুলির মধ্যে একটি জিনিস হ'ল সিমুলেশন বিরতি থাকা অবস্থায় এটি চালানো উচিত।

নন সিমুলেশন সম্পর্কিত আপডেটগুলি না ভেঙে প্রায়শই গেম সিমুলেশনটি খেলতে / বিরতিতে ব্যবহৃত এক উপায় হ'ল বিভিন্ন সময়ে বিভিন্ন সেট ব্যবহার করা। অর্থাত GenericSystem::onTime(Long time, Long deltaTime, Long simTime, Long simDeltaTime)

এই পদ্ধতির সাহায্যে আপনার ইঞ্জিনটি কেবল গেমসের সিমটাইমটিতে বৃদ্ধিগুলি ব্লক করতে পারে যা প্রাসঙ্গিক অ্যানিমেশন এবং পদার্থবিজ্ঞানের ইঞ্জিনগুলির আপডেটগুলিকে অবরুদ্ধ করবে যা simTime and simDeltaTimeআপনার ক্যামেরার স্প্রিং এফেক্টের অবিচ্ছিন্ন আপডেটগুলি অনুমতি দেওয়ার সময় যদি এটি বিরতি দেওয়ার সময়ও চলতে থাকে তবে এর অ্যানিমেশন ডেটা ডাউনলোড করার সময় ভার্চুয়াল ইন-গেমের বিলবোর্ডে লোডিং এফেক্ট ...


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

আপনার সংস্থাগুলি ঝাঁপ দেওয়ার মতো অভিপ্রায় উপেক্ষা করতে পারে যখন তাদের রাষ্ট্র তাদের লাফিয়ে উঠতে দেয় না (যেমন মাটিতে স্পর্শ না করে)। গেমটি বিরতি দেওয়ার সময় তাদের যেমন অভিপ্রায় পাওয়ার বিষয়ে চিন্তা করতে হবে না।
কো

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

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

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

2

কীভাবে একটি বিশ্ব ইভেন্ট সিস্টেম তৈরি করবেন এবং তারপরে আপনার প্রতিটি সত্তার জন্য ইভেন্ট শ্রোতার উপাদান থাকবে? একটি ইভেন্ট "গেম স্টেট চেঞ্জ" এর পরে আপনি প্রতিটি নির্দিষ্ট সত্তার জন্য পৃথকভাবে উপাদানগুলির সাথে ঝাঁকুনি দিতে পারেন।

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

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

আমি যা কেবল ব্যাখ্যা করেছি তা মূলত আপনার চতুর্থ সমাধানের একটি ব্যবহারিক উদাহরণ।

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