دعم الإدخال

على الرغم من أنّ العديد من أجهزة ChromeOS تتضمّن شاشات تعمل باللمس، فإنّ أفضل تجربة تفاعلية مع الألعاب على هذه الأجهزة ذات الشاشات الكبيرة تكون غالبًا من خلال الماوس ولوحة المفاتيح وجهاز التحكّم في الألعاب. غالبًا ما يركّز عالم ألعاب الفيديو على الأجهزة الجوّالة على اللمس، ويجب التفكير في كيفية تقديم أفضل تجربة للمستخدمين الذين لا يستخدمون اللمس.

ابدأ بالاطّلاع على أفضل الممارسات لإضافة إمكانية استخدام لوحات المفاتيح والماوس وأجهزة التحكّم في الألعاب. عليك الانتباه بشكل خاص إلى الحالات التي يضغط فيها المستخدمون على المفاتيح باستمرار أو قد يضغطون على مفاتيح متعددة.

تكون الإجراءات المستندة إلى اللمس مناسبة لأجهزة Chromebook المزودة بشاشات تعمل باللمس، ولكن من المهم أيضًا تضمين عناصر تحكّم مادية مدروسة لتوفير تجربة رائعة. على سبيل المثال، يكون إدخال الماوس مناسبًا لضبط العرض أو التصويب، ولكن لا يجب أن يكون مطلوبًا لتنفيذ الإجراءات. فإذا كانت إحدى ألعاب الأجهزة الجوّالة تتضمّن قائمة على الشاشة تتيح للمستخدم استخدام مصباح أو سيف أو درع من خلال الضغط على زر بإبهامه، فإنّ مطالبته بالنقر على هذه الأزرار باستخدام الماوس سيؤدي إلى تقديم تجربة سيئة. بدلاً من ذلك، يجب تخصيص مفاتيح لوحة المفاتيح لتشغيل كل إجراء من خلال إلغاء onKeyUp أو onKeyDown. اطّلِع على صفحة توافق الإدخال للحصول على التفاصيل والرمز.

التقاط الماوس

تظهر ألعاب منظور الشخص الأول بأفضل شكل على الكمبيوتر المكتبي عند تفعيل ميزة "التقاط مؤشر الماوس". يؤدي هذا الخيار إلى إخفاء مؤشر الماوس والسماح للمستخدم بتحريك نقطة العرض والتصويب والتوجيه وغير ذلك باستخدام الماوس. في ما يلي عرض توضيحي أساسي لتسجيل حركة مؤشر الماوس يسجّل موضع المؤشر وحالات الأزرار بعد أن ينقر المستخدم على عرض نصي باسم 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 مع ما يصل إلى أربع وحدات تحكّم في الألعاب. على المطوّرين استخدام واجهات برمجة التطبيقات الخاصة بأذرع التحكّم في الألعاب العادية على Android لتوفير الدعم لها.

يتم ربط الأزرار بالقيم الشائعة باتّباع عملية ربط شائعة. لسوء الحظ، لا يلتزم جميع مصنّعي وحدات التحكّم في الألعاب باتّفاقيات الربط نفسها. يمكن أن يؤدي السماح للمستخدمين بالاختيار من بين عمليات ربط مختلفة وشائعة لأزرار وحدات التحكّم إلى توفير تجربة أفضل بكثير.