تطوير ألعاب تناسب جميع الشاشات

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

تشمل الاختلافات المحدَّدة في تجربة اللاعب ما يلي:

  • أشكال الأجهزة: على الرغم من أن الهواتف توفر نظام Android التقليدي من تجربة الجهاز، من الممكن التفاعل مع الألعاب على أشكال الأجهزة الأخرى. يمكن لأجهزة ChromeOS تشغيل حاوية Android تعرض لعبتك. الأجهزة اللوحية التي يمكنها تشغيل Android وتتوافق مع عدّة مستويات مختلفة من الدقّة تلفزيون Android توفّر الأجهزة تجارب غنية بالتفاصيل وأكثر شمولية. يمكن للّاعبين محاكاة بيئة متعددة النوافذ باستخدام أداة إضافة العرض. وعندما باستخدام الهواتف القابلة للطي، يمكن للّاعبين تغيير حجم الشاشة أثناء اللعب جلسة المراجعة.
  • طرق التفاعل: يمكن للّاعبين تقديم الإدخال من خلال لمس شاشة الجهاز الشاشة، ولكن يمكنها أيضًا استخدام الماوس أو لوحة اللمس أو لوحة المفاتيح أو وحدة التحكم بدلاً من ذلك. بالإضافة إلى ذلك، إنّ توفُّر أدوات إضافات الإعلانات الصورية والأجهزة القابلة للطي على أجهزة تتيح للّاعبين تجربة لعبتك على شاشة أكبر، ما يزيد من طول اللعبة. وتقديم جلسات أسلوب لعب وواجهات أكثر تعقيدًا أكثر جدوى.
  • دعم الأجهزة: لا تتوفّر في بعض الأجهزة التي تعمل بنظام التشغيل Android معدّات أكثر شيوعًا في أي جهاز محمول باليد، مثل الكاميرا الخلفية ونظام تحديد المواقع العالمي (GPS) اتصال الشبكة. يجب أن تتوافق لعبتك مع الأجهزة المتاحة. والتعامل بسلاسة مع المواقف التي لا تتوفر فيها بعض الميزات.

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

أفضل الممارسات المتعلّقة بتصميم الألعاب

عند التخطيط لتصميم لعبتك وبنيتها، اتّبِع أفضل الممارسات. الموضحة في الأقسام التالية.

الاستجابة لتغييرات الإعدادات يدويًا

عندما يرصد نظام Android تغييرًا في التهيئة، مثل تغيير في حجم الشاشة أو اتجاه الشاشة أو أسلوب الإدخال، تتم إعادة تشغيل النظام افتراضيًا النشاط الحالي. للحفاظ على الحالة داخل تطبيق أو لعبة، يجب إجراء المكالمات التلقائية onSaveInstanceState() قبل إعادة تشغيله onRestoreInstanceState() بعد إعادة تشغيله. ومع ذلك، تتطلب هذه العملية من النشاط إعادة تحميل جميع والخدمات والموارد ذات الصلة. لمزيد من المعلومات حول هذا السلوك التلقائي الاطّلاع على دليل إعدادات التعامل مع الجهاز التغييرات.

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

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

إنشاء بنية مرنة

لإتاحة لعبتك على أكبر عدد ممكن من الأجهزة، يُرجى اتّباع أفضل الممارسات التالية: الممارسات:

  • نشر مجموعات حزمات تطبيق Android بدلاً من حِزم APK الفردية تطبيق Android الحزم: تسمح لك هذه الحزم بحزم عناصر مختلفة الداخلية والنماذج الهندسية المختلفة، مثل x86 وARM، في وحدة قطعة أثرية. والأفضل من ذلك أنّ مجموعات حزمات تطبيق Android تتيح حدودًا أعلى لحجم تطبيقاتك. لعبة يمكن أن يصل حجم كل حِزمة APK أساسية إلى 150 ميغابايت، ويمكن أن يصل حجم الحزمة نفسها غيغابايت.
  • إتاحة استخدام بُنى x86 تعمل هذه الخطوة على تحسين أداء لعبتك الأداء على الأجهزة التي لا تتوافق مع معالجات ARM، وذلك لأنّ هذه الأجهزة تتيح الآن وتنفيذ التعليمات دون الحاجة إلى ترجمتها أولاً.

إضافة دعم Vulkan

من خلال دعم Vulkan، ستتمكّن لعبتك من تحقيق نتائج أفضل. أداء الرسومات. تدعم معظم الأجهزة واجهة برمجة تطبيقات الرسومات هذه.

إنشاء معالِجات تغيير الإعدادات المخصّصة

للإشارة إلى أنواع تغييرات الإعدادات التي تعالجها لعبتك بنفسها، أضِف android:configChanges إلى كل عنصر <activity> في البيان الذي يمثّل شاشة أو واجهة معقدة.

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

