2017-02-02 4 views
0

Игры Google Play C++, похоже, не возвращают мне правильные данные.Google Play Игры C++ API - не удается получить доступ к друзьям Программно

Основная идея заключается в том, что у нас есть страница в нашей игре, которая показывает список друзей. Кроме того, когда вы играете в игру, на экране появится индикатор на экране, когда вы приближаетесь, и когда вы передадите лучшие результаты своих друзей.

Игра написана на Cocos2d-x, и в результате мы используем библиотеку Google Play Games C++. GPG аутентифицируется успешно, и другие функции (такие как разблокировка достижений и фактическое представление баллов) работают правильно. В стороне, если кто-либо читает Google, на веб-сайте есть примечания к выпуску версии 2.2, но на странице загрузки только 2.1, так что это то, что мы используем.

В любом случае у нас есть два устройства с разными учетными записями Google Play, которые являются друзьями. У нас есть возможность открыть интерфейс по умолчанию, собственный пользовательский интерфейс Leadersboards Games, и если я перейду в социальную таблицу лидеров, то оба устройства видят высокий балл другого игрока с этой страницы - так что кажется, что мы успешно сделали друзей двух друзей.

К сожалению, я не могу получить данные этого друга программно, используя C++ API.

Вот соответствующий код.

void GameCenterSession::fetchFriends() 
{ 
    __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Fetching friends!"); 

    //GET INVITABLE FRIENDS 
    game_services_->Players().FetchInvitable(gpg::DataSource::CACHE_OR_NETWORK, [] (gpg::PlayerManager::FetchListResponse response) { 
     __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got invitable friends response: %d", response.status); 
     __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got invitable players info! Num players: %d", response.data.size()); 
     if (gpg::IsSuccess(response.status)) { 
      //PROCESS PLAYERS 
      GameCenterSession::getInstance()->onPlayersInfoReceived(kRequestFriendsInfo, response.data); 
     } 
    }); 

    //GET CONNECTED FRIENDS 
    game_services_->Players().FetchConnected(gpg::DataSource::CACHE_OR_NETWORK, [] (gpg::PlayerManager::FetchListResponse response) { 
     __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got connected friends response: %d", response.status); 
     __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got connected players info! Num players: %d", response.data.size()); 
    }); 
} 

void GameCenterSession::onPlayersInfoReceived(const int requestId, std::vector<gpg::Player> playersInfo) { 

    __android_log_print(ANDROID_LOG_INFO, "MyGame!", "onPlayersInfoReceived num players: %d", playersInfo.size()); 
    const gpg::ScorePage::ScorePageToken distanceToken = game_services_->Leaderboards().ScorePageToken(
     kLeaderboardBestDistance, 
     gpg::LeaderboardStart::TOP_SCORES, 
     gpg::LeaderboardTimeSpan::ALL_TIME, 
     gpg::LeaderboardCollection::SOCIAL 
    ); 

    //FETCH ALL TIME SOCIAL SCORES FOR DISTANCE 
    game_services_->Leaderboards().FetchScorePage(gpg::DataSource::CACHE_OR_NETWORK, distanceToken, 1000, [] (gpg::LeaderboardManager::FetchScorePageResponse response) { 

     if (gpg::IsSuccess(response.status) && response.data.Valid()) { 
      __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Got social leaderboard! Num players: %d", response.data.Entries().size()); 
      gpg::ScorePage::Entry myEntry = gpg::ScorePage::Entry(); 

      //search through and find my score! 
      for (auto score : response.data.Entries()) { 
       __android_log_print(ANDROID_LOG_INFO, "MyGame!", "%s got distance %d", score.PlayerId().c_str(), score.Score().Value()); 


       if (score.PlayerId().compare(GameCenterSession::getInstance()->myPlayer.Id()) == 0) { 
        __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Distance - Yup that's me"); 
        myEntry = score; 
       } else { 
        __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Distance - It's another player!"); 
       } 
      } 

      GameCenterSession::getInstance()->onScoresReceived(kRequestFriendsDistancesInfo, myEntry, response.data.Entries()); 
     } 
    }); 


    const gpg::ScorePage::ScorePageToken scoreToken = game_services_->Leaderboards().ScorePageToken(
     kLeaderboardBestScore, 
     gpg::LeaderboardStart::TOP_SCORES, 
     gpg::LeaderboardTimeSpan::ALL_TIME, 
     gpg::LeaderboardCollection::SOCIAL 
    ); 

    game_services_->Leaderboards().FetchScorePage(gpg::DataSource::CACHE_OR_NETWORK, scoreToken, 1000, [] (gpg::LeaderboardManager::FetchScorePageResponse response) { 
     if (gpg::IsSuccess(response.status) && response.data.Valid()) { 

      gpg::ScorePage::Entry myEntry = gpg::ScorePage::Entry(); 

      //search through and find my score! 
      for (auto score : response.data.Entries()) { 
       __android_log_print(ANDROID_LOG_INFO, "MyGame!", "%s got score %d", score.PlayerId().c_str(), score.Score().Value()); 


       if (score.PlayerId().compare(GameCenterSession::getInstance()->myPlayer.Id()) == 0) { 
        __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Score - Yup that's me"); 
        myEntry = score; 
       } else { 
        __android_log_print(ANDROID_LOG_INFO, "MyGame!", "Score - It's another player!"); 
       } 
      } 

      GameCenterSession::getInstance()->onScoresReceived(kRequestFriendsScoresInfo, myEntry, response.data.Entries()); 
     } 
    }); 

    if (requestId == kRequestFriendsInfo) 
    { 
     friends = playersInfo; 
    } 
} 

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

