פיתוח משחקים לכל המסכים

כשמפתחים משחק ל-Android, חשוב לצפות מראש את מגוון לחוויות של שחקן מסוים ולהישאר מותאמים בזמן אמת וצורכי אינטראקציה. תמיכה בחוויות שונות של שחקנים עוזרת להגדיל גמישות בגיימפליי, שעוזרת לכם להרחיב את פוטנציאל החשיפה של המשחק.

הבדלים ספציפיים בחוויית הנגן כוללים:

  • גורמי צורה של המכשיר: אף על פי שטלפונים מספקים את הגרסה מסורתית של Android במכשיר, ניתן לקיים אינטראקציה עם משחקים בגורמי צורה אחרים. במכשירי ChromeOS אפשר להפעיל קונטיינר Android שמציג את המשחק. טאבלטים שיכול להפעיל ב-Android תמיכה בכמה רמות דיוק שונות. Android TV. מכשירים תומכים בחוויות עשירות בפרטים ובחוויות סוחפות יותר. השחקנים יכולים לדמות סביבה מרובת חלונות באמצעות כלי לתוסף תצוגה. ומתי באמצעות מכשירים מתקפלים, השחקנים יכולים לשנות את גודל המסך במהלך משחק סשן.
  • שיטות אינטראקציה: השחקנים יכולים לספק קלט על ידי נגיעה במסך במסך, אבל הם יכולים להשתמש גם בעכבר, בלוח מגע, במקלדת או בבקר. במקום זאת. בנוסף, הזמינות של כלים לתוסף לרשת המדיה ומוצרים מתקפלים מכשירים שמאפשרים לשחקנים לחוות את המשחק על מסך גדול יותר סשנים של גיימפליי וממשקים מורכבים יותר.
  • תמיכה בחומרה: לחלק מהמכשירים מבוססי Android אין חומרה נפוצים יותר במכשירים ניידים, כמו מצלמה אחורית, GPS קישוריות רשת. המשחק צריך להתאים לחומרה הזמינה ולטפל באלגנטיות במצבים שבהם תכונות מסוימות לא זמינות.

במדריך הזה מוצגות שיטות מומלצות שקשורות לפיתוח המשחק עבור סוגי המסכים ואינטראקציות המשתמשים. המדריך הזה כולל גם הצעות בנושאים הבאים הם עיצוב המשחק ופיתוח אסטרטגיית בדיקות יעילה.

שיטות מומלצות לעיצוב משחקים

כשמתכננים את העיצוב והארכיטקטורה של המשחק, צריך לפעול לפי השיטות המומלצות שמתוארים בסעיפים הבאים.

תגובה ידנית לשינויים בהגדרות

כשמערכת Android מזהה שינוי בתצורה, כמו שינוי גודל המסך, כיוון המסך או שיטת הקלט, המערכת תופעל מחדש כברירת מחדל בפעילות הנוכחית. כדי לשמר את המצב בתוך אפליקציה או משחק, הפעילות עד שיחות ברירת מחדל onSaveInstanceState() לפני שמפעילים מחדש onRestoreInstanceState() לאחר ההפעלה מחדש. עם זאת, התהליך הזה דורש שהפעילות תטען מחדש את כל השירותים והמשאבים שמשויכים אליהם. כדי לקרוא מידע נוסף על התנהגות ברירת המחדל הזו, עיינו במדריך להגדרות טיפול .

סשן גיימפליי אופייני עובר כמה שינויים בהגדרות. אם המשחק שלך מאפשרים למערכת לטפל בכל שינוי הגדרה, סצנת המשחק מושמדת ולהפעיל אותו מחדש שוב ושוב, וכך לפגוע בביצועי המשחק. לכן, אנחנו מומלץ מאוד לטפל בשינויי ההגדרות האלה בעצמכם במשחק שלך.

כדי ללמוד איך להוסיף למשחק את הלוגיקה הזו של שינוי ההגדרות, אפשר להיעזר ב קטע שמסביר איך ליצור שינוי בהגדרה מותאמת אישית רכיבי handler.

יצירת ארכיטקטורה גמישה