<activity ...
    android:configChanges="screenSize|orientation|keyboard|keyboardHidden">
</activity>

وعند حدوث تغييرات التهيئة المعلَن عنها، يستدعي النظام الآن طريقة مختلفة، onConfigurationChanged() من خلال هذه الطريقة، يمكنك إضافة منطق لتعديل واجهة المستخدم الخاصة باللعبة:

التعامل مع تغييرات إعدادات الشاشة

تعالج لعبتك تغييرات حجم الشاشة واتجاهها يدويًا عندما يمكنك تضمين القيمتَين screenSize وorientation على التوالي في android:configChanges . يمكنك استخدام هذه القيم الجديدة لتعديل محتوى المشهد مناطق إدخال اللاعبين. للحصول على إرشادات حول كيفية تصميم تخطيط لعبتك أسهل في التحديث، اطّلِع على الدليل حول دعم الشاشات المختلفة أحجام.

أثناء تنفيذ onConfigurationChanged() في لعبتك، استخدِم القيمة التي تم تمريرها. الكائن Configuration والعنصر كائن Display لمدير النوافذ إلى تحديد القيم المحدثة لحجم الشاشة واتجاه الشاشة، على التوالي.

يعرض مقتطف الرمز التالي كيفية الحصول على حجم شاشة جديد في لعبتك. واتجاه:

Kotlin

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    val density: Float = resources.displayMetrics.density
    val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt()
    val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt()

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    val newScreenOrientation: Int = newConfig.orientation

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    val newScreenRotation: Int = windowManager.defaultDisplay.rotation
}

Java

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    float density = getResources().getDisplayMetrics().density;
    int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
    int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    int newScreenOrientation = newConfig.orientation;

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    int newScreenRotation = getWindowManager().getDefaultDisplay()
            .getRotation();
}

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

جودة الشاشة الخاصة باللعبة

توضِّح الأقسام التالية طريقة ضبط كيفية تفاعل لعبتك مع الشاشة. يتغيّر الحجم أو اتجاه الشاشة حسب ميزات اللعبة:

وضع ملء الشاشة

على بعض الأنظمة الأساسية، مثل ChromeOS، يمكن فتح تطبيقات وألعاب Android في إطارات ويمكن تغيير حجمه افتراضيًا. إذا كان يجب تشغيل لعبتك دائمًا في وضع ملء الشاشة، ضبط android:resizeableActivity إلى false في أحد عناصر <activity>، كما هو موضح في مقتطف الرمز التالي:

<activity ...
    android:resizeableActivity="false">
</activity>

يمكنك أيضًا ضبط سمة android:resizeableActivity على false لمنع حدوث تغييرات التهيئة المستندة إلى الحجم. يجب إضافة هذه السمة كحل مؤقت فقط، ما لم يتم تشغيل لعبتك دائمًا في وضع ملء الشاشة. لأغراض الاختبار.

اتجاه الشاشة

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

<activity ...
    android:screenOrientation="landscape">
</activity>

جودة الشاشة الخاصة بالجهاز

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

نسبة العرض إلى الارتفاع

تتوافق بعض الأجهزة مع نِسب عرض إلى ارتفاع مختلفة. على سبيل المثال، الأجهزة القابلة للطي هي مصمم ليتوافق مع نسبة العرض إلى الارتفاع 21:9 عند طيه. لمعالجة هذا التنوع المحتمل في نسبة العرض إلى الارتفاع، يجب تنفيذ أحد الإجراءات التالية على الأقل:

  • استهداف الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث:
  • إمكانية تغيير حجم مشهد وواجهة لعبتك ضبط android:resizeableActivity true على الأجهزة التي تعمل بنظام التشغيل Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) والإصدارات الأحدث.
  • توضيح الحد الأقصى المسموح به لنسبة العرض إلى الارتفاع: في تم ربط السمة <meta-data>. مع لعبتك، اضبط android.max_aspect على 2.4، كما هو موضَّح في ما يلي مقتطف الرمز مع ذلك، ضع في اعتبارك أن نِسب العرض إلى الارتفاع أكبر من تلك الذي حددته وراء ظهور اللعبة مُعدَّل للعرض على شاشة عريضة أفقيًا داخل الشاشة.

    <application>
    <meta-data android:name="android.max_aspect"
               android:value="2.4" />
    </application>
    

أنشطة متعددة مرئية في الوقت نفسه

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