// Устройство 1

I/MyGame!(1510): Google Play Games authenticated successfully! 
I/MyGame!(1510): Fetching friends! 
I/MyGame!(1510): Got invitable friends response: 1 
I/MyGame!(1510): Got invitable players info! Num players: 0 
I/MyGame!(1510): onPlayersInfoReceived num players: 0 
I/MyGame!(1510): Got connected friends response: 1 
I/MyGame!(1510): Got connected players info! Num players: 0 
I/MyGame!(1510): Got social leaderboard! Num players: 1 
I/MyGame!(1510): g1703186947466536XXXX got distance 310 
I/MyGame!(1510): Distance - Yup that's me 
I/MyGame!(1510): g1703186947466536XXXX got score 2510 
I/MyGame!(1510): Score - Yup that's me 

// Устройство 2

01-23 17:11:27.227 17187 17234 I MyGame!: Google Play Games authenticated successfully! 
01-23 17:11:27.250 17187 17234 I MyGame!: Fetching friends! 
01-23 17:11:27.451 17187 17234 I MyGame!: Got invitable friends response: 1 
01-23 17:11:27.451 17187 17234 I MyGame!: Got invitable players info! Num players: 0 
01-23 17:11:27.451 17187 17234 I MyGame!: onPlayersInfoReceived num players: 0 
01-23 17:11:27.581 17187 17234 I MyGame!: Got connected friends response: 1 
01-23 17:11:27.581 17187 17234 I MyGame!: Got connected players info! Num players: 0 
01-23 17:11:27.973 17187 17234 I MyGame!: Got social leaderboard! Num players: 1 
01-23 17:11:27.973 17187 17234 I MyGame!: g0152008166550356XXXX got distance 712 
01-23 17:11:27.973 17187 17234 I MyGame!: Distance - Yup that's me 
01-23 17:11:28.444 17187 17234 I MyGame!: g0152008166550356XXXX got score 2142 
01-23 17:11:28.444 17187 17234 I MyGame!: Score - Yup that's me 

Как вы можете видеть, мои обратные вызовы возвращают успешные результирующие коды. К сожалению, ни один из устройств не возвращает друзей, а обратный вызов со списком социальных лидеров содержит только плеер на устройстве, а не оценку их друзей.

Я следил за документацией как мог, и я просмотрел код, не имея возможности найти какую-либо проблему, но если это всего лишь проблема семантики, я буду рад услышать о моих ошибках. Я здесь что-то не так, или есть проблема с самим C++ API?

Заранее спасибо.

ответ

0

API ведет себя как и ожидалось. От: https://android-developers.googleblog.com/2016/12/games-authentication-adopting-google.html

Google+ больше не интегрирован Announced last year, игры отключаются от Google+ во время этого перехода. В результате публичные API-интерфейсы для подключения игроков через круги перестали работать, но стандартные интерфейсы для многопользовательских приглашений и социальных лидеров продолжали работать. Начиная с февраля 2017 года, стандартные пользовательские интерфейсы также не будут отображать результаты Социального графа, поскольку данные Google+ станут недоступными. Это повлияет на многопользовательские игры, социальные лидеры и API подарков на Android. Эффект будет заключаться в том, что эти API вернутся успешно, но с пустым списком игроков.

+0

Спасибо за ответ.Я вижу, что вы являетесь автором этого сообщения в блоге, поэтому я прошу приложить примечание к соответствующей документации, в котором говорится, что эта функция больше не работает. Мы потратили кучу времени на реализацию и отладку этого, и я не заметил никаких упоминаний о том, что эти функции больше не работали до просмотра связанного сообщения в блоге. Еще раз спасибо. – noodleben

 Смежные вопросы

  • Нет связанных вопросов^_^