כדי להוסיף תמיכה במשחק בכמה שיותר מכשירים, צריך לפעול לפי ההנחיות הבאות שיטות:

  • פריסת קובצי Android App Bundle במקום חבילות APK בודדות. אפליקציה ל-Android חבילות מאפשרות לארוז אריזות של פריטי מידע שנוצרו בתהליך פיתוח (Artifact) ומודלים שונים של ארכיטקטורה כגון x86, ARM, ארטיפקט. טוב יותר, קובצי Android App Bundle תומכים במגבלות גודל גבוהות יותר משחק; הגודל של כל APK בסיסי יכול להיות עד 150MB, והחבילה עצמה יכולה להיות גדולה בגודל ג'יגה-בייט.
  • הוספת תמיכה בארכיטקטורות x86. השלב הזה משפר את הביצועים של המשחק ביצועים במכשירים שלא תומכים ב-ARM, כי המכשירים האלה יכולים עכשיו לבצע את ההוראות בלי לתרגם אותן קודם.

הוספת תמיכה ב-Vulkan

תמיכה ב-Vulkan תעזור לך להגיע לתוצאות טובות יותר של הגרפיקה. רוב המכשירים תומכים בממשק ה-API הזה של הגרפיקה.

יצירת handlers מותאמים אישית לשינוי הגדרות אישיות

כדי להצהיר על סוגי שינויי ההגדרות שהמשחק שלך מטפל בהם, מוסיפים 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 במצב מקופל. כדי לטפל ב: את המגוון הפוטנציאלי הזה ביחס הגובה-רוחב, צריך לבצע לפחות אחת מהפעולות הבאות:

  • טירגוט ל-Android מגרסה 8.0 (רמת API 26) ואילך.
  • אפשר לשנות את גודל הסצנה והממשק של המשחק. סיום android:resizeableActivity ל-true במכשירים עם Android 7.0 (רמת API 24) ומעלה.
  • להצהיר על יחס גובה-רוחב מקסימלי שנתמך. תוך שימוש משויך למאפיין <meta-data> עם המשחק שלך, צריך להגדיר את android.max_aspect ל-2.4, כמו שמוצג קטע הקוד. עם זאת, חשוב לזכור שיחסי הגובה-רוחב גדולים יותר מזה ציינתם לגרום למשחק להופיע פורמט letterbox במסך.

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

הצגת כמה פעילויות בו-זמנית

מכשירים מודרניים רבים תומכים במגוון פריסות מסך, כולל מסך מפוצל, תמונה בתוך תמונה ואזורי תצוגה גדולים. כשמשתמשים באחת מהפריסות האלה, המערכת יכולה להציג מספר פעילויות בו-זמנית.

במכשירים בגרסת Android 9 (רמת API 28) ומעלה, אפשר להשתמש בכל כדי שניתן יהיה להמשיך באותו זמן בו-זמנית. כדי שההתנהגות הזו עם זאת, גם המשחק שלך וגם ה-OEM של המכשיר צריכים להצטרף החדשה. אפשר להוסיף תמיכה במשחק באמצעות ההגדרה android.allow_multiple_resumed_activities עד true במניפסט של המשחק, כפי שמוצג בקטע הקוד הבא:

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

לאחר מכן אפשר לבדוק את המשחק במכשירים שונים כדי לראות אילו מהם מספקים תמיכת ה-OEM הנדרשת כדי שהמשך ריבוי קורות חיים יפעל כראוי.

למידע נוסף על הגדרת המשחק להופיע כחלק תצוגה עם ריבוי חלונות, ניתן לעיין במדריך להוספת ריבוי חלונות תמיכה.

טיפול בסוגים שונים של מודלים של אינטראקציה

בכל שלב, המשחק שלך מטפל בנוכחות במקלדת ובזמינות של המקלדת כוללים את הערכים keyboard ו-keyboardHidden, בהתאמה, android:configChanges . אפשר להשתמש בערכים החדשים האלה כדי לעדכן את הקלט הראשי של המשחק .

כשמגדירים את המשחק כך שיתמוך בכמה סוגים של קלט משתמשים, חשוב לשמור את חשוב לזכור:

  • צריך לזהות שיטות קלט ולא מכשירים ספציפיים. בגלל הדפוס הזה לשפר את חוויית השחקן בלי להתמקד יותר מדי במכשיר ספציפי בנגן.
  • לכלול את המאפיין keyboardHidden ברשימת הפריטים המטפלים ידנית שינויים בהגדרות האישיות. כך המשחק יכול לעקוב אחר ההפעלה של המקלדת מחובר פיזית למכשיר אבל לא ניתן לשימוש.
  • איך קובעים את שיטות הקלט שזמינות כרגע כדי לעשות את זה, צריך להתקשר getInputDeviceIds() בזמן ההפעלה של המשחק ואחרי כל שינוי בהגדרה.

    לעיתים קרובות ניתן לקבוע איך השחקן מתכנן לנהל אינטראקציה עם המשחק בהתאם למכשיר הקלט המועדף עליהם:

    • שחקנים בדרך כלל משתמשים במקלדת או בבקר משחקים כדי לבצע במהירות רצפי לחצנים.
    • נגנים בדרך כלל משתמשים במסך מגע או בלוח מגע כדי לבצע פעולות מורכבות יותר תנועות.
    • בדרך כלל, שחקנים משתמשים בעכבר כדי לבצע קלט ברמת דיוק גבוהה יותר.

