Tạo trò chơi dành cho TV

Màn hình TV cho thấy một số yếu tố cần cân nhắc đối với các nhà phát triển trò chơi dành cho thiết bị di động. Những khu vực này bao gồm kích thước lớn, giao thức điều khiển và thực tế là tất cả người chơi đều đang xem cùng lúc.

Màn hình

Hai điều chính cần lưu ý khi phát triển trò chơi cho màn hình TV là thiết kế trò chơi theo hướng ngang và hỗ trợ độ trễ thấp.

Hỗ trợ màn hình ngang

TV luôn nằm lệch sang một bên: Bạn không thể xoay TV và không có hướng dọc. Hãy luôn thiết kế sao cho trò chơi trên TV hiển thị ở chế độ ngang.

Chế độ tự động độ trễ thấp

Một số màn hình có thể xử lý hậu kỳ đồ hoạ. Quá trình xử lý hậu kỳ này giúp cải thiện chất lượng đồ hoạ nhưng có thể làm tăng độ trễ. Các màn hình mới hơn hỗ trợ HDMI 2.1 có chế độ tự động có độ trễ thấp (ALLM), giúp giảm thiểu độ trễ bằng cách tắt tính năng xử lý hậu kỳ này. Để biết thêm thông tin chi tiết về TẤT CẢM, hãy tham khảo Thông số kỹ thuật HDMI 2.1. Các màn hình khác có thể hỗ trợ chế độ trò chơi có hành vi tương tự.

Trên Android 11 trở lên, một cửa sổ có thể yêu cầu sử dụng chế độ tự động có độ trễ thấp hoặc chế độ trò chơi (nếu có) bằng cách yêu cầu xử lý hậu kỳ ở mức tối thiểu. Tính năng này đặc biệt hữu ích cho các ứng dụng trò chơi và hội nghị truyền hình, trong đó độ trễ thấp quan trọng hơn việc có đồ hoạ tốt nhất có thể.

Để bật hoặc tắt công cụ xử lý hậu kỳ tối thiểu, hãy gọi Window.setPreferMinimalPostProcessing() hoặc đặt thuộc tính preferMinimalPostProcessing của cửa sổ thành true. Không phải màn hình nào cũng hỗ trợ xử lý hậu kỳ ở mức tối thiểu; để tìm hiểu xem một màn hình cụ thể có hỗ trợ tính năng này hay không, hãy gọi phương thức Display.isMinimalPostProcessingSupported().

Thiết bị đầu vào

TV không có giao diện cảm ứng, vì vậy, điều quan trọng hơn nữa là bạn phải thiết lập các nút điều khiển phù hợp và đảm bảo người chơi thấy các nút điều khiển đó trực quan và thú vị khi sử dụng. Việc xử lý bộ điều khiển cũng gây ra một số vấn đề khác cần chú ý, chẳng hạn như theo dõi nhiều bộ điều khiển và xử lý việc ngắt kết nối một cách linh hoạt. Tất cả ứng dụng TV (bao gồm cả trò chơi) phải xử lý tay điều khiển một cách nhất quán. Hãy đọc bài viết Quản lý tay điều khiển TV để biết thêm thông tin về cách sử dụng tay điều khiển TV và Xử lý tay điều khiển cho trò chơi để nắm được thông tin cụ thể về cách sử dụng tay điều khiển TV cho trò chơi.

Bố cục bàn phím

Trong Android 13 (API cấp 33) trở lên, bạn có thể xác định bố cục bàn phím bằng cách sử dụng getKeyCodeForKeyLocation(). Ví dụ: trò chơi của bạn hỗ trợ chuyển động bằng các phím WASD. Tuy nhiên, tính năng này có thể không hoạt động chính xác trên bàn phím AZERTY có phím A và W ở nhiều vị trí. Bạn có thể lấy mã phím cho các phím mà bạn mong đợi tại một số vị trí nhất định:

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

Java

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

Trong ví dụ này, với bàn phím AZERTY, keyUp được đặt thành KeyEvent.KEYCODE_Z, keyLeft được đặt thành KeyEvent.KEYCODE_Q, trong khi keyDownkeyRight lần lượt được đặt thành KeyEvent.KEYCODE_SKeyEvent.KEYCODE_D. Giờ đây, bạn có thể tạo trình xử lý sự kiện chính cho các mã phím này và triển khai hành vi dự kiến.

Tệp kê khai

