GameKit: кто мастер? - PullRequest
       8

GameKit: кто мастер?

2 голосов
/ 22 декабря 2011

Я создаю приложение (кстати, уже в магазине приложений под названием MotAMot): офигенное бесплатное приложение.

В этой игре предлагается несколько режимов игры: автономный, несколько игроков, использующих один и тот же iDevice, и MULTI, в котором 2 игрока одновременно играют на одной игровой доске, но каждый из них использует свои собственные iDevices.

Я использую экземпляр GKPeerPickerController для управления соединением между двумя устройствами.

Меня беспокоит только то, что я не могу решить, кто из iPhone будет играть роль сервера, а кто клиент. Когда игрок отправляет приглашение другому, это круто, я могу решить, что этот игрок будет сервером.

Скажем, например, что игрок 1 приглашает игрока 2 присоединиться к игре. Но в то же время (или через несколько секунд) игрок 2 приглашает игрока 1, прежде чем он отобразит всплывающее окно с приглашением, отображаемое на его устройстве. Мой вопрос: как я могу быть уверен, что игрок 1 пригласил игрока 2 первым (или наоборот)? Я имею в виду, конечно, я получил несколько обратных вызовов, потому что я реализую протокол GKPeerPickerControllerDelegate. Но кажется, что я получаю одинаковые сообщения на обоих устройствах, независимо от того, кто на самом деле инициирует соединение.

// New connection
- (void)peerPickerController:(GKPeerPickerController *)picker
          didConnectPeer:(NSString *)peer
               toSession:(GKSession *)session
{
    // Set the session
    [self setCurrentSession:session];

    // I'm implementing the GKSessionDelegate protocol
    [session setDelegate:self];

// I'll handle any received data from my enemy
    [session setDataReceiveHandler:self withContext:nil];

// I'm cleaning the room
    [myPicker setDelegate:nil];
    [myPicker dismiss];
    [myPicker autorelease];
    myPicker = nil;
}


// A peer changed its state
- (void)session:(GKSession *)session peer:(NSString *)peer didChangeState:    (GKPeerConnectionState)state
{
    switch (state)
    {
        case GKPeerStateConnected:
            [self peerConnected:peer];
            break;
         case GKPeerStateDisconnected:
            // Libération de la session
            [currentSession release];
            currentSession = nil;            
            break;
        case GKPeerStateAvailable:
            break;
        case GKPeerStateConnecting:
             break;
        case GKPeerStateUnavailable:
             break;
    }
}

У кого-нибудь есть идеи по этому поводу?

1 Ответ

2 голосов
/ 22 декабря 2011

Почему вы не можете решить это по старинке? Например, в Civilization IV вы попадаете на экран серверной комнаты, и в этом случае вы являетесь сервером, ожидающим клиентов, и для вас имеет смысл не принимать никаких новых подключений.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...