توسعه بازی برای همه صفحه ها

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

تفاوت های خاص در تجربه بازیکن شامل موارد زیر است:

  • عوامل شکل دستگاه: اگرچه تلفن‌ها تجربه سنتی دستگاه اندرویدی را ارائه می‌کنند، اما امکان تعامل با بازی‌ها بر اساس عوامل دیگر وجود دارد. دستگاه‌های ChromeOS می‌توانند یک کانتینر Android را اجرا کنند که بازی شما را نمایش می‌دهد. تبلت هایی که می توانند اندروید را اجرا کنند از چندین سطح مختلف وفاداری پشتیبانی می کنند. دستگاه‌های Android TV از تجربه‌های غنی‌تر و همه‌جانبه‌تر پشتیبانی می‌کنند. بازیکنان می توانند یک محیط چند پنجره ای را با استفاده از ابزار افزونه نمایش شبیه سازی کنند. و هنگام استفاده از تاشوها، بازیکنان می توانند اندازه صفحه نمایش را در طول یک جلسه گیم پلی تغییر دهند.
  • روش‌های تعامل: بازیکنان می‌توانند با لمس صفحه‌نمایش دستگاه ورودی ارائه دهند، اما می‌توانند به جای آن از ماوس، پد لمسی، صفحه‌کلید یا کنترل‌کننده نیز استفاده کنند. علاوه بر این، در دسترس بودن ابزارهای افزودنی نمایشگر و دستگاه‌های تاشو به بازیکنان این امکان را می‌دهد تا بازی شما را روی صفحه‌ای بزرگ‌تر تجربه کنند و جلسات گیم‌پلی طولانی‌تر و رابط‌های پیچیده‌تر را امکان‌پذیرتر می‌کند.
  • پشتیبانی از سخت‌افزار: برخی از دستگاه‌های مجهز به اندروید، سخت‌افزار معمولی‌تر در دستگاه‌های دستی، مانند دوربین پشتی، GPS، و اتصال شبکه ندارند. بازی شما باید با سخت افزار موجود سازگار شود و موقعیت هایی را که در آن ویژگی های خاصی در دسترس نیستند به خوبی مدیریت کند.

این راهنما بهترین شیوه های مربوط به توسعه بازی شما را برای انواع مختلف صفحه نمایش و تعاملات کاربر ارائه می دهد. این راهنما همچنین پیشنهادهایی در مورد طراحی بازی شما و توسعه یک استراتژی تست موثر ارائه می دهد.

بهترین شیوه های طراحی بازی

هنگام برنامه ریزی طراحی و معماری بازی خود، بهترین شیوه های شرح داده شده در بخش های زیر را دنبال کنید.

به تغییرات پیکربندی به صورت دستی پاسخ دهید

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

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

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

یک معماری انعطاف پذیر ایجاد کنید

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

  • به جای فایل‌های APK مجزا، Android App Bundles را اجرا کنید. Android App Bundles به شما این امکان را می دهد که مصنوعات با وضوح های مختلف و مدل های معماری مختلف مانند x86، ARM را در یک آرتیفکت بسته بندی کنید. بهتر از آن، Android App Bundles از محدودیت‌های اندازه بالاتر برای بازی شما پشتیبانی می‌کند. هر APK پایه می تواند به اندازه 150 مگابایت باشد و حجم خود بسته می تواند چندین گیگابایت باشد.
  • پشتیبانی از معماری های x86 را اضافه کنید. این مرحله عملکرد بازی شما را در دستگاه‌هایی که از ARM پشتیبانی نمی‌کنند بهبود می‌بخشد، زیرا این دستگاه‌ها اکنون می‌توانند دستورالعمل‌ها را بدون نیاز به ترجمه ابتدا اجرا کنند.

پشتیبانی از Vulkan را اضافه کنید

با پشتیبانی از Vulkan ، بازی شما می تواند به عملکرد گرافیکی بالاتری دست یابد. اکثر دستگاه ها از این API گرافیکی پشتیبانی می کنند.

