Я создаю приложение (кстати, уже в магазине приложений под названием 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;
}
}
У кого-нибудь есть идеи по этому поводу?