Игры 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?
Заранее спасибо.
Спасибо за ответ.Я вижу, что вы являетесь автором этого сообщения в блоге, поэтому я прошу приложить примечание к соответствующей документации, в котором говорится, что эта функция больше не работает. Мы потратили кучу времени на реализацию и отладку этого, и я не заметил никаких упоминаний о том, что эти функции больше не работали до просмотра связанного сообщения в блоге. Еще раз спасибо. – noodleben