בקטעים הבאים מפורטות שיטות מומלצות לסוגים ספציפיים של קלט מכשירים.

מקלדת

כשיוצרים פריסת מקלדת למשחק, חשוב להביא בחשבון את האופן שבו השחקן מנווט דרך סצנה מסוימת והאופן שבו הם יוצרים אינטראקציה עם הגדרות המשחק.

בדרך כלל, מקשי WASD ומקשי החצים הכי מתאימים לשליטה בתנועת התווים. מומלץ גם להקצות מפתח מסוים לכל פעולה או מיומנות חשובה שדמות שהשליטה בה יכולה לפעול בתוך המשחק שלכם. כדי למקסם את בחוויית המשתמש, כדאי להוסיף תמיכה בקישורי מפתחות מותאמים אישית במשחק.

לשחקנים צריכה להיות גם אפשרות לפתוח את תפריטי המשחק ולנווט בהם באמצעות המקלדת. המפתח Esc הוא מיפוי נפוץ להשהיית סצנה שמציג את תפריט המשחק.

למידע נוסף על תמיכה בקלט מקלדת במשחק שלך, כדאי לעיין במדריך להדרכה על התמיכה בניווט באמצעות המקלדת וגם המדריך לטיפול במקלדת actions (פעולות).

בקר משחקים

לקבלת מידע נוסף על טיפול בקלט של בקר במשחק, אפשר לעיין במדריך שמסבירה איך לתמוך בבקרי משחקים.

עכבר או לוח מגע

אם המשחק שלכם תומך בקלט של שחקן מעכבר או מלוח מגע, חשוב לזכור השחקנים מקיימים אינטראקציה עם המכשיר בדרכים אחרות מלבד המשחק. זו חשוב להיות מודעים לכך שבאמצעות בקשה ללכידת הסמן, כל הקלט של העכבר שמותאמים למשחק. לכן, אחרי שהמשחק מכיל את המידע שצריך, לשחרר את לכידת הסמן כדי לאפשר לשחקנים לקבל שוב שליטה רגילה בעכבר במכשיר.

במכשירים עם Android מגרסה 8.0 (רמת API 26) ואילך, אפשר להשתמש בעכבר תיעוד API שיעזור לך בתהליך לכידת הסמן. במשחקים שמגיבים ל: קלט ברמת דיוק גבוהה, אפשר לקבל את הקואורדינטות הנוכחיות של הסמן באמצעות קריאה getX() getY() אמצעי תשלום.

למידע נוסף על הוספת תמיכה בקלט עכבר ובקלט לוח מגע במשחק שלך, עיין במדריך למעקב אחר מגע וסמן של התנועות בחשבון וגם המדריך לטיפול תנועות מולטי-טאץ'.

בדיקה של המשחק

לפני הפעלת המשחק, כדאי לבדוק איך הוא מגיב לשינויי הגדרות באמצעות לבצע את השלבים המתוארים בקטעים הבאים.

עדכון של תוכנית הבדיקה

כשמאמתים את הפונקציונליות של המשחק, יש לכלול את מקרי הבדיקה הבאים:

  • מזעור והגדלת החלון שכולל את המשחק. (לא רלוונטי אם המשחק שלך מוצג תמיד במצב מסך מלא).
  • שינוי גודל המסך.
  • שינוי הכיוון של המסך. (לא רלוונטי אם במשחק שלך יש תיקון כיוון מסוים).
  • לחבר ולנתק מכשירי קלט, כמו מקלדות ועכברים.
  • אם המשחק שלכם תומך בכך, יש לבצע חזרות מרובות.

בנוסף, כדאי לעדכן את מערכת בקרת האיכות של המשחק כדי לבצע אופטימיזציה למגוון רחב יותר של חוויות שחקנים.

לשיטות מומלצות שקשורות לבדיקת המשחק, אפשר לעיין בעקרונות הבסיסיים של מדריך לבדיקה.

שימוש בכלים לבדיקה ולניפוי באגים

אפשר לבצע בדיקות באמצעות מגוון כלים שנתמכים בפלטפורמה: