পোল-ভিত্তিক ইনপুটটিতে কী সংমিশ্রণগুলি


9

সুতরাং ধরে নিন যে আপনার কাছে একটি ইনপুট সিস্টেম রয়েছে যা ভোটদানের উপর ভিত্তি করে

void update()
{
    if( Keyboard[ 'A' ] )
        // A is down
}

বলুন যে আপনি 3 থেকে 8 দৈর্ঘ্যের কী সংমিশ্রণগুলি (যেমন ডাউন, ডাউন-ফরোয়ার্ড, ফরোয়ার্ড, হ্যাডো-কেনের জন্য একটি) সনাক্ত করতে সক্ষম হতে চান

আপনি কিভাবে সেরা একটি জেনেরিক (সহজে সংশোধনযোগ্য / প্রোগ্রামযোগ্য) কী সমন্বয় ইনপুট সিস্টেম তৈরি করবে polled ইনপুট?

উত্তর:


7

মৌলিকভাবে, আপনি পারবেন না । কী সংমিশ্রণের জন্য একটি ক্রম প্রয়োজন, এবং একটি ক্রমকে ইভেন্টগুলি প্রয়োজন।

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

এই আদেশযুক্ত ইভেন্টগুলি একবার হয়ে গেলে, আপনি আপনার সরানো তালিকার সাথে মিলে যায় এবং একটি সঠিক কার্যকর করতে একটি সসীম রাষ্ট্র মেশিন বা অন্যান্য সরঞ্জাম ব্যবহার করতে পারেন।


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

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

যথেষ্ট ফর্সা। আমরা যদি 60hz এ ভোট দিই তবে আমি সন্দেহ করি যে আমরা 60 টি হার্জে পোলিং সরবরাহ করে এমন 16 মাইলের চেয়ে কম প্রেসের মধ্যে পার্থক্য করতে চাই (আমাদের খেলোয়াড়রা মানুষ বলে ধরে নিই))
ওলহোভস্কি

আমরা করি. দক্ষ ফাইটিং গেমের খেলোয়াড়রা তিনটি ফ্রেমের চেয়ে কম হ্যাডউকেন / শোরিউকেন স্টিক কমান্ডে প্রবেশ করতে পারে, যার অর্থ আমাদের তাদের মধ্যে পার্থক্য করতে হবে।

তারপরে আপনার 60hz এর চেয়ে বেশি বার পোল করা দরকার।
ওলোভস্কি

3

একটি উপায় হ'ল বর্তমান এবং পূর্ববর্তী ইনপুট রাজ্যগুলি সংরক্ষণ করা এবং প্রতিবার আপনি যখন ইনপুটটি পোল করেন তখন সেগুলি তুলনা করুন।

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

প্রতিটি পোলে এই জিনিসগুলি করে আপডেট করুন:

void update(){
    some_key_has_been_pressed = false;
    foreach(key in keys){
        if(previous_input[key].Down && current_input[key].Up){
            keys[key].up_timestamp = current_time();
        }

        if(current_input[key].Down){
            keys[key].down_timestamp = current_time();
            some_key_has_been_pressed = true;
        }
    }
}

এখন আপনি সামগ্রীর সামগ্রীর বিপরীতে আপনার কম্বোসগুলিকে মেলে ধরতে পারেন keys

প্রতিটি কম্বোয়ের জন্য একটি কম্বো অবজেক্ট থাকুন এবং প্রতিটি সমীক্ষায় প্রতিটি কম্বো অবজেক্টে কল (আপডেট) কল করুন।

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

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

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


দ্বিতীয় যদি বিবৃতিতে, আপনিও if(current_input[key].down){কি চাবিটি পরীক্ষা করতে চান না previous_inputরাজ্যে? যেমনটি লেখা হয়েছে, আমি মনে করি এটি ধারাবাহিকভাবে একটি হোল্ড কীটি আপডেট করবে down_timestamp
ওয়েবদেবকিট

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

স্পষ্টতার জন্য ধন্যবাদ। আমি বিপরীতে ভাবছিলাম, যেখানে আপ_টাইমস্ট্যাম্প - ডাউন_টাইমস্ট্যাম্প হোল্ড কীটির সময়কাল।
ওয়েবদেবকিট

1

সর্বশেষ এক্স কী ইভেন্টগুলির একটি স্ট্যাক তৈরি করুন, প্রতিটি মূল ইভেন্টের জন্য প্রেস / রিলিজের কী এবং সময়টির সাথে একটি অবজেক্ট যুক্ত করুন, তারপরে স্ট্যাকের শেষ সদস্যরা একটি বিশেষ প্যাটার্নের সাথে মেলে কিনা এবং সেই কীগুলি কী দ্রুত দ্রুত চাপা হয়েছিল কিনা তা পরীক্ষা করুন check সংমিশ্রণ হিসাবে গণনা। অবশেষে স্ট্যাক থেকে প্রাচীনতম বস্তুটি সরান।


2
আপনি যে স্ট্যাকটি থেকে নীচের
জিনিসটি

অর্ডার দেওয়া গুটি ডেটা সত্তা, একটি তালিকা সঠিক শব্দ হতে পারে।
aaaaaaaaaaaa

deque;) O (1) enq / deq ftw।
michael.bartnett

3
অর্ডার করা ক্রম যেখানে বস্তুগুলি এক প্রান্তে রাখা হয় এবং অন্যটি থেকে সরানো হয় তাকে সর্বাধিক সঠিকভাবে একটি সারি বলা হয় ।

1
আপনি একটি রিং-বাফার তৈরি করতে পারেন (বাফারেলেন্থ> = দীর্ঘতম কমান্ড) এবং এতে কীগুলি লিখতে পারেন (অবস্থান = সংখ্যা এমওডির বাফারলেন্থ)। কোনও যোগ / অপসারণের কোনও প্রয়োজন হবে না
ক্রোমস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.