В списках лидеров не отображаются все обновленные результаты при отправке результатов с помощью метода endMatchInTurnWithMatchData: метод оценки
Я хочу внедрить систему рейтингов ELO для игры. Это означает, что после окончания игры я должен рассчитать увеличение для победителя и уменьшение для проигравшего по их фактическому счету.
У меня есть таблица лидеров типа "Самый последний счет", чтобы увидеть только последний отправленный счет. Я использую loadScoresWithCompletionHandler для загрузки оценки, затем для вычисления (теперь просто добавляем различные значения), а затем endMatchInTurnWithMatchData: scores: достижений: creationHandler: для завершения матча и обновления счета.
GKTurnBasedParticipant* player1 = [match.participants firstObject];
GKTurnBasedParticipant* player2 = [match.participants lastObject];
GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] initWithPlayerIDs:@[player1.playerID, player2.playerID]];
leaderboardRequest.timeScope = GKLeaderboardTimeScopeAllTime;
leaderboardRequest.identifier = LEADERBOARD_ELO_RATING_ID;
[leaderboardRequest loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
if(error){
NSLog(@"%@", error);
return;
}
GKScore *player1Score = [scores firstObject];
GKScore *player2Score = [scores lastObject];
float score1 = ((float)player1Score.value) / 1000.0f;
float score2 = ((float)player2Score.value) / 1000.0f;
// calculation of new score
score1 +=10;
score2 +=1;
GKScore *player1NewScore = [[GKScore alloc] initWithLeaderboardIdentifier:LEADERBOARD_ELO_RATING_ID forPlayer:player1Score.playerID];
GKScore *player2NewScore = [[GKScore alloc] initWithLeaderboardIdentifier:LEADERBOARD_ELO_RATING_ID forPlayer:player2Score.playerID];
player1NewScore.value = (int64_t)(score1 * 1000.0f);
player2NewScore.value = (int64_t)(score2 * 1000.0f);
[match endMatchInTurnWithMatchData:[game.board matchData]
scores:@[player1NewScore, player2NewScore]
achievements:@[]
completionHandler:^(NSError *error) {
if(error){// todo handle error
}
}];
}];
Получение оценки и загрузка нового счета работает хорошо, но когда я захожу, чтобы посмотреть таблицы лидеров (используя GKGameCenterViewController или приложение GameCenter), я могу видеть обновленный счет только локальным игроком (участником, который закончил матч и отправил окончательные данные). Но если я делаю запрос с помощью метода loadScoresWithCompletionHandler - я вижу, что оценки обоих игроков были обновлены - но в leaderboardController отображаются только результаты локальных игроков.
Пример:
Match started:
Player A - 10 pts
Player B - 10 pts
Match ended (Player A sent these scores using method endMatchInTurnWithMatchData:scores:achievements:completionHandler:):
Player A - 15 pts
Player B - 8 pts
Match ended - loadScoresWithCompletionHandler result shows scores:
Player A - 15 pts
Player B - 8 pts
Match ended - GKGameCenterViewController or GameCenter app shows scores:
Player A - 15 pts
Player B - 10 pts
Почему это происходит, я делаю что-то не так? Это из-за использования песочницы Game Center? Иначе как мне точно обновить счет обоих игроков по endMatchInTurnWithMatchData: очки: достижения: завершениеХандлер:?
1 ответ
Я узнал, что это может быть только из-за использования Game Center Sandbox.