এসডিএলে ফাঁদে মাউস


12

আমি কীভাবে ব্যবহারকারীর মাউসটিকে আমার গেমের ভিতরে আটকাতে পারি? এটি কোনও পূর্ণ স্ক্রিন গেম নয়, তবে আমি এটি চাই যাতে ব্যবহারকারী মাউসটিকে পর্দার বাইরে টেনে আনতে না পারে।

উইন্ডোতে (ম্যানুয়ালি) এটি বলার জন্য আমাকে কি মাউস এবং এসডিএল_ওয়ার্পকর্সরের স্থানাঙ্কগুলি পরীক্ষা করতে হবে, বা কোনও স্বয়ংক্রিয় উপায় আছে?

ধন্যবাদ.


আপনি কি কর্সারটি লুকিয়ে কেন্দ্রে ফিরে এনে ভাবেন? তারপরে, ওএস কার্সারের জায়গায় পর্দার কেন্দ্রে আপনার ক্রসইয়ারটি আঁকুন।
ভন হিল্ট

উত্তর:


24

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

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

এসডিএল এর আওতায় মাউস আটকে দেওয়ার সঠিক পদ্ধতিটি হ'ল:

SDL_WM_GrabInput( SDL_GRAB_ON );

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

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

এসডিএল 2 - 9 ডিসেম্বর, 2013-র জন্য আপডেট

এই ইন্টারফেসটি এসডিএল 2 এর জন্য পরিবর্তিত হয়েছে। আপনি যদি এসডিএল 1.2 ব্যবহার করছেন তবে উপরের উত্তরগুলি এখনও সঠিক। তবে এসডিএল 2 এর অধীনে SDL_WM_GrabInput(SDL_GrabMode)ফাংশনটি আর উপলব্ধ নেই। মাউস ক্যাপচার করার জন্য এসডিএল 2 এর নতুন উপায় হ'ল:

SDL_SetRelativeMouseMode(SDL_TRUE);

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


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

এটি নিখুঁতভাবে কাজ করেছে এবং এটি ম্যানুয়াল পদ্ধতির চেয়ে অনেক সহজ। ধন্যবাদ!
ডেভিড গোমেস

3

ট্রেভরের আপডেট হওয়া উত্তরটি এসডিএল 2 এর বর্তমান অবস্থা প্রতিফলিত করে, আপনি সেটটি SDL_Windowদিয়ে নিজের তৈরি করে মাউসকে ফাঁদে ফেলতে পারেন SDL_WINDOW_INPUT_GRABBED। সচেতন থাকুন যে আমি লিনাক্সে কিছু অদ্ভুত সমস্যা নিয়ে চলেছি (সম্ভবত কিছু এক্স উইন্ডোংয়ের কার্কের কারণে) যেখানে এসডিএল_কিউইটি না বলা হয় আপনি উইন্ডোটি থেকে কখনই বাইরে বেরোতে পারবেন না (এমনকি যদি অন্য কোনও OS ইভেন্ট ফোকাসটি চুরি করে নাও)।


আপনাকে ধন্যবাদ, SDL_WINDOW_INPUT_GRABBED আমার এসডিএল 2 কোডে পুরোপুরি কাজ করে।
অ্যাড্রিয়ান মাইয়ার


2

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

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