Chromebook ব্যবহারকারীদের বিভিন্ন ইনপুট বিকল্প প্রদান করে: কীবোর্ড, মাউস, ট্র্যাকপ্যাড, টাচস্ক্রিন, স্টাইলাস, MIDI, এবং গেমপ্যাড/নীল কন্ট্রোলার। এর অর্থ হল একই ডিভাইসটি AAA স্ট্রিমিং গেমের জন্য একটি ডিজে স্টেশন, একজন শিল্পীর ক্যানভাস, অথবা একজন গেমারের পছন্দের প্ল্যাটফর্মে পরিণত হতে পারে।
একজন ডেভেলপার হিসেবে, এটি আপনাকে আপনার ব্যবহারকারীদের জন্য বহুমুখী এবং উত্তেজনাপূর্ণ অ্যাপ অভিজ্ঞতা তৈরি করার সুযোগ দেয় যা তাদের হাতের নাগালে থাকা ইনপুট ডিভাইসগুলিকে কাজে লাগায় - একটি সংযুক্ত কীবোর্ড থেকে স্টাইলাস, একটি Stadia গেম কন্ট্রোলার পর্যন্ত। তবে, এই সমস্ত সম্ভাবনার জন্য আপনার অ্যাপ অভিজ্ঞতাকে মসৃণ এবং যুক্তিসঙ্গত করার জন্য আপনার UI সম্পর্কেও চিন্তা করতে হবে। এটি বিশেষভাবে সত্য যদি আপনার অ্যাপ বা গেমটি মোবাইল ফোনের কথা মাথায় রেখে ডিজাইন করা হয়। উদাহরণস্বরূপ, যদি আপনার গেমটিতে ফোনের জন্য একটি অনস্ক্রিন টাচ-নিয়ন্ত্রিত জয়স্টিক থাকে, তাহলে ব্যবহারকারী যখন কীবোর্ড নিয়ে খেলবেন তখন আপনি সম্ভবত এটি লুকিয়ে রাখতে চাইবেন।
এই পৃষ্ঠায় আপনি একাধিক ইনপুট উৎস এবং সেগুলি মোকাবেলার কৌশল সম্পর্কে চিন্তা করার সময় মনে রাখার মতো প্রধান বিষয়গুলি পাবেন।
ব্যবহারকারীর দ্বারা সমর্থিত ইনপুট পদ্ধতি আবিষ্কার
আদর্শভাবে, আপনার অ্যাপটি ব্যবহারকারী যে ইনপুটই ব্যবহার করুক না কেন, নির্বিঘ্নে সাড়া দেবে। প্রায়শই এটি সহজ এবং ব্যবহারকারীকে অতিরিক্ত তথ্য প্রদানের প্রয়োজন হয় না। উদাহরণস্বরূপ, ব্যবহারকারী যদি মাউস, ট্র্যাকপ্যাড, টাচস্ক্রিন, স্টাইলাস ইত্যাদি দিয়ে একটি বোতামে ক্লিক করেন তবে এটি কাজ করবে এবং আপনাকে ব্যবহারকারীকে বলার প্রয়োজন নেই যে তারা বোতামটি সক্রিয় করার জন্য এই বিভিন্ন ডিভাইস ব্যবহার করতে পারেন।
তবে, এমন কিছু পরিস্থিতি রয়েছে যেখানে ইনপুট পদ্ধতি ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে পারে এবং আপনার অ্যাপ এটি সমর্থন করে তা তাদের জানানো যুক্তিসঙ্গত হতে পারে। কিছু উদাহরণ:
- একটি মিডিয়া প্লেয়িং অ্যাপে অনেক সহজ কীবোর্ড শর্টকাট থাকতে পারে যা ব্যবহারকারী সহজে অনুমান করতে পারবেন না।
- যদি আপনি একটি ডিজে অ্যাপ তৈরি করে থাকেন, তাহলে ব্যবহারকারী প্রথমে টাচস্ক্রিন ব্যবহার করতে পারেন এবং বুঝতেও পারবেন না যে আপনি তাদের কিছু বৈশিষ্ট্যে স্পর্শকাতর অ্যাক্সেস প্রদানের জন্য তাদের কীবোর্ড/ট্র্যাকপ্যাড ব্যবহার করার অনুমতি দিয়েছেন। একইভাবে, তারা হয়তো বুঝতেও পারবেন না যে আপনি বেশ কয়েকটি MIDI DJ কন্ট্রোলার সমর্থন করেন এবং তাদের সমর্থিত হার্ডওয়্যার পরীক্ষা করার জন্য উৎসাহিত করলে আরও খাঁটি DJing অভিজ্ঞতা পাওয়া যেতে পারে।
- টাচস্ক্রিন এবং কীবোর্ড/মাউসের সাহায্যে আপনার গেমটি দুর্দান্ত হতে পারে, কিন্তু ব্যবহারকারীরা হয়তো বুঝতে পারবেন না যে এটি বেশ কয়েকটি ব্লুটুথ গেম কন্ট্রোলারও সমর্থন করে। এর মধ্যে একটি সংযোগ করলে ব্যবহারকারীর সন্তুষ্টি এবং ব্যস্ততা বৃদ্ধি পেতে পারে।
আপনি ব্যবহারকারীদের উপযুক্ত সময়ে মেসেজিং এর মাধ্যমে ইনপুট বিকল্পগুলি আবিষ্কার করতে সাহায্য করতে পারেন। প্রতিটি অ্যাপের জন্য বাস্তবায়নটি ভিন্নভাবে দেখাবে। কিছু উদাহরণের মধ্যে রয়েছে:
- প্রথমবারের মতো চালানো বা দিনের সেরা পপআপ
- সেটিংস প্যানেলে কনফিগারেশন বিকল্পগুলি ব্যবহারকারীদের নিষ্ক্রিয়ভাবে নির্দেশ করতে পারে যে সমর্থন বিদ্যমান। যেমন, একটি গেমের সেটিংস প্যানেলে একটি "গেম কন্ট্রোলার" ট্যাব নির্দেশ করে যে কন্ট্রোলারগুলি সমর্থিত।
- প্রাসঙ্গিক বার্তা। যেমন, যদি আপনি একটি বাস্তব কীবোর্ড শনাক্ত করেন এবং দেখেন যে ব্যবহারকারী মাউস বা টাচস্ক্রিন ব্যবহার করে কোনও অ্যাকশনে ক্লিক করছেন, তাহলে আপনি একটি সহায়ক ইঙ্গিত দেখাতে পারেন যা একটি কীবোর্ড শর্টকাট প্রস্তাব করে
- কীবোর্ড শর্টকাট তালিকা। যখন একটি ফিজিক্যাল কীবোর্ড সনাক্ত করা হয়, তখন উপলব্ধ কীবোর্ড শর্টকাটগুলির একটি তালিকা কীভাবে সামনে আনা যায় তার UI-তে একটি ইঙ্গিত প্রদান করা দ্বৈত উদ্দেশ্য পূরণ করে: কীবোর্ড সমর্থন উপস্থিত থাকার বিজ্ঞাপন দেওয়া, এবং ব্যবহারকারীদের জন্য সমর্থিত শর্টকাটগুলি দেখতে এবং মনে রাখার একটি সহজ উপায় প্রদান করা।
ইনপুট পরিবর্তনের জন্য UI লেবেলিং/লেআউট
আদর্শভাবে, যদি ভিন্ন ইনপুট ডিভাইস ব্যবহার করা হয়, তাহলে আপনার ভিজ্যুয়াল ইন্টারফেস খুব বেশি পরিবর্তন করার প্রয়োজন হবে না, সমস্ত সম্ভাব্য ইনপুট "শুধু কাজ করবে"। তবে, গুরুত্বপূর্ণ ব্যতিক্রম রয়েছে। দুটি প্রধান হল স্পর্শ-নির্দিষ্ট UI এবং অন-স্ক্রিন প্রম্পট।
স্পর্শ-নির্দিষ্ট UI
যখনই আপনার অ্যাপে স্পর্শ-নির্দিষ্ট UI উপাদান থাকে, যেমন একটি গেমে অন-স্ক্রিন জয়স্টিক, তখন আপনার বিবেচনা করা উচিত যে স্পর্শ ব্যবহার না করা হলে ব্যবহারকারীর অভিজ্ঞতা কেমন হবে। কিছু মোবাইল গেমে, স্ক্রিনের একটি উল্লেখযোগ্য অংশ স্পর্শ-ভিত্তিক খেলার জন্য প্রয়োজনীয় নিয়ন্ত্রণ দ্বারা ব্যবহৃত হয়, কিন্তু ব্যবহারকারী যদি খেলার জন্য একটি গেমপ্যাড বা কীবোর্ড ব্যবহার করেন তবে এটি অপ্রয়োজনীয়। আপনার অ্যাপ বা গেমটিতে কোন ইনপুট পদ্ধতি সক্রিয়ভাবে ব্যবহৃত হচ্ছে তা সনাক্ত করার জন্য যুক্তি সরবরাহ করা উচিত এবং সেই অনুযায়ী UI সামঞ্জস্য করা উচিত। এটি কীভাবে করবেন তার কিছু উদাহরণের জন্য নীচের বাস্তবায়ন বিভাগটি দেখুন।

