Завершение сопоставления при нажатии кнопки Home

#cocoa-touch #ios #cocos2d-iphone #gamekit

#cocoa-touch #iOS #cocos2d-iphone #gamekit

Вопрос:

Как мне завершить матч / отключить игрока соперника и / или удалить стандартный интерфейс match maker (GameKit), если нажата кнопка Home на устройстве? У меня также есть кнопка «Главное меню» на экране, и если она нажата, я хотел бы завершить матч / отключить игрока противника. Я использую GameKit для поиска и запуска совпадений.

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

 -(void) match:(GKMatch*)match player:(NSString*)playerID didChangeState:(GKPlayerConnectionState)state
{
    switch (state)
    {
        case GKPlayerStateConnected:
            [delegate onPlayerConnected:playerID];
            break;
        case GKPlayerStateDisconnected:
            CCLOG(@"Disconnected");
            [delegate onPlayerDisconnected:playerID];
            break;
    }

    if (matchStarted == NO amp;amp; match.expectedPlayerCount == 0)
    {
        matchStarted = YES;
        [delegate onStartMatch];
    }
}


-(void) disconnectCurrentMatch
{
    CCLOG(@"Quit Match");
    [currentMatch disconnect];
    currentMatch.delegate = nil;
    [currentMatch release];
    currentMatch = nil;
}
  

Это все, что я использую для отключения игроков. Затем, когда игрок нажимает кнопку «Главное меню», это код.

 -(void)Menu: (id) sender
{
    didQuit = YES;

    if (isSingle == YES)
    {
        GameKitHelper* gkHelper = [GameKitHelper sharedGameKitHelper];
        [gkHelper disconnectCurrentMatch];
        gkHelper.delegate = nil;
    }

    [[CCDirector sharedDirector] replaceScene: [MainMenu scene]];
    CCLOG(@"Return Main Menu");
}
  

Это заменяет сцену на главное меню, но никогда не изменяет состояние на отключенное.

Комментарии:

1. Установили ли вы точку останова в коде (isSingle == YES), чтобы убедиться, что логика выполняется?

2. Если вы имеете в виду «разрыв»; Я не могу, поскольку это не в цикле или переключении, но я добавил «CCLOG» для проверки, и да, он вызывался. Я также добавил еще одну проверку в «disconnectCurrentMatch», и когда я нажимаю кнопку главного меню в game, это вызывает ее.

3. хм .. откуда вы знаете, что он не отключен? При смене сцены оно автоматически отключается? НЕТ?

4. Нет, я имел в виду точку останова Xcode — остановку выполнения в этот момент и проверку того, что происходит. Но если вы точно знаете, что isSingle == YES, тогда все в порядке. это то, что я хотел подтвердить. Что в этом методе: [делегировать на playerdisconnected:идентификатор игрока];

5. Просто «CCLOG (@»onPlayerDisconnected: % @», идентификатор игрока);», чтобы указать, какой проигрыватель отключился. Я обнаружил, что состояние не изменится, если я не нажму кнопку главного меню, а затем вернусь, чтобы начать другое совпадение. Затем вызывается «onPlayerDisconnected» и «onPlayerConnected» вызывается еще раз. Я также использую симулятор и свое устройство для тестирования многопользовательской игры.

Ответ №1:

Джон,

При нажатии кнопки home делегат вашего приложения получит -(void)applicationDidEnterBackground:(UIApplication*)application обратный вызов.

У вас есть примерно 5 секунд (до того, как Springboard завершит работу вашего приложения), чтобы сделать все необходимое для очистки вашего приложения (если вам не нужно больше времени, которое вы можете запросить у iOS, но не гарантировано получите).

Как вы «очищаете»? Как вы упомянули — в вашем матче участвуют 2 игрока, поэтому отключение или выход игрока из игры оказывает одинаковое влияние на игру — ее завершение (при условии, что игрок не может продолжать играть самостоятельно).

Уходящий игрок отправит -disconnect сообщение в GameKit.

Программа, оставленная в проигрывателе, должна иметь объект, соответствующий протоколу GKMatchDelegate, и получать обратные вызовы в качестве делегата GKMatch .

Когда противоположный игрок отключается, GKMatch вызовет делегата с:

 - (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state`
  

Итак, теперь код вашего проигрывателя, который был оставлен без внимания, также будет уведомлен. В этом методе проверьте, происходит ли отключение — и если да, следуйте своей собственной логике для того, что вы хотите, чтобы произошло, когда проигрыватель «зависает».

Комментарии:

1. Я использую Cocos2d, поэтому при нажатии кнопки home игра автоматически приостанавливается. Итак, я добавил в BOOL, чтобы проверить, было ли это в мультиплеере (isMP = ДА, когда сцена заменяется на многопользовательскую и isMP = НЕТ, когда сцена заменяется на одиночную). В applicationWillTerminate и applicationDidEnterBackground я добавил флажок «if (isMP == YES) { // отменить совпадение}», но я не могу выяснить, что вставить между этими скобками, чтобы отменить совпадение и / или удалить стандартный интерфейс match maker. Кажется, я также не могу найти это в документах API. Я знаю, что это, вероятно, всего одна строка кода.

2. Не уверен в варианте использования, но разве это не то, что вы хотите: developer.apple.com/library/ios/#documentation/GameKit /… ?

3. Я попробовал это, и это не отключает игрока и не уведомляет игрока противника о том, что они были отключены, я в тупике.

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

5. Джон — забыл одну важную вещь. В вашей игре могут играть только 2 человека?