کنترل کننده های تغییر پیکربندی سفارشی را ایجاد کنید

برای اعلام انواع تغییرات پیکربندی که بازی شما به تنهایی انجام می‌دهد، ویژگی android:configChanges به هر عنصر <activity> در مانیفست خود اضافه کنید که نمایانگر یک صفحه یا رابط پیچیده است.

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

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

هنگامی که تغییرات پیکربندی اعلام شده رخ می دهد، سیستم اکنون یک متد دیگر، onConfigurationChanged() را فراخوانی می کند. در این روش، منطق را برای به روز رسانی رابط کاربری بازی خود اضافه کنید:

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

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

در اجرای onConfigurationChanged() در بازی، از شیء Configuration منتقل شده و شیء Display مدیر پنجره برای تعیین مقادیر به روز شده برای اندازه صفحه و جهت صفحه استفاده کنید.

قطعه کد زیر نحوه به دست آوردن اندازه و جهت صفحه نمایش به روز شده بازی خود را نشان می دهد:

کاتلین

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
}

جاوا

@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 در یکی از عناصر <activity> روی false تنظیم کنید:

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

همچنین می‌توانید ویژگی android:resizeableActivity روی false تنظیم کنید تا از تغییرات پیکربندی مبتنی بر اندازه جلوگیری کنید. با این حال، مگر اینکه بازی شما همیشه در حالت تمام صفحه اجرا شود، باید این ویژگی را فقط به عنوان یک اصلاح موقت برای اهداف آزمایشی اضافه کنید.

جهت صفحه نمایش

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

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

کیفیت های صفحه نمایش مخصوص دستگاه

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

نسبت ابعاد

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

  • Android 8.0 (سطح API 26) یا بالاتر را هدف قرار دهید.
  • صحنه و رابط بازی خود را قابل تغییر اندازه کنید. android:resizeableActivity در دستگاه‌های دارای Android نسخه 7.0 (سطح API 24) و بالاتر روی true تنظیم کنید.
  • حداکثر نسبت تصویر پشتیبانی شده را اعلام کنید. همانطور که در قطعه کد زیر نشان داده شده است، در یک ویژگی <meta-data> مرتبط با بازی خود، android.max_aspect روی 2.4 تنظیم کنید. با این حال، به خاطر داشته باشید که نسبت ابعاد بزرگتر از نسبتی که شما مشخص کرده‌اید، باعث می‌شود بازی به صورت جعبه نامه در یک نمایشگر ظاهر شود.

    <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 یک نقشه معمولی برای توقف یک صحنه و نمایش منوی بازی است.

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

کنترلر بازی

برای اطلاعات بیشتر در مورد کنترل ورودی کنترلر در بازی خود، به راهنمای نحوه پشتیبانی از کنترلرهای بازی مراجعه کنید .

ماوس یا تاچ پد

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

در دستگاه‌های دارای Android 8.0 (سطح API 26) و بالاتر، می‌توانید از Mouse Capture API برای کمک به فرآیند گرفتن اشاره گر استفاده کنید. در بازی هایی که به ورودی با دقت بالا واکنش نشان می دهند، می توانید مختصات فعلی اشاره گر را با فراخوانی متدهای getX() و getY() بدست آورید.

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

بازی خود را تست کنید

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

برنامه آزمون خود را به روز کنید

هنگام تأیید عملکرد بازی خود، موارد تست زیر را در نظر بگیرید:

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

همچنین، سیستم کنترل کیفیت بازی خود را به‌روزرسانی کنید تا بتوانید تجربه‌های متنوع‌تری از بازیکنان را بهینه کنید.

برای بهترین شیوه‌های مربوط به آزمایش بازی خود، به راهنمای اصول آزمایش مراجعه کنید.

از ابزارهای تست و رفع اشکال استفاده کنید

می‌توانید با استفاده از ابزارهای مختلفی که پلتفرم پشتیبانی می‌کند، آزمایش‌ها را انجام دهید: