আমি আসলে এক্সবক্স কন্ট্রোলার ইনপুট নিয়ে এই দ্বিধাটি পেরিয়ে এসেছি। যদিও একেবারে একই নয় তবে এটি প্রায় একই রকম। আপনার প্রয়োজন অনুসারে আপনি আমার উদাহরণে কোডটি পরিবর্তন করতে পারেন।
সম্পাদনা করুন: আপনার পরিস্থিতি এটি -> ব্যবহার করবে
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagrawmouse
এবং আপনি -> এর মাধ্যমে কীভাবে কোনও কাঁচা ইনপুট শ্রেণি তৈরি করবেন তা শিখতে পারেন
https://docs.microsoft.com/en-us/windows/desktop/inputdev/raw-input
তবে .. এখন সুপার অসাধারণ অ্যালগরিদমের ... সত্যই নয়, আরে .. এটি বেশ দুর্দান্ত :)
* সুতরাং ... আমরা প্রতিটি বোতামের রাজ্যগুলি সংরক্ষণ করতে পারি এবং যা চাপ, মুক্তি এবং হোল্ড ডাউন রয়েছে !!! আমরা হোল্ডিংয়ের সময়টিও যাচাই করতে পারি, তবে এটির জন্য যদি একক বিবৃতি প্রয়োজন হয় এবং যে কোনও সংখ্যক বোতাম চেক করতে পারে তবে এই তথ্যের জন্য নীচে কিছু নিয়ম দেখুন।
স্পষ্টতই যদি আমরা কিছু চাপা, প্রকাশ করা ইত্যাদি ইত্যাদি পরীক্ষা করতে চাই তবে আপনি "যদি (এটি) {}" করেন তবে এটি আমাদের প্রেস স্টেটটি কীভাবে পেতে পারে এবং তারপরে এটি পরবর্তী ফ্রেমটি বন্ধ করে দিতে পারে তাই আপনার " পরের বার আপনি যাচাই করবেন তখন সত্যই মিথ্যা হবে m
এখানে সম্পূর্ণ কোড:
https://github.com/JeremyDX/DX_B/blob/master/DX_B/XGameInput.cpp
কিভাবে এটা কাজ করে..
সুতরাং আমি নিশ্চিত নই যে আপনি যখন একটি বোতাম টিপে টিপে চাপছেন বা না তা চিত্রিত করার সময় আপনি যে মানগুলি পেয়েছেন, তবে মূলত আমি যখন এক্সআইনপুট লোড করি তখন আমি 0 থেকে 65535 এর মধ্যে একটি 16 বিট মান পাই এটিতে "চাপা" জন্য 15 বিট সম্ভাব্য রাজ্য রয়েছে।
সমস্যাটি যখনই আমি এটি যাচাই করেছিলাম তখন এটি আমাকে তথ্যের বর্তমান অবস্থা দেয় give আমার বর্তমান রাষ্ট্রকে চাপ দেওয়া, প্রকাশিত এবং হোল্ড মানগুলিতে রূপান্তর করার জন্য একটি উপায়ের দরকার ছিল।
সুতরাং আমি যা করেছি তা নীচে রয়েছে।
প্রথমে আমরা একটি "কারেন্ট" ভেরিয়েবল তৈরি করি। প্রতিবার আমরা এই ডেটাটি যাচাই করি আমরা "বর্তমান" কে একটি "পূর্ববর্তী" পরিবর্তনশীলতে সেট করি এবং তারপরে এখানে দেখা হিসাবে নতুন তথ্য "বর্তমান" এ সঞ্চয় করি ->
uint64_t LAST = CURRENT;
CURRENT = gamepad.wButtons;
এই তথ্যের সাথে এখানে এটি আকর্ষণীয় হয় !!
এখন আমরা বুঝতে পারি যে কোনও বোতামটি নীচে রাখা হচ্ছে কিনা!
BUTTONS_HOLD = LAST & CURRENT;
এটি যা করে তা মূলত এটি দুটি মানগুলির সাথে তুলনা করে এবং উভয় প্রদর্শিত যে কোনও বোতাম প্রেসগুলি 1 টি থাকবে এবং সমস্ত কিছু 0 তে সেট থাকবে।
অর্থাত (1 | 2 | 4) এবং (2 | 4 | 8) ফল দেবে (2 | 4)।
এখন আমাদের কাছে কোন বোতামগুলি "হেলড" ডাউন আছে। আমরা বাকি পেতে পারি।
চেপে রাখা সহজ .. আমরা আমাদের "বর্তমান" অবস্থা গ্রহণ করি এবং যে কোনও হোল্ড ডাউন বোতাম সরিয়ে ফেলি।
BUTTONS_PRESSED = CURRENT ^ BUTTONS_HOLD;
প্রকাশিত হ'ল কেবলমাত্র আমরা এর পরিবর্তে আমাদের লাস্ট স্টেটের সাথে এটি তুলনা করি।
BUTTONS_RELEASED = LAST ^ BUTTONS_HOLD;
তাই চাপা পরিস্থিতি দেখে। যদি ধরা যাক বর্তমানে আমাদের 2 ছিল | 4 | 8 টিপে। আমরা খুঁজে পেয়েছি যে 2 | 4 যেখানে অনুষ্ঠিত। যখন আমরা হেল্ড বিটগুলি সরিয়ে ফেলি তখন আমরা কেবল 8 টি রেখে আসি This এটি এই চক্রটির জন্য নতুন চাপানো বিট।
একই রিলিজের জন্য আবেদন করা যেতে পারে। এই পরিস্থিতিতে "শেষ" সেট করা হয়েছিল 1 | 2 | 4. সুতরাং আমরা 2 অপসারণ যখন 4 বিট। আমরা 1 দিয়ে রেখেছি 1 সুতরাং বোতামটি 1 শেষ ফ্রেম থেকে প্রকাশিত হয়েছিল।
এই উপরের দৃশ্যটি সম্ভবত আপনি সবচেয়ে বিস্তৃত তুলনার জন্য প্রস্তাব করতে পারেন এবং এটি বিবৃতি বা লুপের জন্য মাত্র 3 দ্রুত বিট গণনার জন্য 3 স্তরের ডেটা সরবরাহ করে।
আমি হোল্ড ডেটাও ডকুমেন্ট করতে চেয়েছিলাম যাতে আমার পরিস্থিতি নিখুঁত না হলেও ... এটি কী করে তা আমরা মূলত আমাদের যাচাই করতে চাই তা সেট করে।
সুতরাং প্রতিবার আমরা যখন আমাদের প্রেস / রিলিজ / হোল্ড ডেটা সেট করি আমরা তখনও পরীক্ষা করে থাকি যে হোল্ড ডেটা এখনও বর্তমান হোল্ড বিট চেকের সমান কিনা। যদি এটি না হয় তবে বর্তমান সময়টিতে এটি পুনরায় সেট করুন। আমার ক্ষেত্রে আমি এটি ফ্রেম সূচীতে সেট করছি তাই আমি জানি এটির জন্য কতগুলি ফ্রেম রাখা হয়েছে down
এই পদ্ধতির খারাপ দিকটি হ'ল আমি স্বতন্ত্র হোল্ড টাইম পেতে পারি না তবে আপনি একবারে একাধিক বিট পরীক্ষা করতে পারেন। আমি যদি হোল্ড বিটটি 1 এ সেট করে রাখি 16 যদি হয় 1 বা 16 না রাখা হয় তবে এটি ব্যর্থ হবে। সুতরাং এটি টিকিং চালিয়ে যাওয়ার জন্য এই সমস্ত বোতামটি চেপে ধরে রাখা দরকার।
তারপরে আপনি কোডটি সন্ধান করলে আপনি সমস্ত ঝরঝরে ফাংশন কল দেখতে পাবেন।
সুতরাং আপনার উদাহরণটি কেবল এই অ্যালগরিদম দিয়ে একটি বোতাম টিপ হয়েছে এবং একটি বোতাম প্রেস কেবল একবার ঘটতে পারে কিনা তা খতিয়ে দেখার জন্য হ্রাস পাবে। পরের চেক টিপতে এটি উপস্থিত থাকবে না যেহেতু আপনি আরও টিপতে পারবেন না একবার আবার চাপ দেওয়ার আগে আপনাকে মুক্তি দিতে হবে।