Вторник, 2024-03-19, 1:50 PM

Поиск
Меню
Категории раздела
Поддержи проект!
Рекомендуем


Starter классы и конфигурация - часть 1

Для каждой платформы должен быть написать Starter класс. Этот класс создает экземпляр конкретной back-end реализации Application и ApplicationListener реализует логику приложения. Starter классы зависят от платформы. Далее будет рассмотрено как создать экземпляр и настроить его для каждого back-end.

Эта статья предполагает, что вы ознакомлены с инструкциями настройки проекта и имеете импортированные основной, Desktop, Android и HTML5 проекты в Eclipse.

Desktop (LWJGL)

При открытии Main.java класса в my-gdx-game проекте можно увидеть следующее:

package com.me.mygdxgame;

import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;

public class Main {
   public static void main(String[] args) {
      LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
      cfg.title = "my-gdx-game";
      cfg.useGL20 = false;
      cfg.width = 480;
      cfg.height = 320;
               
      new LwjglApplication(new MyGdxGame(), cfg);
   }
}
Cначала создается экземпляр LwjglApplicationConfiguration. Этот класс позволяет задать различные параметры конфигурации, такие как начальный размер экрана, использование OpenGL ES 1.x или 2.0 и так далее.

Как только указан объект конфигурации, создается экземпляр LwjglApplication. MyGdxGame класса представляет реализацию ApplicationListener и логики приложения.

Начиная с этого момента будет создано окно приложения и будут вызываться методы ApplicationListener, как описано в жизненном цикле приложения.

Android

Android приложение не использует main() метод как точку входа, но вместо этого требуется Activity. Откройте MainActivity.java класс в my-gdx-game-android проекте.

package com.me.mygdxgame;

import android.os.Bundle;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;

public class MainActivity extends AndroidApplication {
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
      
       AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
       cfg.useGL20 = false;
      
       initialize(new MyGdxGame(), cfg);
    }
}
Главная точка входа - onCreate() метод Activity класса. Обратите внимание, что MainActivity наследуется от AndroidApplication класса, который сам наследуется от Activity. Как и для Desktop starter класса задается конфигурация через создание экземпляра AndroidApplicationConfiguration класса. После настройки вызывается initialize() метод класса AndroidApplication и ему передается ApplicationListener(MyGdxGame).

Android приложения могут иметь несколько Activity. Libgdx игры обычно должны состоять из одной Activity. Разные экраны игры реализуются с помощью libgdx, а не как отдельные Activity. Причина этого в том, что создание новой Activity предполагает создание нового OpenGL контекста, который занимает много времени и вызывает перезагрузку все графических ресурсов.

Файл AndroidManifest.xml

Кроме AndroidApplicationConfiguration настройки, Android приложение также настраивается через AndroidManifest.xml файл, находящийся в корневой директории Android проекта. Он может выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.me.mygdxgame"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="5" android:targetSdkVersion="15" />

    <application
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name" >
       <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="landscape"
            android:configChanges="keyboard|keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
       </activity>
    </application>

</manifest>

Целевая версия SDK

Крайне важно задать targetSdkVersion больше и равной 6, если приложение должно работать на версии выше чем 1.5. Если этот атрибут не задан, то приложение запуститься с высокой версией Android в режиме совместимости. Разрешение области рисования будет меньше чем фактическое разрешение экрана

Ориентация экрана и изменение конфигурации

В дополнение к targetSdkVersion должны быть установлены атрибуты screenOrientation и configChanges.

ScreenOrientation атрибут определяет фиксированную ориентацию экрана приложения. Можно не задавать, если приложение может работать в landscape и portrait режиме.

ConfigChanges атрибут имеет важное значение и всегда должен быть задан как указано выше. Отсутствие этого атрибута означает, что приложение будет перезагружаться каждый раз, когда показывается или скрывается физическая клавиатура или изменяется ориентация устройства. Если ScreenOrientation атрибут не задан, то libgdx приложение будет принимать вызовы ApplicationListener.resize() метода, чтобы уведомить о изменении ориентации.

Права и разрешения

Если приложение должно иметь возможность записи во внешнее хранилище устройства (например, на SD карту), иметь доступ в интернет, использовать вибратор, не давать экрану входить в спящий режим, записывать звук, то нужно добавить следующие разрешения в AndroidManifest.xml файл:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

Обычно пользователи относятся с подозрением к приложения с множеством разрешений.

Для того, чтобы работал экран блокировки, нужно установить AndroidApplicationConfiguration.useWakeLock в true значение.

Если игра не нуждается в доступе к акселерометру или компасу, то рекомендуется отключить их, установив useAccelerometer и useCompass поля AndroidApplicationConfiguration в false значение.

Пожалуйста, обратитесь к руководству Android разработчика для получения дополнительной информации о том, как установить другие атрибуты, такие как иконка для вашего приложения.

Живые обои

Libgdx имеет простой в использовании способ создавать живые обои для Android. Starter класс для живых обоев называется AndroidLiveWallpaperService, вот простой пример:

package com.mypackage;

// imports snipped for brevity

public class LiveWallpaper extends AndroidLiveWallpaperService {
       @Override
       public ApplicationListener createListener () {
                return new MyApplicationListener();
       }

       @Override
       public AndroidApplicationConfiguration createConfig () {
                return new AndroidApplicationConfiguration();
       }

       @Override
       public void offsetChange (ApplicationListener listener, float xOffset, float yOffset, float xOffsetStep, float yOffsetStep,
                int xPixelOffset, int yPixelOffset) {
                Gdx.app.log("LiveWallpaper", "offset changed: " + xOffset + ", " + yOffset);
       }
}

Методы createListener () и createConfig () будет вызываться когда живые обои показываются в просмотре или при их создании на главном экране.

Метод ffsetChange() масштабируется, когда пользователь пролистывает экраны на главном экране и сообщает вам насколько экран смещен от центра экрана. Этот метод будет вызываться в потоке визуализации, так что вам не нужно заботиться о синхронизации.

В дополнение к Starter классу, вы также должны создать XML файл, описывающий ваши обои. Назовите файл к примеру livewallpaper.xml. Создайте директорию с именем XML в res директории Android проекта и поместить в нее файл (res/xml/livewallpaper.xml). Вот пример содержимого файла:

<?xml version="1.0" encoding="utf-8"?>
<wallpaper
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:thumbnail="@drawable/ic_launcher"
       android:description="@string/description"
       android:settingsActivity="com.mypackage.LivewallpaperSettings"/>
Здесь определяется миниатюра для окна выбора живых обоев, описание и Activity, которая будет показана когда пользователь вызовет меню настроек в окне выбора обоев. Эта должна быть обычная Activity, которая имеет несколько виджетов для изменения настроек, таких как цвет заднего фона и подобные вещи. Вы можете сохранить эти настройки в SharedPreferences и загрузить их позже в ApplicationListener живых обоях через Gdx.app.getPreferences() метод.

Наконец, вы должны будете добавлять некоторые вещи в AndroidManifest.xml файл. Вот пример для приложения живых обоев с Activity простых настроек:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mypackage"
      android:versionCode="1"
      android:versionName="1.0"
      android:installLocation="preferExternal">
       <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14"/>   
       <uses-feature android:name="android.software.live_wallpaper" />
               
       <application android:icon="@drawable/icon" android:label="@string/app_name">
                <activity android:name=".LivewallpaperSettings"
                                  android:label="Livewallpaper Settings"/>
               
                <service android:name=".LiveWallpaper"
            android:label="@string/app_name"
            android:icon="@drawable/icon"
            android:permission="android.permission.BIND_WALLPAPER">
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>
            <meta-data android:name="android.service.wallpaper"
                android:resource="@xml/livewallpaper" />
       </service>                                    
       </application>
</manifest>
Манифест определяет:
  • Использование особенности живых обоев, смотрите uses-feature.
  • Разрешения для привязки обоев, смотрите android:permission
  • Activity настроек.
  • Сервис живых обоев, смотрите meta-data.
Обратите внимание, что живые обои поддерживаются только начиная с Android 2.1 версии (SDK версия 7).

Живые обои имеют некоторые ограничения относительно сенсорного ввода. В целом только tap и drop будут сообщаться. Установить AndroidApplicationConfiguration # getTouchEventsForLiveWallpaper флаг на true, для получения всех событий от сенсорного экрана.