পোলিং বনাম ইভেন্ট চালিত ইনপুট


19

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

আমি পোলিংটিকে এই হিসাবে সংজ্ঞায়িত করছি: প্রতিটি আপডেট লুপ আমি কী কী টিপছে তা যাচাই করে নিই, মাউসটি কোথায়, বোতামগুলি টিপছে, তারপরে চালাও এবং সংগৃহীত তথ্যের ভিত্তিতে ক্রিয়া করি actions

আমি ইভেন্টটিকে চালিত হিসাবে সংজ্ঞায়িত করছি: বাধা ভিত্তিক ইভেন্টগুলি বাধা দেওয়া, যখন কোনও ইভেন্ট ঘটে এবং বাধা দেওয়া হয় এবং ইভেন্টের ভিত্তিতে একটি কোড ব্লক চালানো হয়।

আপনি কি মনে করেন যে সমস্ত ইভেন্ট চালিত, সমস্ত ভোটদান, বা উভয়ের সমন্বয়ই গ্রহণযোগ্য? উভয়ের পক্ষে যদি আপনার পক্ষে মতামত থাকে তবে দয়া করে সেগুলি তালিকাভুক্ত করুন। ধন্যবাদ।

সম্পাদনা

গেমটি জাভা / ওপেনজিএল ভিত্তিক, তাই উইন্ডোজ / ম্যাক / লিনাক্সে প্রকাশিত হবে। এটি মোবাইল ডিভাইসে প্রসারিত হওয়ার সম্ভাবনা কম। গেমটি আরটিএস স্টাইল, তৃতীয় ব্যক্তি 3 ডি।

সম্পাদনা 2

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

@Override  
private boolean handleEvent(Event event) {  
    if(hud.handleEvent(event)) {  
        return true;  
    }  
    return WORLD.handleEvent(event);  
}

বোতামগুলির পিছনে অবজেক্টগুলি নির্বাচন করতে এবং কী না তা আমি ইউআইয়ের মাধ্যমে ক্লিকগুলি ফাঁস করতে পারি না।

বর্তমানে আমার ক্যামেরা নিয়ন্ত্রণগুলি এখনও ভোটগ্রহণের উপর ভিত্তি করে রয়েছে এবং এটি আপাতত কাজ করছে বলে মনে হচ্ছে তবে আমি পরে এটি আপডেট করতে পারি।

আমি সমস্ত উত্তর প্রশংসা করি, দুঃখিত আমি শুধুমাত্র একটি বাছাই করতে পারে!


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

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

উত্তর:


17

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

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


ধন্যবাদ, আমি গেমের প্ল্যাটফর্ম এবং উদ্দেশ্য সম্পর্কে অতিরিক্ত তথ্য অন্তর্ভুক্ত করেছি।
MichaelHouse

1
মনে রাখবেন যে GetAsyncKeyStateউইন 32-এ ভোটদানের সহজ উপায়।
ম্যাক 21

ডার্প, আমি এখানে ন্যাট ব্রস'র মন্তব্যে একটি প্রশ্ন জিজ্ঞাসা করেছি যা আপনি এখানে মোকাবেলা করেছেন, তাই আমি অনুমান করি যে আমি এটি পরিমার্জন করব। সমস্ত পিসি কি অফার করে যে 1: 1 হার্ডওয়্যার ওএস কীবোর্ড ইভেন্টের সম্পর্কের ক্ষেত্রে বাধা দেয় এবং কোন ধরণের প্ল্যাটফর্মগুলি নিম্ন-স্তরের ভোটদানের মধ্যে সীমাবদ্ধ?
michael.bartnett

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

7

আমি কোনও কারণ দেখছি না যে আপনি উভয়ই করতে পারবেন না এবং উভয় বিশ্বের সেরা অর্জন করুন।

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

mouseInput = GetMouse();
kbInput = GetKeyboard();


// refactor this out to its own method if it makes sense
if menuState == Showing
    if mouseInput.LeftButton == State.Pressed
        LeftButton(mouseInput.X, mouseInput.Y)

// rest of game input code processing

void LeftButton(int x, int y)
{
    // left button event handler
}

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


1
আমি ডিভাইসগুলি থেকে ইনপুট পাওয়ার প্রকৃতি সম্পর্কে আগ্রহী। ডিভাইস ড্রাইভার পর্যায়ে ভোটদানের ফলাফল কি ওএস দ্বারা কী-বোর্ড ইভেন্টগুলি প্রেরণ করা হয়েছে? বা কোনও কীবোর্ড ইভেন্ট বাধাগ্রস্থ হওয়ার সাথে মিলছে? বা কোনও বাধা আছে, কিন্তু ওএসগুলি সেগুলি বাফার করে এবং এটি উপযুক্ত দেখলে তা প্রেরণ করে?
michael.bartnett

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

5

এখানে দুটি ভিন্ন বিষয় রয়েছে:

  1. আপনি কীভাবে ওএস / হার্ডওয়্যার থেকে ব্যবহারকারী ইনপুট পড়বেন?

  2. আপনি কীভাবে আপনার ইঞ্জিনে ব্যবহারকারী ইনপুট প্রক্রিয়া করবেন?

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

প্রক্রিয়াজাতকরণের জন্য, কয়েকটি পৃথক বিকল্প রয়েছে:

  • প্লেয়ার মুভমেন্ট কন্ট্রোল (এবং অনুরূপ স্কিম) এর জন্য, প্রতিটি ফ্রেমের গতি পুনরুদ্ধার করার জন্য আপনার পোলিং সহজ হতে পারে। এটি সম্ভবত আপনার অভ্যন্তরীণ লুপটি পোলিং ভিত্তিক হবে:

    যেমন কিছু speed += 1 if button.down else -1; clamp(speed, 0, 42);

  • বিচ্ছিন্ন ইভেন্টের জন্য (ফায়ার মিসাইল, বিরতি খেলা, গ্রহের অন্যদিকে টেলিপোর্ট), ইভেন্ট প্রসেসিং পছন্দনীয়, অন্যথায় আপনার কোড maybeLaunchMissile(key_state);কল দিয়ে ফাঁকা হয়ে যাবে, এবং এটি ঠিক ... খারাপ, মি'কায়। ;)

আশা করি এটা সাহায্য করবে.

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