একাধিক গেম কন্ট্রোলার সমর্থন করুন

যদিও বেশিরভাগ গেমগুলি প্রতি অ্যান্ড্রয়েড ডিভাইসে একজন একক ব্যবহারকারীকে সমর্থন করার জন্য ডিজাইন করা হয়েছে, একই Android ডিভাইসে একই সাথে সংযুক্ত গেম কন্ট্রোলার সহ একাধিক ব্যবহারকারীকে সমর্থন করাও সম্ভব।

এই পাঠটি একাধিক সংযুক্ত কন্ট্রোলার থেকে আপনার একক ডিভাইস মাল্টিপ্লেয়ার গেমে ইনপুট পরিচালনা করার জন্য কিছু প্রাথমিক কৌশল কভার করে। এর মধ্যে রয়েছে প্লেয়ার অবতার এবং প্রতিটি কন্ট্রোলার ডিভাইসের মধ্যে একটি ম্যাপিং বজায় রাখা এবং যথাযথভাবে কন্ট্রোলার ইনপুট ইভেন্ট প্রক্রিয়াকরণ।

কন্ট্রোলার ডিভাইস আইডিতে প্লেয়ার ম্যাপ করুন

যখন একটি গেম কন্ট্রোলার একটি অ্যান্ড্রয়েড ডিভাইসের সাথে সংযুক্ত থাকে, তখন সিস্টেম এটিকে একটি পূর্ণসংখ্যা ডিভাইস আইডি বরাদ্দ করে। আপনি InputDevice.getDeviceIds() কল করে কানেক্ট করা গেম কন্ট্রোলারের জন্য ডিভাইস আইডি পেতে পারেন, যেমনটি ভেরিফাই এ গেম কন্ট্রোলার সংযুক্ত আছে। তারপরে আপনি আপনার গেমের একজন প্লেয়ারের সাথে প্রতিটি ডিভাইস আইডি সংযুক্ত করতে পারেন এবং প্রতিটি প্লেয়ারের জন্য আলাদাভাবে গেম অ্যাকশন প্রক্রিয়া করতে পারেন।

দ্রষ্টব্য: Android 4.1 (API স্তর 16) এবং উচ্চতর চলমান ডিভাইসগুলিতে, আপনি getDescriptor() ব্যবহার করে একটি ইনপুট ডিভাইসের বর্ণনাকারী পেতে পারেন, যা ইনপুট ডিভাইসের জন্য একটি অনন্য স্থায়ী স্ট্রিং মান প্রদান করে৷ একটি ডিভাইস আইডির বিপরীতে, ইনপুট ডিভাইসটি সংযোগ বিচ্ছিন্ন, পুনঃসংযোগ বা পুনরায় কনফিগার করা হলেও বর্ণনাকারীর মান পরিবর্তন হবে না।

নীচের কোড স্নিপেটটি দেখায় কিভাবে একটি নির্দিষ্ট কন্ট্রোলারের সাথে একজন খেলোয়াড়ের অবতার যুক্ত করতে একটি SparseArray ব্যবহার করতে হয়। এই উদাহরণে, mShips ভেরিয়েবল Ship অবজেক্টের একটি সংগ্রহ সঞ্চয় করে। একটি নতুন প্লেয়ার অবতার তৈরি করা হয় যখন একটি নতুন কন্ট্রোলার একটি ব্যবহারকারী দ্বারা সংযুক্ত করা হয় এবং যখন এটির সংশ্লিষ্ট নিয়ামক সরানো হয় তখন এটিকে সরিয়ে দেওয়া হয়।

onInputDeviceAdded() এবং onInputDeviceRemoved() কলব্যাক পদ্ধতিগুলি Android ভার্সন জুড়ে সাপোর্টিং কন্ট্রোলারগুলিতে প্রবর্তিত বিমূর্ততা স্তরের অংশ। এই শ্রোতা কলব্যাকগুলি বাস্তবায়ন করে, আপনার গেমটি গেম কন্ট্রোলারের ডিভাইস আইডি সনাক্ত করতে পারে যখন একটি নিয়ামক যোগ করা হয় বা সরানো হয়। এই সনাক্তকরণটি Android 2.3 (API স্তর 9) এবং উচ্চতর সংস্করণের সাথে সামঞ্জস্যপূর্ণ৷

কোটলিন

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);
}

একাধিক কন্ট্রোলার ইনপুট প্রক্রিয়া করুন

একাধিক কন্ট্রোলার থেকে ইনপুট প্রক্রিয়া করার জন্য আপনার গেমটিকে নিম্নলিখিত লুপ চালানো উচিত:

  1. একটি ইনপুট ঘটনা ঘটেছে কিনা তা সনাক্ত করুন৷
  2. ইনপুট উৎস এবং এর ডিভাইস আইডি সনাক্ত করুন।
  3. ইনপুট ইভেন্ট কী কোড বা অক্ষ মান দ্বারা নির্দেশিত কর্মের উপর ভিত্তি করে, সেই ডিভাইস আইডির সাথে সংশ্লিষ্ট প্লেয়ার অবতার আপডেট করুন।
  4. ইউজার ইন্টারফেস রেন্ডার এবং আপডেট করুন।

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);
}

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