টিভির জন্য গেম তৈরি করা

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

ডিসপ্লে

টিভি স্ক্রিনের জন্য গেম ডেভেলপ করার সময় দুটি প্রধান বিষয় মনে রাখতে হবে, সেগুলি হল ল্যান্ডস্কেপ ওরিয়েন্টেশনের জন্য গেম ডিজাইন করা এবং কম লেটেন্সির জন্য সহায়তা প্রদান করা।

ল্যান্ডস্কেপ ডিসপ্লেতে কাজ করে

টিভি সবসময় আড়াআড়িভাবে থাকে: আপনি এটি ঘোরাতে পারবেন না এবং এতে কোনও পোর্ট্রেট ওরিয়েন্টেশন নেই। আপনার টিভি গেম সবসময় ল্যান্ডস্কেপ মোডে দেখানোর জন্য ডিজাইন করুন।

অটোমেটিক লো লেটেন্সি মোড

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

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

ন্যূনতম পোস্ট-প্রসেসিং চালু বা বন্ধ করতে, Window.setPreferMinimalPostProcessing() কল করুন অথবা উইন্ডোর preferMinimalPostProcessing অ্যাট্রিবিউট true-এ সেট করুন। সব ডিসপ্লেতে ন্যূনতম পোস্ট-প্রসেসিং কাজ করে না; কোনও নির্দিষ্ট ডিসপ্লেতে এটি কাজ করে কিনা তা জানতে, Display.isMinimalPostProcessingSupported() মেথড কল করুন।

ইনপুট ডিভাইস

টিভিতে টাচ ইন্টারফেস থাকে না, তাই আপনার কন্ট্রোল ঠিক করা এবং প্লেয়াররা যাতে সেগুলি সহজে বুঝতে পারে ও ব্যবহার করে আনন্দ পায় তা নিশ্চিত করা আরও বেশি গুরুত্বপূর্ণ। কন্ট্রোলার ম্যানেজ করার সময় অন্যান্য কিছু সমস্যার দিকেও নজর দিতে হয়, যেমন একাধিক কন্ট্রোলার ট্র্যাক করা এবং ডিসকানেক্ট হয়ে গেলে তা সুন্দরভাবে ম্যানেজ করা। গেম সহ সব TV অ্যাপে কন্ট্রোলার একইভাবে ম্যানেজ করতে হবে। টিভি কন্ট্রোলার ব্যবহার করার ব্যাপারে আরও তথ্যের জন্য টিভি কন্ট্রোলার ম্যানেজ করুন এবং গেমের জন্য টিভি কন্ট্রোলার ব্যবহার করার ব্যাপারে নির্দিষ্ট তথ্যের জন্য গেমের জন্য কন্ট্রোলার ম্যানেজ করুন নিবন্ধ পড়ুন।

কীবোর্ড লেআউটগুলি

Android 13 (API লেভেল 33) এবং তার পরবর্তী ভার্সনে, আপনি getKeyCodeForKeyLocation() ব্যবহার করে কীবোর্ড লেআউট নির্ধারণ করতে পারবেন। যেমন, আপনার গেম WASD কী ব্যবহার করে মুভমেন্ট সাপোর্ট করে, কিন্তু এটি AZERTY কীবোর্ডে সঠিকভাবে কাজ নাও করতে পারে, যেখানে A ও W কী আলাদা লোকেশনে থাকে। আপনি নির্দিষ্ট পজিশনে যে কী আশা করেন তার জন্য কীকোড পেতে পারেন:

Kotlin

val inputManager: InputManager? = requireActivity().getSystemService()

inputManager?.inputDeviceIds?.map { inputManager.getInputDevice(it) }
    ?.firstOrNull { it?.keyboardType == InputDevice.KEYBOARD_TYPE_ALPHABETIC }
    ?.let { inputDevice ->
        keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W)
        keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A)
        keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S)
        keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D)
    }

জাভা

InputManager inputManager = requireActivity().getSystemService(InputManager.class);
InputDevice inputDevice = Arrays.stream(inputManager.getInputDeviceIds())
        .mapToObj(inputManager::getInputDevice)
        .filter( device -> device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC)
        .filter(Objects::nonNull)
        .findFirst()
        .orElse(null);
if (inputDevice != null) {
    keyUp = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_W);
    keyLeft = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_A);
    keyDown = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_S);
    keyRight = inputDevice.getKeyCodeForKeyLocation(KeyEvent.KEYCODE_D);
}