على الأجهزة التي تعمل بنظام التشغيل Android 9 (المستوى 28 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، يمكن لجميع أعضاء الأنشطة المرئية التي سيتم استئنافها في نفس الوقت. لكي يكون هذا السلوك على جهازك والمصنّع الأصلي للجهاز أن يوافق على الأخرى. يمكنك إضافة دعم داخل لعبتك من خلال ضبط android.allow_multiple_resumed_activities إلى true في بيان اللعبة كما هو موضح في المقتطف التالي:

<application>
    <meta-data android:name="android.allow_multiple_resumed_activities"
               android:value="true" />
</application>

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

لمزيد من المعلومات حول إعداد لعبتك لتظهر كجزء من نافذة متعددة، يُرجى الاطّلاع على الدليل حول طريقة إضافة النوافذ المتعددة والدعم

التعامل مع الأنواع المختلفة من نماذج التفاعل

تتعامل لعبتك يدويًا مع ميزة ظهور لوحة المفاتيح ومدى توفّرها على لوحة المفاتيح متى شئت. يمكنك تضمين القيمتَين keyboard وkeyboardHidden على التوالي في android:configChanges . يمكنك استخدام هذه القيم الجديدة لتعديل الإدخال الأساسي للعبتك. .

عند إعداد لعبتك لإتاحة أنواع متعددة من البيانات التي يُدخلها المستخدمون، يجب مع وضع ما يلي في الاعتبار:

  • رصد طرق الإدخال بدلاً من الأجهزة الفردية طريقة التفكير هذه تجعل من السهل تحسين تجربة اللاعب دون التركيز كثيرًا على الجهاز المحدد الذي قد يمتلكه اللاعب.
  • أدرِج السمة keyboardHidden في قائمة المنتجات التي تمّت معالجتها يدويًا. تغييرات الإعدادات وبهذه الطريقة، يمكن للعبتك تتبع الوقت الذي تستغرقه لوحة المفاتيح توصيل الجهاز فعليًا ولكن غير قابل للاستخدام.
  • حدِّد طرق الإدخال المتاحة حاليًا. لإجراء ذلك، اتصل getInputDeviceIds() عند بدء تشغيل اللعبة وبعد كل تغيير في الإعدادات.

    يمكنك غالبًا تحديد كيف يخطط اللاعب للتفاعل مع لعبتك بناءً على جهاز الإدخال المفضّل:

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

توفّر الفقرات التالية أفضل الممارسات لأنواع محددة من الإدخالات الأجهزة.

لوحة المفاتيح

عند إنشاء تصميم لوحة مفاتيح للعبتك، يجب مراعاة كيفية تنقل اللاعب. خلال مشهد معيّن وطريقة تفاعلهم مع إعدادات لعبتك.

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

يجب أن يتمكّن اللاعبون أيضًا من فتح قوائم لعبتك وتصفُّحها. باستخدام لوحة المفاتيح. المفتاح Esc هو تعيين مشترك لإيقاف المشهد مؤقتًا يعرض قائمة اللعبة.

لمزيد من المعلومات حول إتاحة إدخال لوحة المفاتيح في لعبتك، يُرجى الاطّلاع على الدليل حول كيفية إتاحة التنقّل باستخدام لوحة المفاتيح بالإضافة إلى الدليل حول كيفية التعامل مع لوحة المفاتيح الإجراءات.

ذراع التحكّم في الألعاب

للحصول على مزيد من المعلومات حول كيفية استخدام وحدة التحكّم في لعبتك، يمكنك الاطّلاع على الدليل. حول كيفية دعم وحدات التحكّم في الألعاب

الماوس أو لوحة اللمس

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

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك استخدام الماوس. التقاط واجهة برمجة التطبيقات للمساعدة في عملية التقاط المؤشر في الألعاب التي تتفاعل مع للإدخال عالي الدقة، يمكنك الحصول على الإحداثيات الحالية للمؤشر عن طريق استدعاء getX() getY().

للحصول على معلومات إضافية حول إمكانية إضافة دعم لإدخال الماوس وإدخال لوحة اللمس في لعبتك، راجِع دليل طريقة تتبُّع اللمس والمؤشر الحركات بالإضافة إلى الدليل حول كيفية التعامل إيماءات اللمس المتعدد.

اختبار لعبتك

قبل إطلاق لعبتك، اختبِر طريقة استجابتها لتغييرات الإعدادات من خلال إكمال الخطوات الموضحة في الأقسام التالية.

تعديل خطة الاختبار

عند التحقّق من صحة وظائف لعبتك، يجب تضمين حالات الاختبار التالية:

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

وننصحك أيضًا بتحديث نظام مراقبة الجودة في لعبتك، التحسين من أجل الحصول على مجموعة متنوعة من تجارب اللاعبين.

لمعرفة أفضل الممارسات المتعلقة باختبار لعبتك، يمكنك الاطّلاع على أساسيات دليل الاختبار

استخدام أدوات الاختبار وتصحيح الأخطاء

يمكنك إجراء الاختبارات باستخدام مجموعة متنوعة من الأدوات التي تتيحها المنصة: