Intereting Posts
Функция «Экономия заряда батареи» убивает мой музыкальный сервис Как изменить или добавить тему в Android Studio? Как избежать того, что мое приложение внедряет оптимизацию на устройствах Samsung Как сохранить данные из службы Android? Нарушение приложений на Android L Android Strip Audio из видео Может ли телефон притворяться клавиатурой Bluetooth? Округлые обрезанные углы Android XML Запретить открытие диалогового окна несколько раз при возобновлении действия Абсолютное положение в базовом адаптере GrivView Как мы наследуем классы тестов через модули библиотеки Android? Как заблокировать пользовательский переключатель в Lollipop? Android – добавление хотя бы одного действия с фильтром намерений ACTION-VIEW после обновления версии SDK версии 23 Проблема при просмотре списка прокрутки с помощью Pull to Refresh Поставщик контента, не работающий на устройствах семейства Nexus

Google Play Game Services разблокирует достижение – хранить разблокировку в игре или разблокировать вызов () каждый раз?

Я разрабатываю Android-игру, в которой используются сервисы Google Play Game.

Когда игрок достигает, например, 10000 очков, достижение разблокируется. Поэтому, когда игрок достигает 10000 очков, я звоню

Games.Achievements.unlock(...) 

Вопрос в том, что делать, когда пользователь снова достигает 10000 очков в другой игре. Должен ли я проверять, было ли это достижение уже разблокировано или я могу снова вызвать unlock ()?

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

 if(myAchievementIsLocked){ Games.Achievements.unlock(...) } 

Каковы наилучшие практики? Я смотрел на некоторые образцы, но не нашел ответов, которые я искал.

Насколько я могу судить, unlock() сначала проверит локальное приложение Play Games, чтобы узнать, уже ли разблокировано достижение, и только если он не отправит запрос на сервер. Это означает, что вызов unlock() при уже незаблокированном достижении не должен влиять на какие-либо квоты, кроме первого, когда он вызывается на устройстве, поскольку экземпляр устройства Play Play может не синхронизировать это достижение с сервера.

С другой стороны, можно проверить состояние всех достижений после входа в систему и сохранить локальную копию своих государств – что действительно нужно делать, если игрок НЕ подписан (чтобы вы могли разблокировать любые достигнутые успехи При следующем входе). Этот процесс не документирован нигде, кроме документации API, но нет полных примеров, поэтому я дам вам один здесь 🙂

Убедитесь, что вы запускаете этот метод асинхронно (используя AsyncTask или отдельный поток), так как потребуется некоторое время для завершения (ожидание ответов с сервера). Кроме того, сделайте это только тогда, когда игрок успешно подписан – onSignInSucceeded() – хорошее место для него.

  public void loadAchievements() { boolean fullLoad = false; // set to 'true' to reload all achievements (ignoring cache) float waitTime = 60.0f; // seconds to wait for achievements to load before timing out // load achievements PendingResult p = Games.Achievements.load( playHelper.getApiClient(), fullLoad ); Achievements.LoadAchievementsResult r = (Achievements.LoadAchievementsResult)p.await( waitTime, TimeUnit.SECONDS ); int status = r.getStatus().getStatusCode(); if ( status != GamesStatusCodes.STATUS_OK ) { r.release(); return; // Error Occured } // cache the loaded achievements AchievementBuffer buf = r.getAchievements(); int bufSize = buf.getCount(); for ( int i = 0; i < bufSize; i++ ) { Achievement ach = buf.get( i ); // here you now have access to the achievement's data String id = ach.getAchievementId(); // the achievement ID string boolean unlocked = ach.getState == Achievement.STATE_UNLOCKED; // is unlocked boolean incremental = ach.getType() == Achievement.TYPE_INCREMENTAL; // is incremental if ( incremental ) int steps = ach.getCurrentSteps(); // current incremental steps } buf.close(); r.release(); } 

Дополнительную информацию об этих процессах см. В документации по API .

Таким образом, используя этот метод, вы можете создать локальную копию достижений (просто измените внутренности цикла for, чтобы сохранить значения достижений в некоторой локальной структуре) и обратитесь к нему по мере необходимости.

Вызов .unlock (…) на уже разблокированном достижении не должен быть проблемой. Я предполагаю, что в методе .unlock (…) уже есть какая-то «проверка, если разблокирована».