پشتیبانی از ورودی

در حالی که بسیاری از دستگاه‌های ChromeOS دارای صفحه نمایش لمسی هستند، برای بازی‌ها بهترین تجربه تعاملی در این دستگاه‌های صفحه نمایش بزرگ اغلب از طریق ماوس، صفحه کلید و دسته بازی ارائه می‌شود. دنیای بازی‌های موبایل اغلب لمسی است و باید در مورد چگونگی ارائه بهترین تجربه برای کاربرانی که از صفحه نمایش لمسی استفاده نمی‌کنند، فکر شود.

با بررسی بهترین شیوه‌ها برای افزودن پشتیبانی از صفحه‌کلید، ماوس و دسته‌های بازی شروع کنید. شما باید به مواردی که کاربران کلیدهایی را نگه داشته‌اند یا ممکن است چندین کلید را فشار دهند، توجه ویژه‌ای داشته باشید.

اقدامات لمسی برای کروم‌بوک‌های دارای صفحه لمسی مناسب هستند، اما برای یک تجربه عالی، گنجاندن کنترل‌های فیزیکی متفکرانه نیز مهم است. به عنوان مثال، ورودی ماوس برای تنظیم دید یا هدف‌گیری عالی است، اما نباید برای انجام اقدامات لازم باشد - اگر یک بازی موبایل دارای منوی روی صفحه باشد که به کاربر اجازه می‌دهد با فشار دادن یک دکمه با انگشت شست خود از مشعل، شمشیر یا سپر استفاده کند، الزام آنها به کلیک بر روی این دکمه‌ها با ماوس، تجربه ضعیفی را ارائه می‌دهد. در عوض، کلیدهای صفحه کلید باید با لغو onKeyUp یا onKeyDown برای شروع هر اقدام تعیین شوند. برای جزئیات و کد، به صفحه سازگاری ورودی مراجعه کنید.

گرفتن موش

بازی‌های زاویه دید اول شخص وقتی روی دسکتاپ بهترین ظاهر را دارند که قابلیت گرفتن ماوس را داشته باشند. این قابلیت، نشانگر ماوس را پنهان می‌کند و به کاربر اجازه می‌دهد با استفاده از ماوس، زاویه دید را حرکت دهد، هدف‌گیری کند، هدایت کند و غیره. در زیر یک دموی ساده از گرفتن ماوس وجود دارد که موقعیت نشانگر و حالت دکمه را پس از کلیک کاربر روی یک نمای متنی به نام text_clickme ثبت می‌کند. برای اطلاعات بیشتر به مستندات گرفتن نشانگر در اندروید مراجعه کنید.

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

چت

ویژگی‌های چت می‌توانند بخش مهمی از بازی‌های چند نفره باشند. زمانی را برای فکر کردن به این موضوع اختصاص دهید که کاربران هنگام بازی چگونه با ویژگی چت بازی شما تعامل خواهند داشت. به طور خاص، اگر آنها با صفحه کلید بازی می‌کنند، نباید مجبور باشند از ماوس یا صفحه لمسی برای دسترسی به چت یا ارسال پیام استفاده کنند.

یک الگو می‌تواند این باشد که یک کلید صفحه‌کلید، کادر چت را فوکوس کند و کلید اینتر را برای ارسال پیام‌ها مدیریت کند.

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

مستندات صفحه کلید را در صفحه سازگاری ورودی اندروید بررسی کنید.

پشتیبانی از قلم استایلوس

برنامه‌های طراحی و بازی‌های مبتنی بر کشیدن انگشت می‌توانند از ورودی قلم در دستگاه‌های ChromeOS بهره ببرند. برای جزئیات بیشتر به صفحه ورودی قلم مراجعه کنید.

کنترل‌کننده‌های بازی

کروم‌بوک‌ها تا چهار دسته بازی را پشتیبانی می‌کنند. توسعه‌دهندگان باید از APIهای استاندارد دسته‌های بازی اندروید برای پشتیبانی از آنها استفاده کنند.

دکمه‌ها با پیروی از یک نگاشت مشترک ، به مقادیر مشترک نگاشت می‌شوند. متأسفانه، همه تولیدکنندگان دسته‌های بازی از قراردادهای نگاشت یکسانی پیروی نمی‌کنند. اجازه دادن به کاربران برای انتخاب از میان نگاشت‌های مختلف دسته‌های بازی می‌تواند تجربه بسیار بهتری را فراهم کند.