Конец матча, если нажата домашняя кнопка - PullRequest
2 голосов
/ 30 мая 2011

Как мне завершить матч / отключить игрока-соперника и / или удалить стандартный интерфейс создателя матча (GameKit), если нажать кнопку «Домой» на устройстве? У меня также есть кнопка «Главное меню» на экране, и если она нажата, я хотел бы закончить матч / отключить противника. Я использую 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 && 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 Ответ

3 голосов
/ 30 мая 2011

Джон,

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

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

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

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

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

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

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

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

...