অন-স্ক্রিন প্রম্পট
আপনার অ্যাপটি আপনার ব্যবহারকারীদের জন্য সহায়ক অন-স্ক্রিন প্রম্পট প্রদান করতে পারে। সতর্ক থাকুন যে এগুলি ইনপুট-ডিভাইস নির্ভর নয়। উদাহরণস্বরূপ:
- সোয়াইপ করুন ...
- বন্ধ করতে যেকোনো জায়গায় ট্যাপ করুন
- জুম করতে পিঞ্চ করুন
- 'X' টিপুন...
- সক্রিয় করতে দীর্ঘক্ষণ টিপুন
কিছু অ্যাপ তাদের শব্দগুলিকে ইনপুট অজ্ঞেয়বাদী হিসেবে সামঞ্জস্য করতে সক্ষম হতে পারে। যেখানে এটি বোধগম্য সেখানে এটি পছন্দনীয়, তবে অনেক ক্ষেত্রে নির্দিষ্টতা গুরুত্বপূর্ণ এবং আপনার ব্যবহৃত ইনপুট পদ্ধতির উপর নির্ভর করে বিভিন্ন বার্তা দেখানোর প্রয়োজন হতে পারে, বিশেষ করে টিউটোরিয়াল-টাইপ মোডে যেমন অ্যাপগুলি প্রথমবার চালানোর সময়।
বহুভাষিক বিবেচনা
যদি আপনার অ্যাপটি একাধিক ভাষা সমর্থন করে, তাহলে আপনার স্ট্রিং আর্কিটেকচারটি নিয়ে ভাবতে হবে। উদাহরণস্বরূপ, যদি আপনি 3টি ইনপুট মোড এবং 5টি ভাষা সমর্থন করেন, তাহলে এর অর্থ প্রতিটি UI বার্তার 15টি ভিন্ন সংস্করণ হতে পারে। এটি নতুন বৈশিষ্ট্য যুক্ত করার জন্য প্রয়োজনীয় কাজের পরিমাণ বৃদ্ধি করবে এবং বানান ত্রুটির সম্ভাবনা বাড়িয়ে তুলবে।
একটি পদ্ধতি হল ইন্টারফেস অ্যাকশনগুলিকে স্ট্রিংগুলির একটি পৃথক সেট হিসাবে ভাবা। উদাহরণস্বরূপ, যদি আপনি "close" অ্যাকশনটিকে তার নিজস্ব স্ট্রিং ভেরিয়েবল হিসাবে সংজ্ঞায়িত করেন যার ইনপুট-নির্দিষ্ট রূপগুলি রয়েছে: "Tap anywhere to close", "Press 'Esc' to close", "Click anywhere to close", "Press any button to close", তাহলে আপনার সমস্ত UI বার্তা যা ব্যবহারকারীকে কীভাবে কিছু বন্ধ করতে হয় তা জানাতে হবে, তারা এই একক "close" স্ট্রিং ভেরিয়েবল ব্যবহার করতে পারে। যখন ইনপুট পদ্ধতি পরিবর্তন হয়, তখন কেবল এই একটি ভেরিয়েবলের মান পরিবর্তন করুন।
সফট কীবোর্ড / IME ইনপুট
মনে রাখবেন যে যদি কোনও ব্যবহারকারী কোনও ফিজিক্যাল কীবোর্ড ছাড়াই কোনও অ্যাপ ব্যবহার করেন, তাহলে টেক্সট ইনপুট অন-স্ক্রিন কীবোর্ডের মাধ্যমে করা যেতে পারে। অন-স্ক্রিন কীবোর্ড প্রদর্শিত হলে প্রয়োজনীয় UI উপাদানগুলি বন্ধ না থাকে তা পরীক্ষা করে দেখুন। আরও তথ্যের জন্য Android IME দৃশ্যমানতা ডকুমেন্টেশন দেখুন।
বাস্তবায়ন
বেশিরভাগ ক্ষেত্রেই, অ্যাপ বা গেমগুলি স্ক্রিনে যা দেখানো হচ্ছে তা নির্বিশেষে সমস্ত বৈধ ইনপুটে সঠিকভাবে সাড়া দেওয়া উচিত। যদি কোনও ব্যবহারকারী 10 মিনিটের জন্য টাচ-স্ক্রিন ব্যবহার করেন, কিন্তু তারপর হঠাৎ করে কীবোর্ড ব্যবহার শুরু করেন, তাহলে স্ক্রিনে ভিজ্যুয়াল প্রম্পট বা নিয়ন্ত্রণ নির্বিশেষে কীবোর্ড ইনপুটটি কাজ করা উচিত। অন্য কথায়, কার্যকারিতাকে ভিজ্যুয়াল/টেক্সটের চেয়ে অগ্রাধিকার দেওয়া উচিত। এটি আপনার ইনপুট সনাক্তকরণ লজিকে কোনও ত্রুটি বা অপ্রত্যাশিত পরিস্থিতির সৃষ্টি হলেও আপনার অ্যাপ/গেমটি ব্যবহারযোগ্য হবে তা নিশ্চিত করতে সহায়তা করে।
পরবর্তী ধাপ হল বর্তমানে ব্যবহৃত ইনপুট পদ্ধতির সঠিক UI দেখানো। আপনি কীভাবে এটি সঠিকভাবে সনাক্ত করবেন? আপনার অ্যাপ ব্যবহার করার সময় ব্যবহারকারীরা যদি বিভিন্ন ইনপুট পদ্ধতির মধ্যে স্যুইচ করে তাহলে কী হবে? যদি তারা একই সময়ে একাধিক পদ্ধতি ব্যবহার করে তাহলে কী হবে?
প্রাপ্ত ইভেন্টের উপর ভিত্তি করে অগ্রাধিকারপ্রাপ্ত রাষ্ট্রীয় মেশিন
একটি পদ্ধতি হল বর্তমান "সক্রিয় ইনপুট অবস্থা" ট্র্যাক রাখা - যা বর্তমানে ব্যবহারকারীকে স্ক্রিনে দেখানো ইনপুট প্রম্পটগুলি উপস্থাপন করে - অ্যাপ দ্বারা প্রাপ্ত প্রকৃত ইনপুট ইভেন্টগুলির ট্র্যাক রাখা এবং অগ্রাধিকারযুক্ত যুক্তি ব্যবহার করে রাজ্যগুলির মধ্যে স্থানান্তর করা।
অগ্রাধিকার দিন
ইনপুট অবস্থাকে কেন অগ্রাধিকার দেবেন? ব্যবহারকারীরা তাদের ডিভাইসের সাথে বিভিন্ন উপায়ে ইন্টারঅ্যাক্ট করবেন এবং আপনার অ্যাপটি তাদের পছন্দকে সমর্থন করবে। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী একই সাথে টাচস্ক্রিন এবং ব্লুটুথ মাউস ব্যবহার করতে চান, তবে এটি সমর্থিত হওয়া উচিত। কিন্তু আপনার কোন অন-স্ক্রিন ইনপুট প্রম্পট এবং নিয়ন্ত্রণগুলি প্রদর্শন করা উচিত? মাউস না স্পর্শ?
প্রতিটি প্রম্পটকে "ইনপুট অবস্থা" হিসেবে সংজ্ঞায়িত করা এবং তারপর তাদের অগ্রাধিকার নির্ধারণ করা এটিকে ধারাবাহিকভাবে সিদ্ধান্ত নিতে সাহায্য করতে পারে।
প্রাপ্ত ইনপুট ইভেন্টগুলি অবস্থা নির্ধারণ করে
কেন শুধুমাত্র প্রাপ্ত ইনপুট ইভেন্টগুলিতে কাজ করবেন? আপনি হয়তো ভাবছেন যে আপনি ব্লুটুথ সংযোগগুলি ট্র্যাক করে রাখতে পারেন যাতে কোনও ব্লুটুথ কন্ট্রোলার সংযুক্ত আছে কিনা তা নির্দেশ করা যায় অথবা USB ডিভাইসের জন্য USB সংযোগগুলি দেখুন। দুটি প্রধান কারণে এটি একটি প্রস্তাবিত পদ্ধতি নয়।
প্রথমত, API ভেরিয়েবলের উপর ভিত্তি করে সংযুক্ত ডিভাইস সম্পর্কে আপনি যে তথ্য অনুমান করতে পারবেন তা সামঞ্জস্যপূর্ণ নয় এবং ব্লুটুথ/হার্ডওয়্যার/স্টাইলাস ডিভাইসের সংখ্যা ক্রমাগত বৃদ্ধি পাচ্ছে।
সংযোগের স্থিতির পরিবর্তে প্রাপ্ত ইভেন্টগুলি ব্যবহার করার দ্বিতীয় কারণ হল ব্যবহারকারীদের একটি মাউস, ব্লুটুথ কন্ট্রোলার, MIDI কন্ট্রোলার ইত্যাদি সংযুক্ত থাকতে পারে কিন্তু তারা আপনার অ্যাপ বা গেমের সাথে ইন্টারঅ্যাক্ট করার জন্য সক্রিয়ভাবে এটি ব্যবহার নাও করতে পারে।
আপনার অ্যাপে সক্রিয়ভাবে গৃহীত ইনপুট ইভেন্টগুলিতে সাড়া দেওয়ার মাধ্যমে, আপনি নিশ্চিত করেন যে আপনি রিয়েল-টাইমে আপনার ব্যবহারকারীদের বাস্তব ক্রিয়াকলাপের প্রতি সাড়া দিচ্ছেন এবং অসম্পূর্ণ তথ্য দিয়ে তাদের উদ্দেশ্য অনুমান করার চেষ্টা করছেন না।
উদাহরণ: টাচ, কীবোর্ড/মাউস এবং কন্ট্রোলার সাপোর্ট সহ গেম
কল্পনা করুন আপনি টাচ-ভিত্তিক মোবাইল ফোনের জন্য একটি কার রেসিং গেম তৈরি করেছেন। খেলোয়াড়রা গতি বাড়াতে, গতি কমাতে, ডানে, বামে ঘুরতে, অথবা নাইট্রো ব্যবহার করে গতি বাড়াতে পারে।
বর্তমান টাচস্ক্রিন ইন্টারফেসে গতি এবং দিক নিয়ন্ত্রণের জন্য স্ক্রিনের নীচে বাম দিকে একটি অন-স্ক্রিন জয়স্টিক এবং নীচে ডানদিকে নাইট্রোর জন্য একটি বোতাম রয়েছে। ব্যবহারকারী ট্র্যাকে নাইট্রো ক্যানিস্টার সংগ্রহ করতে পারেন এবং যখন স্ক্রিনের নীচে নাইট্রো বারটি পূর্ণ হয়ে যায়, তখন বোতামের উপরে একটি বার্তা প্রদর্শিত হয় যেখানে লেখা থাকে "নাইট্রোর জন্য চাপুন!"। যদি এটি ব্যবহারকারীর প্রথম খেলা হয় বা কিছুক্ষণের জন্য কোনও ইনপুট না পাওয়া যায়, তাহলে জয়স্টিকের উপরে "টিউটোরিয়াল" লেখা প্রদর্শিত হবে যা ব্যবহারকারীকে গাড়িটি কীভাবে সরাতে হয় তা দেখায়।
আপনি কিবোর্ড এবং ব্লুটুথ গেম কন্ট্রোলার সাপোর্ট যোগ করতে চান। কোথা থেকে শুরু করবেন?

