Воскресенье, 2017-09-24, 5:44 AM

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


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

Daydream

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

Starter класс для Daydream называется AndroidDaydream. Вот пример:

package com.badlogic.gdx.tests.android;

import android.annotation.TargetApi;
import android.util.Log;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.badlogic.gdx.backends.android.AndroidDaydream;
import com.badlogic.gdx.tests.MeshShaderTest;

@TargetApi(17)
public class Daydream extends AndroidDaydream {
   @Override
   public void onAttachedToWindow() {
      super.onAttachedToWindow();      
          setInteractive(false);

      AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
      cfg.useGL20 = true;
      ApplicationListener app = new MeshShaderTest();
      initialize(app, cfg);
   }
}
Просто наследуйтесь от AndroidDaydream класса, переопределите onAttachedToWindow метод, установите конфигурацию и ApplicationListener и затем инициализируйте Daydream.

В дополнение к Daydream, вы можете предоставить Activity настроек, которая позволяет пользователю настроить ваш Daydream. Это может быть обычная Activity или libgdx AndroidApplication. Пример пустой Activity:

package com.badlogic.gdx.tests.android;

import android.app.Activity;

public class DaydreamSettings extends Activity {

}
Activity настроек должна быть указана в metadata сервиса Daydream. Создайте xml файл в res/xml директории Android проекта и укажите Activity:
<dream xmlns:android="http://schemas.android.com/apk/res/android"
   android:settingsActivity="com.badlogic.gdx.tests.android/.DaydreamSettings" />
}
В конце добавьте раздел для Activity настроек в AndroidManifest.xml и описание сервиса Daydream:
<service android:name=".Daydream"
   android:label="@string/app_name"
   android:icon="@drawable/icon"
   android:exported="true">
   <intent-filter>
          <action android:name="android.service.dreams.DreamService" />
          <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>
   <meta-data android:name="android.service.dream"
          android:resource="@xml/daydream" />
</service>

iOS

iOS back-end опирается на использовании Xamarin's MonoDevelop среды разработки и Monotouch для развертывания. Точкой входа Monotouch приложения является AppDelegate, который можно найти в Main.cs классе проекта. Ниже приведен пример:

using System;
using System.Collections.Generic;
using System.Linq;

using MonoTouch.Foundation;
using MonoTouch.UIKit;
using com.badlogic.gdx.backends.ios;
using com.me.mygdxgame;

namespace com.me.mygdxgame
{               
       public class Application
       {
                [Register ("AppDelegate")]
                public partial class AppDelegate : IOSApplication {
                        public AppDelegate(): base(new MyGdxGame(), getConfig()) {

                        }

                        internal static IOSApplicationConfiguration getConfig() {
                               IOSApplicationConfiguration config = new IOSApplicationConfiguration();
                               config.orientationLandscape = true;
                               config.orientationPortrait = false;
                               config.useAccelerometer = true;
                               config.useMonotouchOpenTK = true;
                               config.useObjectAL = true;
                               return config;
                        }
                }
               
                static void Main (string[] args)
                {
                        UIApplication.Main (args, null, "AppDelegate");
                }
       }
}

Файл Info.plist

Файл Info.plist содержит информацию о конфигурации приложения: ориентация экрана, минимальная версия операционной системы, дополнительные параметры, скриншоты и так далее. Ниже приведет пример:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
       <key>CFBundleDisplayName</key>
       <string>my-gdx-game</string>
       <key>MinimumOSVersion</key>
       <string>3.2</string>
       <key>UIDeviceFamily</key>
       <array>
                <integer>2</integer>
                <integer>1</integer>
       </array>
       <key>UIStatusBarHidden</key>
       <true/>
       <key>UISupportedInterfaceOrientations</key>
       <array>
                <string>UIInterfaceOrientationPortrait</string>
                <string>UIInterfaceOrientationPortraitUpsideDown</string>
       </array>
       <key>UISupportedInterfaceOrientations~ipad</key>
       <array>
                <string>UIInterfaceOrientationLandscapeLeft</string>
                <string>UIInterfaceOrientationLandscapeRight</string>
       </array>
</dict>
</plist>

Файл convert.properties

Процесс преобразования необходим для создания сборки Monotouch iOS платформы. Эта обработка выполнена как часть шага перед сборкой когда выполняется операция сборки MonoDevelop. Если вы используете сторонние библиотеки или не стандартные расположение некоторые исходников, то нужно обновить convert.properties файл. Пример файла ниже:

