입력 지원

많은 ChromeOS 기기에 터치 스크린이 있지만, 이러한 대형 화면 기기에서 게임을 플레이할 때는 마우스, 키보드, 게임패드를 통해 최적의 상호작용 환경을 제공하는 경우가 많습니다. 모바일 게임은 터치 중심인 경우가 많으므로 터치를 사용하지 않는 사용자에게 최상의 환경을 제공하는 방법을 고려해야 합니다.

먼저 키보드, 마우스, 게임 컨트롤러 지원 추가에 관한 권장사항을 확인하세요. 사용자가 키를 누르고 있거나 여러 키를 누르고 있을 수 있는 경우에 특히 주의해야 합니다.

터치 기반 작업은 터치 스크린이 있는 Chromebook에 적합하지만, 훌륭한 경험을 제공하려면 신중한 물리적 컨트롤도 포함해야 합니다. 예를 들어 마우스 입력은 뷰를 조정하거나 조준하는 데 적합하지만 작업을 실행하는 데 필요해서는 안 됩니다. 모바일 게임에 사용자가 엄지손가락으로 버튼을 눌러 횃불, 검, 방패를 사용할 수 있는 화면 메뉴가 있는 경우 마우스로 이러한 버튼을 클릭하도록 요구하면 환경이 좋지 않습니다. 대신 onKeyUp 또는 onKeyDown를 재정의하여 각 작업을 트리거하도록 키보드 키를 지정해야 합니다. 자세한 내용과 코드는 입력 호환성 페이지를 참고하세요.

마우스 캡처

마우스 캡처를 구현하는 경우 1인칭 시점 게임은 데스크톱에서 가장 잘 표시됩니다. 이렇게 하면 마우스 포인터가 숨겨지고 사용자가 마우스를 사용하여 시점을 이동하고, 조준하고, 조종하는 등의 작업을 할 수 있습니다. 아래는 사용자가 text_clickme라는 텍스트 뷰를 클릭한 후 포인터 위치와 버튼 상태를 기록하는 기본 마우스 캡처 데모입니다. 자세한 내용은 Android 포인터 캡처 문서를 참고하세요.

class MainActivity : AppCompatActivity() {
    var mouse_x: Float = 0f
    var mouse_y: Float = 0f
    var mouse_left_pressed = false
    var mouse_center_pressed = false
    var mouse_right_pressed = false
    var mouse_scrolling = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        text_clickme.setOnClickListener {
            text_clickme.requestPointerCapture()
        }

        text_clickme.setOnCapturedPointerListener { view, motionEvent ->
            // Get the coordinates required by your app
            mouse_x = motionEvent.x
            mouse_y = motionEvent.y

            when (motionEvent.action) {
                ACTION_DOWN -> {
                    when (motionEvent.buttonState) {
                        BUTTON_PRIMARY -> mouse_left_pressed = true
                        BUTTON_SECONDARY -> mouse_right_pressed = true
                        BUTTON_TERTIARY -> mouse_center_pressed = true
                    }
                    mouse_scrolling = false
                }

                ACTION_CANCEL,
                ACTION_UP -> {
                    when (motionEvent.actionButton) {
                        BUTTON_PRIMARY -> mouse_left_pressed = false
                        BUTTON_SECONDARY -> mouse_right_pressed = false
                        BUTTON_TERTIARY -> mouse_center_pressed = false
                        0 -> {
                            mouse_left_pressed = false
                            mouse_right_pressed = false
                            mouse_center_pressed = false
                        }
                    }
                    mouse_scrolling = false
                }
                ACTION_SCROLL -> {
                    mouse_scrolling = true
                }
                else -> {
                    mouse_scrolling = false
                }
            }

            // Indicate event was consumed
            true
        }
    }

    // Release pointer capture when escape pressed
    override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KEYCODE_ESCAPE) {
            text_clickme.releasePointerCapture()
            return true;
        }
        return super.onKeyUp(keyCode, event)
    }
}

채팅

채팅 기능은 멀티플레이어 게임에서 중요한 구성요소가 될 수 있습니다. 사용자가 게임을 플레이하는 동안 게임의 채팅 기능과 어떻게 상호작용할지 생각해 보세요. 특히 키보드로 플레이하는 경우 채팅에 액세스하거나 메시지를 보내기 위해 마우스나 터치 스크린을 사용하지 않아도 됩니다.

한 가지 패턴은 키보드 키가 채팅 상자에 포커스를 두고 Enter 키를 처리하여 메시지를 보내는 것입니다.

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
  return when(keyCode) {
    KeyEvent.KEYCODE_C -> {
      edittext_chatbox.requestFocus()
      true
    }
    KeyEvent.KEYCODE_ENTER -> {
      submitChatMessage()
      true
    }
    else -> super.onKeyUp(keyCode, event)
  }
}

Android 입력 호환성 페이지의 키보드 문서를 확인하세요.

스타일러스 지원

그림 앱과 스와이프 기반 게임은 ChromeOS 기기에서 스타일러스 입력을 활용할 수 있습니다. 자세한 내용은 스타일러스 입력 페이지를 참고하세요.

게임 컨트롤러

Chromebook은 최대 4개의 게임 컨트롤러를 지원합니다. 개발자는 표준 Android 게임 컨트롤러 API를 사용하여 게임 컨트롤러를 지원해야 합니다.

버튼은 일반 매핑에 따라 일반 값에 매핑됩니다. 안타깝게도 모든 게임 컨트롤러 제조업체가 동일한 매핑 규칙을 따르는 것은 아닙니다. 사용자가 널리 사용되는 다양한 컨트롤러 매핑을 선택하도록 허용하면 훨씬 더 나은 환경을 제공할 수 있습니다.