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

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

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

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

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

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

onInputDeviceAdded() এবং onInputDeviceRemoved() কলব্যাক পদ্ধতিগুলি অ্যান্ড্রয়েড ভার্সনগুলিতে সাপোর্টিং কন্ট্রোলারগুলিতে প্রবর্তিত অ্যাবস্ট্রাকশন লেয়ারের অংশ। এই লিসেনার কলব্যাকগুলি বাস্তবায়নের মাধ্যমে, আপনার গেমটি কোনও কন্ট্রোলার যুক্ত বা সরানো হলে গেম কন্ট্রোলারের ডিভাইস আইডি সনাক্ত করতে পারে। এই সনাক্তকরণটি অ্যান্ড্রয়েড 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);
}