Четверг, 2017-09-21, 0:13 AM

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


Взаимодействие с кодом платформы

Иногда бывает необходимо получить доступ к API конкретной платформы, например добавление рекламных услуг или функциональность leaderboard предоставляемые таким фреймворком как Swarm.

Это может быть достигнуть взаимодействие API с фасадом, предоставляя реализацию для конкретной платформы.

Следующий пример не является реальным и предполагает, что мы хотим использовать очень просто leaderboard API, который доступен только на Android. Для других платформы мы просто логируем вызов или возвратить тестовое значение.

Android API выглядит следующим образом:

/** Давайте предположим, что это API предоставлено Swarm **/
public class LeaderboardServiceApi {
   public void submitScore(String user, int score) { ... }
}
Первым шагом является создание абстракции API в виде интерфейса.

Интерфейс нужно поместить в основной проект (смотрите настройку проекта)

public interface Leaderboard {
   public void submitScore(String user, int score);
}
Далее мы создадим конкретные реализации для каждой платформы и поместим их в соответствующие проекты.

Следующий код для Android проекта:

/** Android реализация, можно иметь доступ к LeaderboardServiceApi на прямую **/
public class AndroidLeaderboard implements Leaderboard {
   private final LeaderboardServiceApi service;

   public AndroidLeaderboard() {
      // Предположим можно создать экземпляр так:
      service = new LeaderboardServiceApi();
   }

   public void submitScore(String user, int score) {
      service.submitScore(user, score);
   }
}
Следующий код для Desktop проекта:
/** Desktop реализация, мы просто пишем сообщение в лог **/
public class DesktopLeaderboard implements Leaderboard {
   public void submitScore(String user, int score) {
      Gdx.app.log("DesktopLeaderboard", "would have submitted score for user " + user + ": " + score");
   }
}

Следующий код для HTML5 проекта:
/** Html5 реализация, какая же для DesktopLeaderboard **/
public class Html5Leaderboard implements Leaderboard {
   public void submitScore(String user, int score) {
      Gdx.app.log("DesktopLeaderboard", "would have submitted score for user " + user + ": " + score");
   }
}

Далее ApplicationListener получает конструктор в который мы может передать конкретную реализацию Leaderboard:
public class MyGame implements ApplicationListener {
   private final Leaderboard leaderboard;

   public MyGame(Leaderboard leaderboard) {
      this.leaderboard = leaderboard;
   }

   // остальное опущено для ясности
}
В каждой Starter классе мы мы просто создает экземпляр MyGame, передавая как агрумент соответствующею Leaderboard реализацию, например для Desktop проекта:
public static void main(String[] argv) {
   LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
   new LwjglApplication(new MyGame(new DesktopLoaderboard()), config);
}