GameKit:谁是大师?

时间:2011-12-22 14:02:31

标签: objective-c ios bluetooth gamekit

我正在构建一个应用程序(顺便说一句,已经在应用程序商店中,名为MotAMot):一个boggle,免费的应用程序。

这个游戏提出了几种游戏模式:使用相同iDevice和MULTI的独立,多玩家,其中2个玩家同时玩同一个游戏板,但每个玩家都使用自己的iDevices。

我正在使用GKPeerPickerController实例来管理2台设备之间的连接。

我唯一关心的是我无法决定谁将扮演服务器角色,谁是客户端。当玩家向另一方发送邀请时,我很酷,我可以决定该玩家将成为服务器。

例如,假设玩家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 个答案:

答案 0 :(得分:2)

为什么你不能用老式的方式解决这个问题?例如,Civilization IV将您带入服务器机房屏幕,在这种情况下,您是等待客户端的服务器,您不接受任何新连接是有意义的。

我会做类似的事情。事实证明this person有一个问题(略有关联)并且在我的理解中它以类似的方式解决了。