Как правильно вызвать метод из основного игрового цикла через запланированный будильник?

Я использую libgdx для игры и хочу, чтобы игра вызывала метод update(), настроенный прямо сейчас, чтобы вызываться каждые 15 минут. Однако это работает, конечно, только тогда, когда открыта сама игра, и я хочу, чтобы это работало, пока устройство включено.

На данный момент я понял, как создать BroadcastReceiver и использовать AlarmManager для вызова его каждые 15 минут, и я знаю, как настроить его для добавления будильника при загрузке. Единственное, что мне нужно выяснить, это как сделать так, чтобы это было запланировано с точными 15-минутными интервалами (например, 9:30, 9:45 и т. д.).

Это источник приложения Android: https://github.com/libgdx/libgdx/blob/master/backends/gdx-backend-android/src/com/badlogic/gdx/backends/android/AndroidApplication.java

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

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
    cfg.useGL20 = true;
    cfg.useAccelerometer = false;
    cfg.useCompass = false;

    initialize(new MainClass(), cfg);
}

Оглядываясь вокруг, не могу найти никакого способа сослаться на MainClass() без вызова onCreate(). Я предполагаю, что лучший способ сделать что-то подобное иметь отдельное намерение с копией метода update() и вместо этого вызывать доступ к тем же данным, однако я не знаю, как это сделать в libgdx.


person cavemaneca    schedule 03.03.2013    source источник


Ответы (1)


Я думаю, вы пытаетесь заставить свой игровой класс делать слишком много, не говоря уже о том, что это столкнется с проблемами, когда вы срабатываете «тревога», а игра не запущена, поэтому ничто не может получить вызов update(). Если вам действительно нужен способ периодического обновления некоторых данных для вашей игры вне текущего игрового цикла, я бы подошел к этому так:

  1. Создайте свой AlarmManager, как у вас есть, но вместо того, чтобы пытаться получить доступ к существующему игровому классу и вызвать обновление, просто сохраните обновления в местоположении SharedStorage. {Документация по Android}

  2. Создайте новый интерфейс в своем основном проекте, который определяет StoredDataReader.

  3. Создайте новый класс в своем проекте Android с именем AndroidStoredDataReader, который реализует StoredDataReader и знает, как читать из местоположения сохраненных обновлений.

  4. Перегрузите конструктор MainClass(), чтобы получить экземпляр StoredDataReader.

  5. Затем в методе onCreate() вы создаете свой класс AndroidStoredDataReader, а затем передаете его новому вызову MainClass().

  6. В цикле обновления/рендеринга вашей игры вы затем запросите у StoredDataReader необходимые данные.

Это позволит вам также использовать тот же подход, если вы переносите приложение на GWT или на рабочий стол, где вы можете реализовать StoredDataReader для каждой платформы. (Считыватель GWTStoredData может читать из локального хранилища браузера, настольная версия может читать из локального файла и т. д.)

person Barryrowe    schedule 01.10.2013