ইনপুট অবস্থা
আপনার গেমটি যে সমস্ত ইনপুট স্টেটে চলছে সেগুলি চিহ্নিত করে শুরু করুন এবং তারপরে প্রতিটি স্টেটে আপনি যে সমস্ত প্যারামিটার পরিবর্তন করতে চান তা তালিকাভুক্ত করুন।
| স্পর্শ | কীবোর্ড/মাউস | গেম কন্ট্রোলার | |
|---|---|---|---|
প্রতিক্রিয়া জানায় | সমস্ত ইনপুট | সমস্ত ইনপুট | সমস্ত ইনপুট |
অন-স্ক্রিন নিয়ন্ত্রণ | - অন-স্ক্রিন জয়স্টিক | - কোন জয়স্টিক নেই | - কোন জয়স্টিক নেই |
টেক্সট | নাইট্রোর জন্য ট্যাপ করুন! | নাইট্রোর জন্য "N" টিপুন! | নাইট্রোর জন্য "A" টিপুন! |
টিউটোরিয়াল | গতি/নির্দেশনার জন্য জয়স্টিকের ছবি | গতি/নির্দেশনার জন্য তীরচিহ্ন এবং WASD-এর ছবি | গতি/নির্দেশনার জন্য গেমপ্যাডের ছবি |
"সক্রিয় ইনপুট" অবস্থা ট্র্যাক করুন, এবং তারপর প্রয়োজন অনুসারে সেই অবস্থার উপর ভিত্তি করে UI আপডেট করুন।
দ্রষ্টব্য: মনে রাখবেন: আপনার গেম/অ্যাপের অবস্থা নির্বিশেষে সকল ইনপুট পদ্ধতিতে সাড়া দেওয়া উচিত। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী টাচস্ক্রিন দিয়ে গাড়ি চালাচ্ছেন, কিন্তু কীবোর্ডে N টিপছেন - তাহলে নাইট্রো অ্যাকশনটি ট্রিগার করা উচিত।
অগ্রাধিকারপ্রাপ্ত অবস্থার পরিবর্তন
কিছু ব্যবহারকারী একই সাথে টাচস্ক্রিন এবং কীবোর্ড ইনপুট ব্যবহার করতে পারেন। কেউ কেউ ট্যাবলেট মোডে সোফায় বসে আপনার গেম/অ্যাপ ব্যবহার শুরু করতে পারেন এবং তারপর টেবিলে থাকা কীবোর্ড ব্যবহার করতে পারেন। অন্যরা খেলার মাঝখানে গেম কন্ট্রোলারগুলিকে সংযুক্ত বা বিচ্ছিন্ন করতে পারেন।
আদর্শভাবে, আপনি ভুল UI উপাদানগুলি রাখতে চান না - যেমন ব্যবহারকারীকে টাচস্ক্রিন ব্যবহার করার সময় n কী টিপতে বলা। একই সময়ে, ব্যবহারকারীরা একই সাথে একাধিক ইনপুট ডিভাইস, যেমন টাচস্ক্রিন এবং কীবোর্ড ব্যবহার করার ক্ষেত্রে, আপনি দুটি অবস্থার মধ্যে ক্রমাগত UI অদলবদল করতে চান না।
এটি মোকাবেলা করার একটি উপায় হল ইনপুট টাইপ অগ্রাধিকার স্থাপন করা এবং অবস্থার পরিবর্তনের মধ্যে বিলম্ব তৈরি করা। উপরের গাড়ির গেমের জন্য, আপনি সর্বদা নিশ্চিত করতে চাইবেন যে স্ক্রিন টাচ ইভেন্টগুলি গ্রহণের সময় অন-স্ক্রিন জয়স্টিকটি দৃশ্যমান হয়, অন্যথায় গেমটি ব্যবহারকারীর কাছে অব্যবহারযোগ্য বলে মনে হতে পারে। এটি টাচস্ক্রিনকে সর্বোচ্চ অগ্রাধিকার ডিভাইসে পরিণত করবে।
যদি কীবোর্ড এবং টাচস্ক্রিন ইভেন্টগুলি একই সাথে গ্রহণ করা হয়, তাহলে গেমটি টাচস্ক্রিন মোডে থাকা উচিত - যদিও এটি এখনও কীবোর্ড ইনপুটে প্রতিক্রিয়া জানাবে। যদি 5 সেকেন্ড পরেও কোনও টাচস্ক্রিন ইনপুট না পাওয়া যায় এবং কীবোর্ড ইভেন্টগুলি এখনও গ্রহণ করা হয়, তাহলে সম্ভবত অন-স্ক্রিন নিয়ন্ত্রণগুলি বিবর্ণ হয়ে যাবে এবং গেমটি কীবোর্ড অবস্থায় চলে যাবে।
গেম কন্ট্রোলার ইনপুট একই ধরণের প্যাটার্ন অনুসরণ করবে: কন্ট্রোলার UI অবস্থাকে কীবোর্ড/মাউস এবং টাচের চেয়ে কম অগ্রাধিকার দেওয়া হবে এবং শুধুমাত্র তখনই প্রদর্শিত হবে যখন গেম কন্ট্রোলার ইনপুট গ্রহণ করা হচ্ছে এবং অন্যান্য ধরণের ইনপুট গ্রহণ করা হচ্ছে না। গেমটি সর্বদা কন্ট্রোলার ইনপুটে সাড়া দেবে।
নীচে একটি অবস্থা চিত্র এবং একটি রূপান্তর সারণী দেওয়া হল। আপনার অ্যাপ বা গেমের সাথে ধারণাটি খাপ খাইয়ে নিন।

