কীবোর্ড ইনপুট সিস্টেম হ্যান্ডলিং


13

দ্রষ্টব্য: আমাকে এপিআই সীমাবদ্ধতার কারণে (এসএফএমএল) কলব্যাক করার চেয়ে পোল করতে হবে। আমি 'শালীন' উপাধির অভাবের জন্যও ক্ষমা চাইছি।

আমার মনে হয় এখানে আমার দুটি প্রশ্ন আছে; আমি যে ইনপুটটি গ্রহণ করছি তা কীভাবে নিবন্ধভুক্ত করব এবং এটি দিয়ে কী করব।

হ্যান্ডলিং ইনপুট

আপনি যে 'এ' কী টিপেছে তা নিবন্ধিত করার পরে, এবং উদাহরণস্বরূপ, কীভাবে সেখান থেকে এটি করবেন সে সম্পর্কে আমি কথা বলছি।

আমি পুরো কীবোর্ডের একটি অ্যারে দেখেছি, এরকম কিছু:

bool keyboard[256]; //And each input loop check the state of every key on the keyboard

তবে এটি অকার্যকর বলে মনে হচ্ছে। উদাহরণস্বরূপ, আপনি কেবল 'এ' কীটিকে 'প্লেয়ার বাম দিকে সরানো' তে সংযুক্ত করছেন, তবে এটি প্রতিটি কী পরীক্ষা করে, 30-60 বার সেকেন্ডে।

আমি তখন অন্য একটি সিস্টেম চেষ্টা করেছি যা এটি চাওয়ার জন্য সন্ধান করেছে।

std::map< unsigned char, Key> keyMap; //Key stores the keycode, and whether it's been pressed. Then, I declare a load of const unsigned char called 'Quit' or 'PlayerLeft'.
input->BindKey(Keys::PlayerLeft, KeyCode::A); //so now you can check if PlayerLeft, rather than if A.

তবে এর সাথে সমস্যা হ'ল আমি এখন কোনও নাম টাইপ করতে পারছি না, উদাহরণস্বরূপ, প্রতিটি একক কীকে আবদ্ধ না করে।

তারপরে, আমার দ্বিতীয় সমস্যা রয়েছে, যার জন্য আমি সত্যিই ভাল সমাধানের কথা ভাবতে পারি না:

ইনপুট প্রেরণ করা হচ্ছে

আমি এখন জানি যে একটি কী টিপানো হয়েছে বা সেই প্লেয়ার লেফটটি সত্য। তবে এখান থেকে কীভাবে যাব?

