پشتیبانی از قابلیت تغییر اندازه صفحه نمایش بزرگ

گسترش از تلفن ها به فاکتورهای مختلف صفحه نمایش بزرگ، ملاحظاتی را برای نحوه مدیریت پنجره در بازی شما معرفی می کند. در ChromeOS و بازی‌های Google Play روی رایانه شخصی ، بازی شما می‌تواند در حالت پنجره‌ای روی رابط اصلی دسک‌تاپ اجرا شود. در تبلت‌ها و تبلت‌های تاشوی جدید اندرویدی که دارای Android 12L (سطح API 32) یا بالاتر با عرض صفحه نمایش > 600dp هستند، بازی شما می‌تواند کنار هم در حالت تقسیم صفحه با برنامه‌های دیگر اجرا شود، اندازه آن تغییر کند و حتی بین قسمت داخلی و خارجی جابه‌جا شود. نمایش در دستگاه های تاشو که منجر به تغییر پیکربندی برای اندازه پنجره و در برخی دستگاه ها جهت گیری می شود.

قابلیت تغییر اندازه با بازی های یونیتی

پیکربندی اصلی صفحه نمایش بزرگ

اعلام کنید که آیا بازی شما قادر به انجام تغییر اندازه است یا خیر:

<android:resizeableActivity="true" or "false" />

اگر نمی‌توانید از قابلیت تغییر اندازه پشتیبانی کنید، مطمئن شوید که مانیفست بازی به صراحت حداقل و حداکثر نسبت‌های پشتیبانی شده را تعریف می‌کند:

<!-- Render full screen between 3:2 and 21:9 aspect ratio -->
<!-- Let the platform letterbox otherwise -->
<activity android:minAspectRatio="1.5">
<activity android:maxAspectRatio="2.33">

بازی های گوگل پلی در رایانه شخصی

برای بازی‌های Google Play در رایانه شخصی، پلتفرم قابلیت تغییر اندازه پنجره را در عین رعایت نسبت ابعاد مشخص شده کنترل می‌کند. اندازه پنجره به طور خودکار به ابعاد بهینه قفل می شود. اگر جهت گیری اصلی شما افقی است، باید حداقل نسبت تصویر 16:9 و اگر حالت بازی شما حالت عمودی است، از نسبت تصویر 9:16 پشتیبانی کنید. برای بهترین تجربه، صریحاً از نسبت‌های 21:9، 16:10 و 3:2 برای یک بازی منظره پشتیبانی کنید. در اینجا نیازی به تغییر اندازه پنجره نیست، اما برای سازگاری با سایر فاکتورهای فرم هنوز هم خوب است.

برای اطلاعات بیشتر و بهترین شیوه‌ها، به پیکربندی گرافیک برای بازی‌های Google Play در رایانه شخصی مراجعه کنید.

نمایشگرهای بزرگ ChromeOS و Android

برای به حداکثر رساندن منطقه قابل مشاهده برای بازی خود در تمام صفحه در ChromeOS و دستگاه‌های Android با صفحه بزرگ، از حالت غوطه‌وری تمام صفحه پشتیبانی کنید و با تنظیم پرچم‌ها در decorView ، قابلیت مشاهده رابط کاربری سیستم یا از طریق WindowInsetsCompat API، نوارهای سیستم را پنهان کنید. همچنین می‌خواهید رویدادهای پیکربندی چرخش و تغییر اندازه را به خوبی مدیریت کنید یا از وقوع آنها در دستگاه‌های ChromeOS جلوگیری کنید.

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

شکل 1. گفتگوی سازگاری پیکربندی.

در برخی از دستگاه‌ها، زمانی که بازیکنی به پیکربندی پشتیبانی‌نشده منتقل می‌شود، ممکن است گزینه‌ای از او خواسته شود که بازی را مجدداً بارگیری کند و فعالیت را برای بهترین تناسب با طرح‌بندی پنجره جدید ایجاد کند، که تجربه بازی را مختل می‌کند. بازی خود را در پیکربندی های مختلف حالت چند پنجره ای (اندازه پنجره 2/3، 1/2، 1/3) آزمایش کنید و مطمئن شوید که هیچ گیم پلی یا عناصر UI قطع یا غیرقابل دسترس نیستند. به‌علاوه، هنگام حرکت بین صفحه‌نمایش داخلی و خارجی در دستگاه‌های تاشو، آزمایش کنید که چگونه بازی شما به تداوم تاشو پاسخ می‌دهد. اگر مشکلی مشاهده کردید، به صراحت این رویدادهای پیکربندی را مدیریت کنید و پشتیبانی پیشرفته از قابلیت تغییر اندازه صفحه نمایش بزرگ را اضافه کنید.

قابلیت تغییر اندازه صفحه نمایش بزرگ پیشرفته

شکل 2. رابط های کاربری مختلف روی دسکتاپ و تاشو در حالت میز.