Có một số nội dung đặc biệt mà trò chơi nên đưa vào tệp kê khai Android.

Hiển thị trò chơi trên màn hình chính

Màn hình chính của Android TV hiển thị các trò chơi ở một hàng riêng biệt với các ứng dụng thông thường. Để trò chơi của bạn xuất hiện trong danh sách trò chơi, hãy đặt thuộc tính android:isGame thành "true" trong thẻ <application> của tệp kê khai ứng dụng. Ví dụ:

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

Khai báo tính năng hỗ trợ tay điều khiển trò chơi

Người dùng thiết bị TV có thể không dùng được hoặc không hoạt động được tay điều khiển trò chơi. Để thông báo chính xác cho người dùng rằng trò chơi của bạn hỗ trợ tay điều khiển trò chơi, bạn phải thêm mục sau vào tệp kê khai ứng dụng:

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

Lưu ý: Khi chỉ định tính năng hỗ trợ android:hardware:gamepad, đừng đặt thuộc tính android:required thành "true". Nếu bạn làm như vậy, người dùng sẽ không thể cài đặt ứng dụng của bạn trên thiết bị TV.

Để biết thêm thông tin về các mục nhập tệp kê khai, hãy xem phần Tệp kê khai ứng dụng.

Dịch vụ trò chơi của Google Play

Nếu trò chơi của bạn tích hợp dịch vụ trò chơi của Google Play, bạn nên lưu ý một số yếu tố cần cân nhắc liên quan đến thành tích, việc đăng nhập và lưu trò chơi.

Thành tích

Trò chơi của bạn phải có ít nhất 5 thành tích (có thể kiếm được). Chỉ người dùng điều khiển lối chơi từ một thiết bị đầu vào được hỗ trợ mới có thể đạt thành tích. Để biết thêm thông tin về thành tích và cách triển khai thành tích đó, hãy xem bài viết Thành tích trong Android.

Đăng nhập

Trò chơi của bạn nên tìm cách đăng nhập người dùng khi khởi chạy. Nếu người chơi từ chối đăng nhập nhiều lần liên tiếp, thì trò chơi của bạn sẽ ngừng yêu cầu. Tìm hiểu thêm về cách đăng nhập trong bài viết Triển khai tính năng đăng nhập trên Android.

Đang lưu

Sử dụng Trò chơi đã lưu trên Dịch vụ Google Play để lưu trữ nội dung trò chơi đã lưu. Trò chơi của bạn phải liên kết các nội dung lưu trò chơi với một Tài khoản Google cụ thể, để có thể xác định danh tính chính xác ngay cả trên nhiều thiết bị: Cho dù người chơi đang sử dụng điện thoại di động hay TV, thì trò chơi đó vẫn phải lấy được thông tin trò chơi đã lưu từ cùng một tài khoản người dùng.

Bạn cũng nên cung cấp tuỳ chọn trong giao diện người dùng của trò chơi để cho phép người chơi xoá dữ liệu cục bộ và dữ liệu được lưu trữ trên đám mây. Bạn có thể đưa tuỳ chọn này vào màn hình Settings của trò chơi. Để biết thông tin cụ thể về cách triển khai trò chơi đã lưu bằng Dịch vụ Play, vui lòng xem nội dung Trò chơi đã lưu trong Android.

Thoát

Cung cấp một thành phần nhất quán và rõ ràng trên giao diện người dùng để cho phép người dùng thoát khỏi trò chơi một cách dễ dàng. Bạn có thể truy cập phần tử này bằng các nút điều hướng D-pad. Hãy làm việc này thay vì dựa vào nút Màn hình chính để tạo lượt thoát, vì điều này không nhất quán hoặc không đáng tin cậy giữa các bộ điều khiển.

Web

Không bật tính năng duyệt web trong trò chơi dành cho Android TV. Android TV không hỗ trợ trình duyệt web.

Lưu ý: Bạn có thể sử dụng lớp WebView để đăng nhập vào các dịch vụ mạng xã hội.

Mạng

Các trò chơi thường cần băng thông lớn hơn để mang lại hiệu suất tối ưu và nhiều người dùng ưu tiên Ethernet hơn Wi-Fi để mang lại hiệu suất đó. Ứng dụng của bạn nên kiểm tra cả kết nối Wi-Fi và Ethernet. Nếu ứng dụng của bạn chỉ dành cho TV, bạn không cần kiểm tra dịch vụ 3G/LTE như với ứng dụng di động.