এই উদাহরণে, AZERTY কীবোর্ডের সাথে, keyUp-কে KeyEvent.KEYCODE_Z-এ সেট করা হয়েছে, keyLeft-কে KeyEvent.KEYCODE_Q-এ সেট করা হয়েছে, যেখানে keyDown ও keyRight-কে যথাক্রমে KeyEvent.KEYCODE_S ও KeyEvent.KEYCODE_D-এ সেট করা হয়েছে। আপনি এখন এইসব কী কোডের জন্য মূল ইভেন্ট হ্যান্ডলার তৈরি করতে এবং প্রত্যাশিত আচরণ প্রয়োগ করতে পারবেন।

ম্যানিফেস্ট

Android ম্যানিফেস্টে গেমের কিছু বিশেষ জিনিস অন্তর্ভুক্ত করা উচিত।

হোম স্ক্রিনে আপনার গেম দেখান

Android TV-এর হোম স্ক্রিনে সাধারণ অ্যাপের থেকে আলাদা সারিতে গেম দেখানো হয়। গেমের তালিকায় আপনার গেম দেখাতে, আপনার অ্যাপ ম্যানিফেস্টের <application> ট্যাগে android:isGame অ্যাট্রিবিউট "true" হিসেবে সেট করুন। যেমন:

<application
    ...
    android:isGame="true"
    ...
>

গেম কন্ট্রোলারের জন্য সাপোর্ট ঘোষণা করা

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

  <uses-feature android:name="android.hardware.gamepad" android:required="false"/>

মনে রাখবেন: android.hardware.gamepad সাপোর্ট উল্লেখ করার সময়, আপনার গেম স্ট্যান্ডার্ড টিভি রিমোট (D-প্যাড) দিয়েও খেলা গেলে, android:required অ্যাট্রিবিউট "false" হিসেবে সেট করুন। আপনার গেম খেলার জন্য গেম কন্ট্রোলার প্রয়োজন হলে, android:required-কে শুধুমাত্র "true"-এ সেট করুন। android:required="true" সেটিং টিভি ডিভাইসে ইনস্টলেশন ব্লক করার পরিবর্তে, Android TV-র জন্য Google Play-তে "গেমপ্যাড প্রয়োজন" ব্যাজ এবং প্রি-ইনস্টল সতর্কতা দেখায়।

ম্যানিফেস্ট এন্ট্রি সম্পর্কে আরও জানতে, অ্যাপ ম্যানিফেস্ট দেখুন।

Google Play গেম্স পরিষেবা

আপনার গেম যদি Google Play গেম পরিষেবা-এর সাথে ইন্টিগ্রেট করা থাকে, তাহলে আপনাকে অ্যাচিভমেন্ট, সাইন-ইন ও গেম সেভ করার ব্যাপারে বেশ কিছু বিষয় মনে রাখতে হবে।

কৃতিত্ব

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

সাইন-ইন করুন

আপনার গেম চালু করার সময় ব্যবহারকারীকে সাইন-ইন করানোর চেষ্টা করা উচিত। প্লেয়ার পরপর কয়েকবার সাইন-ইন করার অনুরোধ প্রত্যাখ্যান করলে, আপনার গেমের আর জিজ্ঞাসা করা উচিত নয়। Android-এ সাইন-ইন প্রয়োগ করা লিঙ্ক থেকে সাইন-ইন সম্পর্কে আরও জানুন।

সেভ করা হচ্ছে

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

এছাড়াও, আপনার গেমের UI-তে এমন একটি বিকল্প প্রদান করতে হবে যাতে প্লেয়ার লোকাল ও ক্লাউড স্টোরেজে সেভ করা ডেটা মুছে দিতে পারেন। আপনি গেমের Settings স্ক্রিনে বিকল্পটি রাখতে পারেন। Play Services ব্যবহার করে সেভ করা গেম প্রয়োগ করার বিষয়ে নির্দিষ্ট তথ্য পেতে, Android-এ সেভ করা গেম দেখুন।

বেরিয়ে আসুন

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

ওয়েব

Android TV-এর জন্য গেমে ওয়েব ব্রাউজিং চালু করবেন না। Android TV-তে ওয়েব ব্রাউজার কাজ করে না।

মনে রাখবেন: সোশ্যাল মিডিয়া পরিষেবায় লগ-ইন করার জন্য আপনি WebView ক্লাস ব্যবহার করতে পারবেন।

নেটওয়ার্কিং

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