যদিও বেশিরভাগ গেম প্রতিটি অ্যান্ড্রয়েড-চালিত ডিভাইসে একজন ব্যবহারকারীকে সমর্থন করার জন্য ডিজাইন করা হয়েছে, তবুও একই অ্যান্ড্রয়েড-চালিত ডিভাইসে একই সাথে সংযুক্ত গেম কন্ট্রোলার ব্যবহার করে একাধিক ব্যবহারকারীকেও সমর্থন করা সম্ভব।
এই পাঠে আপনার একক ডিভাইস মাল্টিপ্লেয়ার গেমে একাধিক সংযুক্ত কন্ট্রোলার থেকে ইনপুট পরিচালনার কিছু প্রাথমিক কৌশল আলোচনা করা হয়েছে। এর মধ্যে রয়েছে প্লেয়ার অ্যাভাটার এবং প্রতিটি কন্ট্রোলার ডিভাইসের মধ্যে একটি ম্যাপিং বজায় রাখা এবং কন্ট্রোলার ইনপুট ইভেন্টগুলোকে যথাযথভাবে প্রসেস করা।
খেলোয়াড়দের কন্ট্রোলার ডিভাইস আইডিগুলির সাথে সংযুক্ত করুন।
যখন একটি গেম কন্ট্রোলার কোনো অ্যান্ড্রয়েড-চালিত ডিভাইসের সাথে সংযুক্ত হয়, তখন সিস্টেম এটিকে একটি ইন্টিজার ডিভাইস আইডি প্রদান করে। "একটি গেম কন্ট্রোলার সংযুক্ত আছে কিনা যাচাই করুন" অংশে দেখানো পদ্ধতি অনুযায়ী, আপনি InputDevice.getDeviceIds() কল করে সংযুক্ত গেম কন্ট্রোলারগুলোর ডিভাইস আইডি পেতে পারেন। এরপর আপনি আপনার গেমের প্রতিটি ডিভাইস আইডিকে একজন প্লেয়ারের সাথে যুক্ত করতে পারেন এবং প্রতিটি প্লেয়ারের জন্য আলাদাভাবে গেমের অ্যাকশনগুলো সম্পাদন করতে পারেন।
এই কোড স্নিপেটটি দেখায় কিভাবে একটি SparseArray ব্যবহার করে একজন প্লেয়ারের অ্যাভাটারকে একটি নির্দিষ্ট কন্ট্রোলারের সাথে যুক্ত করা যায়। এই উদাহরণে, mShips ভেরিয়েবলটি Ship অবজেক্টের একটি সংগ্রহ সংরক্ষণ করে। যখন কোনো ব্যবহারকারী একটি নতুন কন্ট্রোলার সংযুক্ত করেন, তখন গেমে একটি নতুন প্লেয়ার অ্যাভাটার তৈরি হয় এবং যখন এর সাথে যুক্ত কন্ট্রোলারটি সরিয়ে ফেলা হয়, তখন সেটিও মুছে যায়।
onInputDeviceAdded() এবং onInputDeviceRemoved() কলব্যাক মেথডগুলো "Supporting Controllers Across Android Versions" অংশে প্রবর্তিত অ্যাবস্ট্রাকশন লেয়ারের অংশ। এই লিসেনার কলব্যাকগুলো ইমপ্লিমেন্ট করার মাধ্যমে, আপনার গেম কোনো কন্ট্রোলার যোগ বা অপসারণ করা হলে সেটির ডিভাইস আইডি শনাক্ত করতে পারে। এই শনাক্তকরণ ব্যবস্থাটি অ্যান্ড্রয়েড ২.৩ (এপিআই লেভেল ৯) এবং এর পরবর্তী সংস্করণগুলোর সাথে সামঞ্জস্যপূর্ণ।
কোটলিন
private val ships = SparseArray<Ship>()
override fun onInputDeviceAdded(deviceId: Int) {
getShipForID(deviceId)
}
override fun onInputDeviceRemoved(deviceId: Int) {
removeShipForID(deviceId)
}
private fun getShipForID(shipID: Int): Ship {
return ships.get(shipID) ?: Ship().also {
ships.append(shipID, it)
}
}
private fun removeShipForID(shipID: Int) {
ships.remove(shipID)
}
জাভা
private final SparseArray<Ship> ships = new SparseArray<Ship>();
@Override
public void onInputDeviceAdded(int deviceId) {
getShipForID(deviceId);
}
@Override
public void onInputDeviceRemoved(int deviceId) {
removeShipForID(deviceId);
}
private Ship getShipForID(int shipID) {
Ship currentShip = ships.get(shipID);
if ( null == currentShip ) {
currentShip = new Ship();
ships.append(shipID, currentShip);
}
return currentShip;
}
private void removeShipForID(int shipID) {
ships.remove(shipID);
}
একাধিক কন্ট্রোলার ইনপুট প্রক্রিয়া করুন
একাধিক কন্ট্রোলার থেকে ইনপুট প্রসেস করার জন্য আপনার গেমটি নিম্নলিখিত লুপটি চালাবে:
- কোনো ইনপুট ইভেন্ট ঘটেছে কিনা তা শনাক্ত করুন।
- ইনপুট উৎস এবং এর ডিভাইস আইডি শনাক্ত করুন।
- ইনপুট ইভেন্ট কী কোড বা অ্যাক্সিস ভ্যালু দ্বারা নির্দেশিত অ্যাকশনের উপর ভিত্তি করে, সেই ডিভাইস আইডির সাথে যুক্ত প্লেয়ার অ্যাভাটারটি আপডেট করুন।
- ইউজার ইন্টারফেস রেন্ডার ও আপডেট করুন।
KeyEvent এবং MotionEvent ইনপুট ইভেন্টগুলোর সাথে ডিভাইস আইডি যুক্ত থাকে। আপনার গেম এটি ব্যবহার করে নির্ধারণ করতে পারে যে ইনপুট ইভেন্টটি কোন কন্ট্রোলার থেকে এসেছে, এবং সেই কন্ট্রোলারের সাথে যুক্ত প্লেয়ার অ্যাভাটারটি আপডেট করতে পারে।
নিম্নলিখিত কোড স্নিপেটটি দেখায় যে, কীভাবে আপনি একটি গেম কন্ট্রোলার ডিভাইস আইডির সাথে সম্পর্কিত প্লেয়ার অ্যাভাটারের রেফারেন্স পেতে পারেন এবং ব্যবহারকারীর সেই কন্ট্রোলারের বোতাম চাপার উপর ভিত্তি করে গেমটি আপডেট করতে পারেন।
কোটলিন
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (event.source and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD) {
event.deviceId.takeIf { it != -1 }?.also { deviceId ->
val currentShip: Ship = getShipForID(deviceId)
// Based on which key was pressed, update the player avatar
// (e.g. set the ship headings or fire lasers)
return true
}
}
return super.onKeyDown(keyCode, event)
}
জাভা
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((event.getSource() & InputDevice.SOURCE_GAMEPAD)
== InputDevice.SOURCE_GAMEPAD) {
int deviceId = event.getDeviceId();
if (deviceId != -1) {
Ship currentShip = getShipForId(deviceId);
// Based on which key was pressed, update the player avatar
// (e.g. set the ship headings or fire lasers)
...
return true;
}
}
return super.onKeyDown(keyCode, event);
}