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

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

ডিসপ্লে

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

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

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

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

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

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

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

ইনপুট ডিভাইস

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

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

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 সাপোর্ট নির্দিষ্ট করার সময়, android:required অ্যাট্রিবিউটকে "true" হিসেবে সেট করবেন না। আপনি এটি করলে, ব্যবহারকারীরা টিভি ডিভাইসে আপনার অ্যাপ ইনস্টল করতে পারবেন না।

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

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

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

কৃতিত্ব

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

সাইন-ইন করুন

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

সেভ করা হচ্ছে

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

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

বেরিয়ে আসুন

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

ওয়েব

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

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

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

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