আমি if(input->IsKeyDown(Key::PlayerLeft) { player.MoveLeft(); }
এই দম্পতিরা সত্তাগুলিতে সর্বাধিক ইনপুটটি পরীক্ষা করার বিষয়ে ভেবেছিলাম এবং আমি এটি বরং অগোছালো বলে মনে করি। আমি খেলোয়াড়টিকে আপডেট হয়ে গেলে তার নিজস্ব চলাচল পরিচালনা করতে পছন্দ করব। আমি ভেবেছিলাম যে কোনও ধরণের ইভেন্ট সিস্টেম কাজ করতে পারে তবে এটি কীভাবে চলবে তা আমি জানি না। (আমি শুনেছি যে সিগন্যাল এবং স্লটগুলি এই ধরণের কাজের জন্য ভাল ছিল তবে এটি দৃশ্যত খুব ধীর এবং এটি কীভাবে ফিট হবে তা আমি দেখতে পাচ্ছি না)।

ধন্যবাদ।

উত্তর:


7

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

সাধারণত গেম অবজেক্টগুলির একটি ইনপুট হ্যান্ডলিং উপাদান থাকে যা ইনপুট ক্লাসের সাথে নিজেকে নিবন্ধিত করার জন্য এবং যে ইভেন্টগুলিতে আগ্রহী সেগুলি পরিচালনা করার জন্য পদ্ধতি সরবরাহের জন্য দায়ী movement আন্দোলনের জন্য, আমার কাছে একটি ইনপুট মুভার উপাদান রয়েছে যাতে একটি চাল (x, y) পদ্ধতি রয়েছে। এটি ইনপুট সিস্টেমের সাথে নিজেকে নিবন্ধভুক্ত করে এবং চলাচলের ইভেন্টগুলিতে বিজ্ঞপ্তি পায় (যেখানে x এবং y -1 এবং 0 হবে বাম দিকে সরানো বোঝাতে), মুভার উপাদানটি তার গতিপথের গেম অবজেক্টের স্থানাঙ্কগুলিকে আন্দোলনের দিক এবং বস্তুর বেগের ভিত্তিতে পরিবর্তন করে।

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


এটি অবশ্যই আমার আগ্রহী; ইনপুট উপাদানগুলি কিছু ইভেন্টের জন্য নিজেকে নিবন্ধিত করবে (প্লেয়ার ইনপুট যেমন 'বাম', 'ডান' ইত্যাদি ইত্যাদি রেজিস্টার করে) বা নিবন্ধিত প্রতিটি ইনপুট উপাদানগুলি সমস্ত বার্তা পাবে?
কম্যুনিস্ট হাঁস

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

6

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

আমার পরামর্শ:

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

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

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

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

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


আপনি কি মনে করেন না যে ঘটনাগুলি গ্রাফিক ফ্রেমের সাথে আবদ্ধ করা এক ধরণের নোংরা? আমি মনে করি এটি আলাদা করা উচিত।
জো সো

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

প্রকৃতপক্ষে; ডিসপ্লে থেকে আলাদা হারে কীবোর্ডটি পোলিং (বা অন্যান্য ইনপুট ডিভাইস) চালানো যাবে না এর কোনও কারণ নেই। প্রকৃতপক্ষে, আপনি যদি 100Hz এ ইনপুটগুলি পোল করেন তবে ভিডিও হার্ডওয়্যার আপডেটের ফ্রিকোয়েন্সি নির্বিশেষে আপনি সত্যিই সামঞ্জস্যপূর্ণ ব্যবহারকারী নিয়ন্ত্রণের অভিজ্ঞতা সরবরাহ করতে পারেন। আপনি কীভাবে আপনার ডেটা পরিচালনা করেন (লেচিং ইত্যাদি সম্পর্কিত) আপনাকে কিছুটা চালাক হতে হবে তবে এটি অঙ্গভঙ্গির মতো জিনিসগুলিকে সামঞ্জস্যপূর্ণ করার পক্ষে সহজতর করে তুলবে।
ড্যাশ-টম-ব্যাং

3

এসএফএমএল-তে, কী-চাপানো ইভেন্টের ধরণের সাহায্যে কীগুলি সেটিকে চাপানো হয়েছিল সে অনুসারে আপনার কী রয়েছে। আপনি কিছুক্ষণের জন্য প্রতিটি কী প্রক্রিয়া করুন (getNextEvent ())।

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

আপনার দ্বিতীয় প্রশ্ন সম্পর্কে, আমি আপনাকে এটি এটিকে রাখার জন্য সুপারিশ করব কারণ এটি আপনার গেমপ্লেটিকে টুইঙ্ক করা সহজ করে। আপনি যদি সংকেত বা এ জাতীয় ব্যবহার করেন, আপনাকে "রানকিডাউন" এবং "জম্পকিস্লট" এর জন্য অন্য একটি স্লট তৈরি করতে হবে। তবে যদি আপনার গেমটিতে, দু'জনকে চাপ দেওয়া হয় তখন একটি বিশেষ ক্রিয়া করা হয় তবে কী হয়?

আপনি যদি ইনপুট এবং সত্তাগুলি সজ্জিত করতে চান তবে আপনি নিজের ইনপুটটিকে একটি রাজ্য (রানকি / ট্রু, ফায়ারকি = ভুয়া, ...) বানাতে পারেন এবং এটি প্লেয়ারের কাছে পাঠাতে পারে যেমন আপনি অন্য কোনও ইভেন্ট আপনার এআইগুলিতে প্রেরণ করেন।


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

1
তবে আমি মনে করি Calvin1602 যে পয়েন্টটি দিচ্ছে তা হ'ল এপিআই সীমাবদ্ধতার (এসএফএমএল) কলব্যাক করার চেয়ে "আমাকে পোল করতে হবে" প্রশ্নে আপনার মূল বক্তব্যটি সত্য নয়; আপনার ইভেন্ট রয়েছে, যাতে আপনি কোনও ইভেন্ট পরিচালনা করার পরে কলব্যাক ইস্যু করতে পারেন।
কাইলোটন

3

সঠিক সমাধানটি প্রায়শই আপনি দুটি পদ্ধতির সংমিশ্রণ করেন:

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

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

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


1

আমি ড্যাশ-টম-ব্যাংয়ের উত্তরটি খুব পছন্দ করি, এটি একটি ইনপুট সিস্টেমটি ডিজাইনের সময় আপনার কিছু বিষয় অবশ্যই মনে রাখা উচিত।

আমি এমন একটি টিউটোরিয়াল যুক্ত করতে চাই যা আমি হোঁচট খেয়েছি যা একই দিকে চলে যায় (ইনপুট প্রসঙ্গ, 3 স্তর সহ ...):

http://www.gamedev.net/blog/355/entry-2250186-designing-a-robust-input-handling-system-for-games/

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