| #১ টাচস্ক্রিন | #২ কীবোর্ড | #৩ গেমপ্যাড | |
|---|---|---|---|
#১ এ যান | নিষিদ্ধ | - টাচ ইনপুট প্রাপ্ত হয়েছে | - টাচ ইনপুট প্রাপ্ত হয়েছে |
#২ এ যান | - ৫ সেকেন্ডের জন্য কোন স্পর্শ নেই | নিষিদ্ধ | - কীবোর্ড ইনপুট প্রাপ্ত হয়েছে |
#৩ এ যান | - ৫ সেকেন্ডের জন্য কোন স্পর্শ নেই | - ৫ সেকেন্ডের জন্য কোন কীবোর্ড নেই | নিষিদ্ধ |
দ্রষ্টব্য: লক্ষ্য করুন কিভাবে অগ্রাধিকার নির্ধারণ কোন ধরণের ইনপুটকে প্রাধান্য দেওয়া উচিত তা স্পষ্ট করতে সাহায্য করে। ইনপুট অবস্থা তাৎক্ষণিকভাবে অগ্রাধিকারে "উপরে" চলে যায়:
৩. গেমপ্যাড -> ২. কীবোর্ড -> ১. স্পর্শ করুন
যখনই উচ্চ অগ্রাধিকার ডিভাইস ব্যবহার করা হয়, কিন্তু এটি ধীরে ধীরে অগ্রাধিকারে "নিচে" চলে যায়, শুধুমাত্র বিলম্বের পরে এবং শুধুমাত্র যদি নিম্ন অগ্রাধিকার ডিভাইসটি সক্রিয়ভাবে ব্যবহৃত হয়।
ইনপুট ইভেন্ট
স্ট্যান্ডার্ড অ্যান্ড্রয়েড এপিআই ব্যবহার করে বিভিন্ন ধরণের ইনপুট ডিভাইস থেকে ইনপুট ইভেন্টগুলি কীভাবে সনাক্ত করা যায় তার কিছু উদাহরণ কোড এখানে দেওয়া হল। উপরের মতো আপনার স্টেট মেশিনটি চালনা করতে এই ইভেন্টগুলি ব্যবহার করুন। আপনার প্রত্যাশিত ইনপুট ইভেন্টের ধরণ এবং আপনার অ্যাপ বা গেমের সাথে আপনার সাধারণ ধারণাটি খাপ খাইয়ে নেওয়া উচিত।
কীবোর্ড এবং কন্ট্রোলার বোতাম
// Drive the state machine based on the received input type // onKeyDown drives the state machine, but does not trigger game actions // Both keyboard and game controller events come through as key events override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if (event != null) { // Check input source val outputMessage = when (event.source) { SOURCE_KEYBOARD -> { MyStateMachine.KeyboardEventReceived() "Keyboard event" } SOURCE_GAMEPAD -> { MyStateMachine.ControllerEventReceived() "Game controller event" } else -> "Other key event: ${event.source}" } // Do something based on source type findViewById(R.id.text_message).text = outputMessage } // Pass event up to system return super.onKeyDown(keyCode, event) }
// Trigger game events based on key release // Both keyboard and game controller events come through as key events override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { when(keyCode) { KeyEvent.KEYCODE_N -> { MyStateMachine.keyboardEventReceived() engageNitro() return true // event handled here, return true } } // If event not handled, pass up to system return super.onKeyUp(keyCode, event) }
দ্রষ্টব্য: KeyEvents এর জন্য, আপনি onKeyDown() অথবা onKeyUp() ব্যবহার করতে পারেন। এখানে, onKeyDown() স্টেট মেশিন নিয়ন্ত্রণের জন্য ব্যবহৃত হয় যেখানে onKeyUp() গেম ইভেন্ট ট্রিগার করার জন্য ব্যবহৃত হয়।
যদি কোনও ব্যবহারকারী একটি বোতাম টিপে ধরে রাখেন, তাহলে onKeyUp() প্রতি কী প্রেসে কেবল একবার ট্রিগার হবে যেখানে onKeyDown() একাধিকবার কল করা হবে। ডাউন প্রেসে প্রতিক্রিয়া জানাতে চাইলে, আপনার onKeyDown() তে গেম ইভেন্টগুলি পরিচালনা করা উচিত এবং পুনরাবৃত্তি হওয়া ইভেন্টগুলি মোকাবেলা করার জন্য লজিক প্রয়োগ করা উচিত। আরও তথ্যের জন্য হ্যান্ডলিং কীবোর্ড অ্যাকশন ডকুমেন্টেশন দেখুন।
টাচ এবং স্টাইলাস
// Touch and stylus events come through as touch events override fun onTouchEvent(event: MotionEvent?): Boolean { if (event != null) { // Get tool type val pointerIndex = event.action and ACTION_POINTER_INDEX_MASK shr ACTION_POINTER_INDEX_SHIFT val toolType = event.getToolType(pointerIndex) // Check tool type val outputMessage = when (toolType) { TOOL_TYPE_FINGER -> { MyStateMachine.TouchEventReceived() "Touch event" } TOOL_TYPE_STYLUS -> { MyStateMachine.StylusEventReceived() "Stylus event" } else -> "Other touch event: ${toolType}" } // Do something based on tool type, return true if event handled findViewById(R.id.text_message).text = outputMessage } // If event not handled, pass up to system return super.onGenericMotionEvent(event) }
মাউস এবং জয়স্টিক
// Mouse and joystick events come through as generic events override fun onGenericMotionEvent(event: MotionEvent?): Boolean { if (event != null) { // Check input source val outputMessage = when (event.source) { SOURCE_JOYSTICK -> { MyStateMachine.ControllerEventReceived() "Controller event" } SOURCE_MOUSE -> { MyStateMachine.MouseEventReceived() "Mouse event" } else -> "Other generic event: ${event.source}" } // Do something based on source type, return true if event handled findViewById(R.id.text_message).text = outputMessage } // If event not handled, pass up to system return super.onGenericMotionEvent(event) }