Podczas tworzenia gry na Androida ważne jest, aby przewidzieć różnorodność możliwych wrażeń graczy i dostosować się do ich potrzeb w zakresie interakcji w czasie rzeczywistym. Obsługa różnych sposobów rozgrywki zwiększa elastyczność gry i pomaga Ci poszerzyć jej zasięg.
Różnice w wrażeniach graczy obejmują:
- Formaty urządzeń: telefony zapewniają tradycyjne wrażenia z korzystania z Androida, ale z grami można wchodzić w interakcje na urządzeniach o innych formatach. Urządzenia z ChromeOS mogą uruchamiać kontener Androida, w którym wyświetlana jest gra. Tablety z Androidem obsługują kilka różnych poziomów wierności. Urządzenia z Androidem TV zapewniają bardziej szczegółowe i wciągające wrażenia. Gracze mogą symulować środowisko z wieloma oknami, korzystając z narzędzia do rozszerzania wyświetlania. Podczas korzystania z urządzeń składanych gracze mogą zmieniać rozmiar ekranu w trakcie rozgrywki.
- Metody interakcji: gracze mogą wprowadzać dane, dotykając ekranu urządzenia, ale mogą też używać myszy, touchpada, klawiatury lub kontrolera. Dostępność narzędzi do rozszerzania wyświetlania i urządzeń składanych pozwala graczom korzystać z Twojej gry na większym ekranie, co umożliwia dłuższe sesje rozgrywki i bardziej złożone interfejsy.
- Obsługa sprzętu: niektóre urządzenia z Androidem nie mają sprzętu, który jest bardziej typowy dla urządzeń przenośnych, np. tylnego aparatu, GPS-u i łączności sieciowej. Gra powinna dostosowywać się do dostępnego sprzętu i prawidłowo obsługiwać sytuacje, w których niektóre funkcje są niedostępne.
W tym przewodniku znajdziesz sprawdzone metody tworzenia gier na różne rodzaje ekranów i interakcji użytkowników. Ten przewodnik zawiera też sugestie dotyczące projektowania gry i opracowywania skutecznej strategii testowania.
Sprawdzone metody projektowania gier
Podczas planowania projektu i architektury gry postępuj zgodnie ze sprawdzonymi metodami opisanymi w sekcjach poniżej.
Ręczne reagowanie na zmiany konfiguracji
Gdy system Android wykryje zmianę konfiguracji, np. zmianę rozmiaru ekranu, orientacji ekranu lub metody wprowadzania, domyślnie ponownie uruchamia bieżącą aktywność. Aby zachować stan w aplikacji lub grze, aktywność domyślnie wywołuje funkcję
onSaveInstanceState() przed ponownym uruchomieniem i funkcję
onRestoreInstanceState() po ponownym uruchomieniu. Ten proces wymaga jednak ponownego wczytania wszystkich powiązanych usług i zasobów. Więcej informacji o tym domyślnym działaniu znajdziesz w przewodniku po obsłudze zmian konfiguracji.
Podczas typowej sesji rozgrywki następuje kilka zmian konfiguracji. Jeśli gra pozwala systemowi obsługiwać każdą zmianę konfiguracji, scena gry jest wielokrotnie niszczona i uruchamiana ponownie, co obniża wydajność gry. Z tego powodu gorąco zachęcamy do samodzielnego wprowadzania tych zmian w konfiguracji w grze.
Aby dowiedzieć się, jak dodać do gry logikę zmiany konfiguracji, zapoznaj się z sekcją dotyczącą tworzenia niestandardowych procedur obsługi zmiany konfiguracji.
Tworzenie elastycznej architektury
Aby dodać obsługę gry na jak największej liczbie urządzeń, postępuj zgodnie z tymi sprawdzonymi metodami:
- Wdrażaj pakiety Android App Bundle zamiast pojedynczych plików APK. Pakiety aplikacji na Androida umożliwiają spakowanie artefaktów o różnych rozdzielczościach i modelach architektury, takich jak x86 czy ARM, w jeden artefakt. Co więcej, pakiety Android App Bundle obsługują wyższe limity rozmiaru gier. Każdy podstawowy plik APK może mieć nawet 150 MB, a sam pakiet może mieć rozmiar wielu gigabajtów.
- Dodano obsługę architektur x86. Ten krok poprawia wydajność gry na urządzeniach, które nie obsługują architektury ARM, ponieważ mogą one teraz wykonywać instrukcje bez konieczności ich wcześniejszego tłumaczenia.
Dodanie obsługi Vulkana
Dzięki obsłudze Vulkana gra może osiągać wyższą wydajność graficzną. Większość urządzeń obsługuje ten interfejs API grafiki.
Tworzenie niestandardowych procedur obsługi zmian konfiguracji
Aby zadeklarować typy zmian konfiguracji, które Twoja gra obsługuje samodzielnie, dodaj atrybut android:configChanges do każdego elementu <activity> w pliku manifestu, który reprezentuje ekran lub złożony interfejs.
Poniższy fragment kodu pokazuje, jak zadeklarować, że gra obsługuje zmiany rozmiaru ekranu, orientacji ekranu i metody wprowadzania:
<activity ... android:configChanges="screenSize|orientation|keyboard|keyboardHidden"> </activity>
Gdy nastąpią zmiany w zadeklarowanej konfiguracji, system wywoła inną metodę, onConfigurationChanged().
W tej metodzie dodaj logikę aktualizowania interfejsu gry:
- Zaktualizuj współczynnik skalowania i orientację ekranu. Pamiętaj, że ze względu na wydajność czasami lepiej jest skalować interfejs gry tylko w jednym wymiarze.
- określanie optymalnej metody wprowadzania danych dla gracza,
Obsługa zmian konfiguracji ekranu
Gra obsługuje ręcznie zmiany rozmiaru i orientacji ekranu, gdy w atrybucie android:configChanges uwzględnisz odpowiednio wartości screenSize i orientation. Możesz użyć tych nowych wartości, aby zaktualizować zawartość sceny i obszary wprowadzania danych przez odtwarzacz. Wskazówki dotyczące projektowania układu gry, aby ułatwić jego aktualizację, znajdziesz w przewodniku po obsłudze różnych rozmiarów ekranu.
W implementacji onConfigurationChanged() w grze użyj przekazanego obiektu Configuration i obiektu Display menedżera okien, aby określić zaktualizowane wartości rozmiaru i orientacji ekranu.
Poniższy fragment kodu pokazuje, jak uzyskać zaktualizowany rozmiar ekranu i orientację gry:
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(); }
Pamiętaj, że zmiana pozycji urządzenia składanego powoduje zmianę konfiguracji, nawet jeśli aplikacja działa w trybie pełnoekranowym. W rezultacie aplikacja może być zmuszona do obsługi zmian rozmiaru ekranu lub gęstości pikseli, jeśli użytkownik złoży lub rozłoży urządzenie podczas działania gry.
Jakość ekranu w przypadku konkretnych gier
W sekcjach poniżej opisujemy, jak dostosować reakcję gry na zmiany rozmiaru lub orientacji ekranu w zależności od jej cech:
Tryb pełnoekranowy
Na niektórych platformach, np. ChromeOS, aplikacje i gry na Androida mogą być domyślnie wyświetlane w oknie i mieć możliwość zmiany rozmiaru. Jeśli gra ma zawsze działać w trybie pełnoekranowym, możesz ustawić atrybut android:resizeableActivity na false w jednym z elementów <activity>, jak pokazano w tym fragmencie kodu:
<activity ... android:resizeableActivity="false"> </activity>
Możesz też ustawić atrybut android:resizeableActivity na false, aby zapobiec zmianom konfiguracji na podstawie rozmiaru. Jeśli jednak gra nie zawsze działa w trybie pełnoekranowym, ten atrybut należy dodać tylko tymczasowo na potrzeby testów.
Orientacja ekranu
Jeśli gra zależy od tego, czy czujniki urządzenia mają określoną orientację, w aktywności gry określ wartość parametru android:screenOrientation, jak pokazano w tym fragmencie kodu. To ustawienie pomaga zapobiegać nieoczekiwanemu odwróceniu sceny w grze.
<activity ... android:screenOrientation="landscape"> </activity>
Jakość ekranu na konkretnych urządzeniach
W sekcjach poniżej opisujemy, jak obsługiwać zmiany konfiguracji na ekranie w przypadku urządzeń o określonych cechach.
Format obrazu
Niektóre urządzenia obsługują różne formaty obrazu. Na przykład urządzenia składane są zaprojektowane tak, aby po złożeniu obsługiwać współczynnik proporcji 21:9. Aby poradzić sobie z tą potencjalną różnorodnością proporcji obrazu, wykonaj co najmniej 1 z tych działań:
- Kieruj aplikację na Androida 8.0 (API na poziomie 26) lub nowszego.
- Zadbaj o to, aby scenę i interfejs gry można było zmieniać. Set
android:resizeableActivitytotruena urządzeniach z Androidem 7.0 (poziom interfejsu API 24) lub nowszym. Zadeklaruj maksymalny obsługiwany format obrazu. W atrybucie
<meta-data>powiązanym z Twoją grą ustaw wartośćandroid.max_aspectna2.4, jak pokazano w tym fragmencie kodu. Pamiętaj jednak, że proporcje obrazu większe niż podane przez Ciebie spowodują, że gra będzie wyświetlana w formacie letterbox.<application> <meta-data android:name="android.max_aspect" android:value="2.4" /> </application>
Wiele aktywności widocznych jednocześnie
Wiele nowoczesnych urządzeń obsługuje różne układy ekranu, w tym podzielony ekran, obraz w obrazie i duże obszary wyświetlania. Gdy używasz jednego z tych układów, system może wyświetlać jednocześnie kilka aktywności.
Na urządzeniach z Androidem 9 (poziom interfejsu API 28) lub nowszym wszystkie widoczne na górze działania mogą być wznawiane w tym samym czasie. Aby to działało, zarówno gra, jak i producent urządzenia muszą włączyć tę funkcję. Aby dodać obsługę w grze, ustaw wartość android.allow_multiple_resumed_activities na true w pliku manifestu gry, jak pokazano w tym fragmencie kodu:
<application> <meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" /> </application>
Następnie możesz przetestować grę na różnych urządzeniach, aby sprawdzić, które z nich zapewniają obsługę OEM niezbędną do prawidłowego działania funkcji jednoczesnego wznowienia.
Więcej informacji o konfigurowaniu gry tak, aby wyświetlała się w wielu oknach, znajdziesz w przewodniku na temat dodawania obsługi wielu okien.
Obsługa różnych typów modeli interakcji
Gra obsługuje obecność i dostępność klawiatury ręcznie, gdy w atrybucie android:configChanges podasz odpowiednio wartości keyboard i keyboardHidden. Możesz użyć tych nowych wartości, aby zaktualizować podstawową metodę wprowadzania danych w grze.
Podczas konfigurowania gry pod kątem obsługi różnych typów danych wejściowych użytkownika pamiętaj o tych kwestiach:
- Wykrywanie metod wprowadzania zamiast poszczególnych urządzeń. Dzięki temu łatwiej jest poprawić wrażenia graczy bez zbytniego skupiania się na konkretnym urządzeniu, którego mogą używać.
- Uwzględnij atrybut
keyboardHiddenna liście zmian konfiguracji obsługiwanych ręcznie. Dzięki temu gra może śledzić, kiedy klawiatura jest fizycznie podłączona do urządzenia, ale nie można jej używać. Określ, które metody wprowadzania są obecnie dostępne. Aby to zrobić, wywołaj funkcję
getInputDeviceIds()przy uruchamianiu gry i po każdej zmianie konfiguracji.Na podstawie preferowanego urządzenia wejściowego możesz często określić, w jaki sposób gracz zamierza wchodzić w interakcje z Twoją grą:
- Gracze zwykle używają klawiatury lub kontrolera do gier, aby wykonywać szybkie sekwencje przycisków.
- Gracze zwykle używają ekranu dotykowego lub touchpada do wykonywania bardziej złożonych gestów.
- Gracze zwykle używają myszy, aby wykonywać bardziej precyzyjne działania.
W sekcjach poniżej znajdziesz sprawdzone metody dotyczące konkretnych typów urządzeń wejściowych.
Klawiatura
Tworząc układ klawiatury do gry, zastanów się, jak gracz porusza się po danej scenie i jak wchodzi w interakcję z ustawieniami gry.
Klawisze WASD lub strzałki są zwykle najlepsze do sterowania ruchem postaci. Warto też przypisać konkretny klawisz do każdej ważnej czynności lub umiejętności, którą sterowana postać może wykonać w grze. Aby zmaksymalizować komfort graczy, rozważ dodanie do gry obsługi niestandardowych przypisań klawiszy.
Gracze powinni też mieć możliwość otwierania menu gry i poruszania się po nich za pomocą klawiatury. Klawisz Esc jest często używany do wstrzymywania sceny i wyświetlania menu gry.
Więcej informacji o obsłudze wprowadzania danych za pomocą klawiatury w grze znajdziesz w przewodniku na temat obsługi nawigacji za pomocą klawiatury oraz w przewodniku na temat obsługi działań wykonywanych za pomocą klawiatury.
Kontroler do gier
Więcej informacji o obsłudze danych wejściowych kontrolera w grze znajdziesz w przewodniku po obsłudze kontrolerów do gier.
Mysz lub touchpad
Jeśli Twoja gra obsługuje wprowadzanie danych przez gracza za pomocą myszy lub touchpada, pamiętaj, że gracze korzystają z urządzenia nie tylko do grania. Pamiętaj, że gdy poprosisz o przechwycenie wskaźnika, wszystkie dane wejściowe z myszy będą kierowane do Twojej gry. Dlatego po uzyskaniu przez grę potrzebnych informacji zwolnij przechwytywanie wskaźnika, aby gracze odzyskali standardową kontrolę nad myszą na swoim urządzeniu.
Na urządzeniach z Androidem 8.0 (poziom interfejsu API 26) lub nowszym możesz używać interfejsu Mouse Capture API, aby ułatwić proces przechwytywania wskaźnika. W grach, które reagują na dane wejściowe o wysokiej precyzji, możesz uzyskać bieżące współrzędne wskaźnika, wywołując metody getX() i getY().
Więcej informacji o dodawaniu obsługi sygnału myszy i touchpada w grze znajdziesz w przewodniku na temat śledzenia ruchów dotykowych i wskaźnika oraz w przewodniku na temat obsługi gestów wielodotykowych.
Testowanie gry
Zanim opublikujesz grę, sprawdź, jak reaguje ona na zmiany konfiguracji, wykonując czynności opisane w kolejnych sekcjach.
Aktualizowanie planu testów
Podczas sprawdzania funkcjonalności gry uwzględnij te przypadki testowe:
- Zminimalizuj i zmaksymalizuj okno z grą. (Nie dotyczy to sytuacji, gdy gra jest zawsze w trybie pełnoekranowym).
- Zmień rozmiar ekranu.
- zmieniać orientację ekranu, (Nie dotyczy gier o stałej orientacji).
- Podłączanie i odłączanie urządzeń wejściowych, takich jak klawiatury i myszy.
- Wykonaj jednoczesne wznowienie, jeśli gra to obsługuje.
Rozważ też zaktualizowanie systemu kontroli jakości gry, aby móc optymalizować ją pod kątem różnych wrażeń graczy.
Sprawdzone metody testowania gry znajdziesz w przewodniku po podstawach testowania.
Korzystanie z narzędzi do testowania i debugowania
Testy możesz przeprowadzać za pomocą różnych narzędzi obsługiwanych przez platformę:
emulatory, w tym emulator Androida i Laboratorium Firebase;
Analizator wydajności ChromeOS, dostępny w ChromeOS M75 lub nowszym.