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

Màn hình TV có một số điểm cần cân nhắc mà có thể là mới đối với nhà phát triển trò chơi di động. Những điểm này bao gồm kích thước lớn, sơ đồ điều khiển và việc tất cả người chơi đều xem cùng lúc.

Màn hình

Có 2 đ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ợ chế độ hiển thị ngang

TV luôn ở chế độ ngang: Bạn không thể xoay TV và không có chế độ dọc. Luôn thiết kế sao cho trò chơi dành cho TV hiển thị ở chế độ ngang.

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

Một số màn hình có thể thực hiện quá trình xử lý đồ hoạ sau. 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 giảm độ trễ (ALLM). Chế độ này giảm thiểu độ trễ bằng cách tắt tính năng xử lý hậu kỳ. Để biết thêm thông tin chi tiết về ALLM, hãy tham khảo quy cách HDMI 2.1. Các màn hình khác có thể hỗ trợ chế độ trò chơi với hành vi tương tự.

Trong Android 11 trở lên, một cửa sổ có thể yêu cầu sử dụng chế độ tự động độ 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ỳ tối thiểu. Điều 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ó được đồ hoạ tốt nhất có thể.

Để bật hoặc tắt chế độ 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ợ quy trình xử lý hậu kỳ tối thiểu; để biết một màn hình cụ thể có hỗ trợ quy trình 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, việc thiết kế các chế độ điều khiển sao cho phù hợp và đảm bảo người chơi thấy chúng trực quan và thú vị khi sử dụng là điều quan trọng hơn bao giờ hết. Việc xử lý các 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ý các trường hợp ngắt kết nối một cách thích hợp. Tất cả ứng dụng truyền hình (kể cả trò chơi) đều phải xử lý nhất quán các bộ điều khiể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à bài viết Xử lý tay điều khiển cho trò chơi để biết 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 getKeyCodeForKeyLocation(). Ví dụ: trò chơi của bạn hỗ trợ di chuyển bằng các phím WASD, nhưng điều này có thể không hoạt động chính xác trên bàn phím AZERTY có các phím A và W ở các vị trí khác nhau. Bạn có thể lấy mã khoá cho các khoá mà bạn mong đợ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, còn keyDownkeyRight được đặt thành KeyEvent.KEYCODE_SKeyEvent.KEYCODE_D tương ứng. 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ố điều đặ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 thấy bộ điều khiển trò chơi. Để thông báo cho người dùng một cách thích hợp 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 chế độ 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 các thiết bị TV.

Để biết thêm thông tin về các mục trong tệp kê khai, hãy xem bài viết 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ố điểm cần cân nhắc liên quan đến thành tích, đă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ể đạt được). Chỉ người dùng điều khiển lối chơi bằng một thiết bị đầu vào được hỗ trợ mới có thể kiếm được 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 cố gắng đă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, trò chơi của bạn sẽ ngừng yêu cầu. Tìm hiểu thêm về quy trình đăng nhập tại phần Triển khai quy trình đăng nhập trên Android.

Đang lưu

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

Bạn cũng nên cung cấp một lựa 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 lưu trữ cục bộ và trên đám mây. Bạn có thể đặt lựa chọn này trong 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, hãy xem phần Trò chơi đã lưu trên Android.

Thoát

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

Web

Không bật tính năng duyệt web trong trò chơi 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

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 thích dùng Ethernet hơn là Wi-Fi để có được hiệu suất đó. Ứng dụng của bạn phải 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ư đối với ứng dụng di động.