Начало первого хода игры Turn Based Game Center

У меня есть игра, над которой я работаю, она основана на поворотах между двумя игроками. Я немного сбит с толку относительно того, как отправить заказ игрока, если это первый раунд и игрок еще не найден.

- (void)endTurnWithNextParticipants:(NSArray *)nextParticipants turnTimeout:(NSTimeInterval)timeout matchData:(NSData *)matchData completionHandler:(void (^)(NSError *error))completionHandler

2 ответа

Это всегда ход локального игрока в объекте матча, возвращаемом findMatchForRequest: withCompletionHandler: как указано в ссылке.

Независимо от того, как игрок находится в матче, местный игрок всегда является текущим участником в ответном матче.

Если говорить более конкретно на ваш вопрос, matchData свойство этого объекта совпадения будет nil в случае, когда местный игрок еще не подошел. Так как вы будете назначать matchData перед совершением хода другой игрок увидит эти данные вместо nil,

Благодаря пошаговой инфраструктуре игрового центра вы не контролируете порядок игроков. Если findMatchForRequest: withCompletionHandler: находит матч, в котором кто-то уже сделал ход, ты второй. Если он находит пустое совпадение, вы первый.

Это старая ветка, но так как я недавно боролся с чем-то связанным с этим, я подумал, что это может помочь другим, кто проходит через:

Участники - это игровые автоматы, независимо от того, заняты они или нет. Игроки заполняют эти слоты по мере их обнаружения. В целом "Это всегда моя очередь" означает: вы работаете с играми с заданным количеством участников (слотов), но эти слоты, возможно, еще не заполнены. Из-за этого очень сложно показывать информацию пользователям в некоторых случаях, потому что вы просто возвращаете NULL из пустых полей участника, и вам нужно изящно обрабатывать эти ситуации. На первом ходу последующие пользователи даже не знают, что их пригласили, пока каждый предыдущий игрок не сделал ход. Когда вы ходите по очереди, своего рода пара выходит из вашего игрового процесса, а затем приглашенный отклоняется, потому что он не может играть. ИМО, модель пригодна только для автосогласования. Мне не очень нравится пользовательский опыт при приглашении друзей на матч. Но так оно и есть.

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

    NSMutableArray *nextParticipants = [NSMutableArray new];
    for (GKTurnBasedParticipant *participant in theMatch.participants)
    {
        if ([participant.player.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID])
        {
            [nextParticipants addObject:participant];
        }
        else
        {
            [nextParticipants insertObject:participant atIndex:0];
        }
    }

затем закончил поворот как:

    [theMatch endTurnWithNextParticipants:nextParticipants
                              turnTimeout:timeOutSeconds                     
                                matchData:updatedMatchData
                        completionHandler:^(NSError *error)
    {
           ....
    }];

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

Другие вопросы по тегам