برای خارج شدن از حالت سازگاری و اجتناب از فعالیت تفریحی، موارد زیر را انجام دهید:

  1. فعالیت اصلی خود را قابل تغییر اندازه اعلام کنید:

    <android:resizeableActivity="true" />
    
  2. پشتیبانی صریح از "orientation"، "screenSize"، "smallestScreenSize"، "screenLayout" و "density" در android:configChanges ویژگی عنصر <activity> مانیفست بازی خود را برای دریافت همه رویدادهای پیکربندی صفحه نمایش بزرگ اعلام کنید:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. onConfigurationChanged() را نادیده بگیرید و رویداد پیکربندی شامل جهت فعلی، اندازه پنجره، عرض و ارتفاع را مدیریت کنید:

    کاتلین

    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()
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       val newScreenOrientation: Int = newConfig.orientation
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       val newScreenRotation: Int =
    windowManager.defaultDisplay.rotation
    }
    

    جاوا

    @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);
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       int newScreenOrientation = newConfig.orientation;
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       int newScreenRotation = getWindowManager().getDefaultDisplay()
               .getRotation();
    }
    

همچنین می توانید برای بررسی چرخش دستگاه فعلی از WindowManager پرس و جو کنید. با استفاده از این ابرداده، ابعاد پنجره جدید را بررسی کرده و به اندازه کامل پنجره ارائه دهید. این ممکن است در همه موارد به دلیل تفاوت نسبت ابعاد کار نکند، بنابراین، در عوض، رابط کاربری بازی خود را به اندازه پنجره جدید و محتویات اصلی گیم پلی جعبه نامه خود متصل کنید. اگر محدودیت‌های فنی یا طراحی وجود دارد که مانع از هر یک از این روش‌ها می‌شود، برای حفظ نسبت ابعاد خود، جعبه نامه درون موتور خود را انجام دهید و در حالی که resizeableActivity = false اعلام کنید و از حالت پیکربندی اجتناب کنید، به بهترین ابعاد ممکن مقیاس دهید.

صرف نظر از رویکردی که در پیش گرفته اید، بازی خود را در پیکربندی های مختلف (تا و باز کردن، تغییرات چرخش مختلف، حالت تقسیم صفحه) آزمایش کنید و مطمئن شوید که عناصر رابط کاربری داخلی بازی بریده یا همپوشانی ندارند، مشکل دسترسی به هدف لمسی، یا مشکلات نسبت ابعادی که باعث کشیده شدن، له شدن یا تغییر شکل بازی می شود.

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

حالت چند پنجره ای

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

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

هیچ تضمینی وجود ندارد که برنامه زمانی که در حالت چند پنجره ای قرار می گیرد فوکوس خود را به دست آورد. بنابراین، اگر از هر یک از رویدادهای وضعیت برنامه برای توقف بازی خود استفاده می‌کنید، برای ازسرگیری بازی به رویداد تمرکز ( onWindowFocusChanged() با مقدار فوکوس درست) اعتماد نکنید. در عوض، از سایر کنترل‌کننده‌های رویداد یا کنترل‌کننده‌های تغییر حالت مانند onConfigurationChanged() یا onResume() استفاده کنید. توجه داشته باشید که همیشه می‌توانید از متد isInMultiWindowMode() برای تشخیص اینکه آیا فعالیت فعلی در حالت چند پنجره‌ای اجرا می‌شود استفاده کنید.

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

گزینه اول با استفاده از ویژگی های خاص در تگ <layout> در مانیفست اندروید شما کار می کند. ویژگی های defaultHeight و defaultWidth ابعاد اولیه را کنترل می کنند. همچنین مراقب ویژگی‌های minHeight و minWidth باشید تا بازیکنان خود را از تغییر اندازه پنجره بازی به ابعادی که پشتیبانی نمی‌کنید جلوگیری کنید. در نهایت، ویژگی gravity وجود دارد که تعیین می‌کند هنگام راه‌اندازی پنجره در کجای صفحه ظاهر شود. در اینجا یک نمونه تگ طرح بندی با استفاده از این ویژگی ها آورده شده است:

<layout android:defaultHeight="500dp"
        android:defaultWidth="600dp"
        android:gravity="top|end"
        android:minHeight="450dp"
        android:minWidth="300dp" />

گزینه دوم برای تنظیم اندازه پنجره با استفاده از مرزهای راه اندازی پویا کار می کند. با استفاده از setLaunchBounds(Rect)⁠⁠ می توانید ابعاد پنجره شروع را تعریف کنید. اگر یک مستطیل خالی مشخص شده باشد، فعالیت در حالت حداکثر شروع می شود.

علاوه بر این، اگر از موتورهای بازی Unity یا Unreal استفاده می کنید، مطمئن شوید که از نسخه اخیر (Unity 2019.4.40 و Unreal 5.3 یا جدیدتر) استفاده می کنید که پشتیبانی خوبی از حالت چند پنجره ای ارائه می دهد.

پشتیبانی از وضعیت تاشو

از کتابخانه طرح‌بندی Jetpack WindowManager برای پشتیبانی از وضعیت‌های تاشو، مانند رومیزی، برای افزایش غوطه‌وری و تعامل بازیکن استفاده کنید:

شکل 3. بازی در وضعیت میز با نمای اصلی در قسمت عمودی نمایشگر، کنترل ها در قسمت افقی.

کاتلین

fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean {
    contract { returns(true) implies (foldFeature != null) }
    return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
            foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
}

جاوا

boolean isTableTopPosture(FoldingFeature foldFeature) {
    return (foldFeature != null) &&
           (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) &&
           (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL);
}