আমি এবং কীভাবে ইনপুট এবং গেমের বিষয়গুলির উদ্বেগগুলি পৃথক করব?


20

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

  • গেমটিকে নিজেই এটি পরিচালনা করতে দাও, ইভেন্টগুলিতে সাবস্ক্রাইব করুন এবং এর নিজস্ব পদ্ধতিগুলি কল করুন। এর ফলে গেম-অবজেক্টগুলি নিজেরাই সিদ্ধান্ত নিতে দেয় যে কোন ইনপুটগুলির ফলে কোন ক্রিয়াকলাপ ঘটে। একটি অসুবিধা বলে মনে হচ্ছে যে ইনপুট কোডটি "কোর" গেম অবজেক্ট কোডের সাথে ম্যাঙ্গেল হয়ে যায়। এছাড়াও গেমের অবজেক্টগুলি বাকি গেমের অবস্থা সম্পর্কে অবগত নয় এবং কখনও কখনও ইনপুট ইভেন্টগুলিতে কাজ করা উচিত নয়। এটা ঠিক মনে হচ্ছে না।

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

আপনি এটি পরিচালনা করতে কোন কৌশল ব্যবহার করছেন?

উত্তর:


7

আমি গেম অবজেক্টগুলি থেকে ইনপুট ইভেন্টগুলি পৃথক করার পরামর্শ দিচ্ছি যাতে আপনি 10 অবজেক্ট ক্লাস সম্পাদনা ও ডিবাগ না করে ইনপুট পদ্ধতিগুলি দ্রুত / আপগ্রেড করতে পারেন। উদাহরণস্বরূপ কী-বোর্ড-নিয়ন্ত্রণ থেকে মাউস + কীবোর্ডে স্থানান্তরিত করা বা কীগুলি পুনরায় সাইন ইন করা।

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

ইনপুট স্থিতির ট্র্যাক রাখতে একটি ইনপুট নিয়ামক ব্যবহার করুন:

Up press event   -> dir = up
Down press event -> dir = down

যখনই ইনপুট স্থিতি পরিবর্তন হয়, গেমের বিষয়গুলি পরিবর্তিত হতে প্রস্তুত কিনা তা মূল্যায়ন করুন:

set dir  ->  if gamestate != paused && battlemode == false
             ->  character.changeDir(dir);

আপনার গেমের অবজেক্টগুলিতে সাধারণ পদ্ধতিগুলি প্রয়োগ করুন, যা প্রয়োজন অনুসারে ইনপুট নিয়ন্ত্রক বা অন্যান্য গেম অবজেক্টগুলি কল করতে পারে:

changeDir (dir)
setSpeed (walk/run)

7

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

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


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

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

1

আমি আপনার গেমটিকে ( মডেল ) সম্ভাব্য ইনপুট ইভেন্টগুলির একটি তালিকা সংজ্ঞায়িত করার পরামর্শ দিচ্ছি ( বেস হিসাবে ইন্টারফেস সহ এনাম বা বস্তু হিসাবে প্রয়োগ করা হয়েছে)। যেমন থিংস MovingRightStarted, MovingRightStopped, FiredWeapon1, Escape, ইত্যাদি ...

গেমটি একটি ডেটা স্ট্রাকচার (উদাহরণস্বরূপ এ queue) সংজ্ঞায়িত করে যে আপনার ইনপুট কোডটি ( কন্ট্রোলার ) ইনপুট ইভেন্টগুলি পূরণ করতে পারে।

তারপরে আপনার গেমটি ইনপুট ইভেন্টগুলি পেতে ডেটা স্ট্রাকচারটি পোল করতে পারে।

এইভাবে, আপনি মডেলটিকে খাওয়ানোর জন্য বিভিন্ন ধরণের নিয়ামককে প্লাগ করতে পারেন:

  • কেবল কীবোর্ড
  • কীবোর্ড + মাউস
  • জয়স্টিক
  • টাচস্ক্রিন
  • কৃত্রিম বুদ্ধিমত্তা

আপনার কাছে কেবলমাত্র ইনপুট ইভেন্টগুলিকে মডেলটিতে ঠেলাতে হবে।


আমি মনে করি এটি সংরক্ষণ করার জন্য আপনার কোনও queueডেটাটাইপ পছন্দ না করে আপনি কী বোঝাতে চেয়েছেন তা আমি বুঝতে পেরেছি । কেন আপনি ব্যাখ্যা করতে পারেন?
রবার্ট মাসা

মডেল থেকে 2 ইনপুট ইভেন্টের পোলিংয়ের মধ্যে, নিয়ামকটি বেশ কয়েকটি ক্রিয়াকলাপ ঘটতে পারে এবং ব্যবহারকারীর ইনপুটটির ক্রমটি রাখা গুরুত্বপূর্ণ important এজন্য আমি একটি ফিফোর ডেটা কাঠামো বেছে নিয়েছি। প্রকৃতপক্ষে ইনপুটটি কখন ঘটেছে তা নির্দিষ্ট করে দেওয়ার দরকারও পড়তে পারে।
স্প্লো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.