SRC =       ../my-gdx-game/src/
CLASSPATH = ../my-gdx-game/libs/gdx.jar
EXCLUDE   =
IN       = -r:libs/ios/gdx.dll -recurse:target/*.class
OUT       = target/my-gdx-game.dll

Этот файл определяет входные файлы для используются для сборки my-gdx-game.dll.

HTML5 GWT

Главной точкой входа HTML5/GWT приложения является GwtApplication. Откройте GwtLauncher.java в my-gdx-game-html5 проекте:

package com.me.mygdxgame.client;

import com.me.mygdxgame.MyGdxGame;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.backends.gwt.GwtApplication;
import com.badlogic.gdx.backends.gwt.GwtApplicationConfiguration;

public class GwtLauncher extends GwtApplication {
   @Override
   public GwtApplicationConfiguration getConfig () {
      GwtApplicationConfiguration cfg = new GwtApplicationConfiguration(480, 320);
      return cfg;
   }

   @Override
   public ApplicationListener getApplicationListener () {
      return new MyGdxGame();
   }
}
GwtApplication состоит из двух методов: getConfig() и getApplicationListener(). Первый метод должен вернуть экземпляр GwtApplicationConfiguration класса, который определяет различные параметры конфигурации HTML5 приложения. Метод getApplicatonListener для запуска приложения возвращает ApplicationListener.

Файлы модулей

GWT нужен реальный Java код каждого jar файла jar/projtect директории. Кроме того, каждый из файлов должен иметь один модуль определения с gwt.xml суффиксом.

Файл модуля HTML5 проекта может выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit trunk//EN" "http://google-web-toolkit.googlecode.com/svn/trunk/distro-source/core/src/gwt-module.dtd">
<module>
   <inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
   <inherits name='MyGdxGame' />
   <entry-point class='com.me.mygdxgame.client.GwtLauncher' />
   <set-configuration-property name="gdx.assetpath" value="../my-gdx-game-android/assets" />
</module>
Этим самым описываются наследование от двух модулей (gdx-backends-gwt и основного проекта), а также точка входа (класс GwtLauncher) и пути относительно HTML5 корневой директории, указывающие на assets директорию.

Оба gdx-backend-gwt.jar и основной проект имеют аналогичный файл модуля, описывающий другие зависимости. Вы не можете использовать файлы в jars/projects, которые не содержат файла модуля и исходников.

Дополнительную информацию о модулях и зависимостях смотрите в руководстве GWT разработчик.

Поддержка Reflection

GWT не поддерживает Java reflection по различным причинам. Libgdx имеет внутренний слой эмуляции, которвый генерирует reflection информацию для некоторых внутренних классов. Это означает, что если вы используете JSON сериализацию libgdx, то вы столкнетесь с проблемами. Вы можете решить их указав каких пакетов и классов необходимо сгенерировать reflection информацию. Чтобы сделать это поместите свойства конфигурации в gwt.xml файл GWT проекта следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<module>
    ... other elements ...
    <extend-configuration-property name="gdx.reflect.include" value="org.softmotion.explorers.model" />
    <extend-configuration-property name="gdx.reflect.exclude" value="org.softmotion.explorers.model.HexMap" />
</module>
Можно указать несколько пакетов и классов добавив еще extend-configuration-property элементов.

Это экспериментальная возможность, используйте ее на свой страх и риск.

Экран загрузки

Libgdx HTML5 приложение загружает все asset находящиеся в gdx.assetpath. Во время процесса загрузки отображается экран загрузки, реализованный с помощью GWT виджета. Если нужно изменить экран загрузки, то просто переопределите метод getPreloaderCallback() в GwtApplication классе. В следующем примере рисуется очень простой экран загрузки используя Canvas:

long loadStart = TimeUtils.nanoTime();
public PreloaderCallback getPreloaderCallback () {
final Canvas canvas = Canvas.createIfSupported();
canvas.setWidth("" + (int)(config.width * 0.7f) + "px");
canvas.setHeight("70px");
getRootPanel().add(canvas);
final Context2d context = canvas.getContext2d();
context.setTextAlign(TextAlign.CENTER);
context.setTextBaseline(TextBaseline.MIDDLE);
context.setFont("18pt Calibri");

return new PreloaderCallback() {
         @Override
         public void done () {
                context.fillRect(0, 0, 300, 40);
         }

         @Override
         public void loaded (String file, int loaded, int total) {
                System.out.println("loaded " + file + "," + loaded + "/" + total);
                String color = Pixmap.make(30, 30, 30, 1);
                context.setFillStyle(color);
                context.setStrokeStyle(color);
                context.fillRect(0, 0, 300, 70);
                color = Pixmap.make(200, 200, 200, (((TimeUtils.nanoTime() - loadStart) % 1000000000) / 1000000000f));
                context.setFillStyle(color);
                context.setStrokeStyle(color);
                context.fillRect(0, 0, 300 * (loaded / (float)total) * 0.97f, 70);
               
                context.setFillStyle(Pixmap.make(50, 50, 50, 1));
                context.fillText("loading", 300 / 2, 70 / 2);
         }

         @Override
         public void error (String file) {
                System.out.println("error: " + file);
         }
};
}
Обратите внимание, что для отображения экрана загрузки можно использовать только чистые GWT объекты, использование libgdx API будет доступно после того, как закончится загрузка.