Game Center多人对接会问题

时间:2018-12-10 05:33:08

标签: objective-c cocos2d-x game-center

我正在尝试使用Game Center创建实时多人游戏。对于配对,我通过以下代码使用编程方法:

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch *match, NSError *error) {
        if (error)
        {
            // Process the error.
            NSLog(@" error => %@ ", [error userInfo] );

        }
        else if (match != nil)
        {
            NSLog(@"Match Found _-----------");
            currentMatch = match;
            match.delegate = self;

            NSLog(@"Expected player count:%ld",match.expectedPlayerCount);

            if ( match.expectedPlayerCount == 0)
            {
                NSLog(@"Ready to start match!");

            }
        }
    }];

当前,当找到匹配项时,代码会生成以下错误:

ABC-mobile[342:26698] [log]  [ERROR] ReXmitCollectionRequest:640 /BuildRoot/Library/Caches/com.apple.xbs/Sources/AVConference/AVConference-1020.31/ICE.subproj/Sources/ICEMessage.c:640:     ReXmit [SNATMAP_REQUEST] (1:0) from [192.168.0.104:16402] to [17.133.234.32:16384] failed (801A0002)

ABC-mobile[342:26698] [log]  [ERROR] -[GKConnectionInternal internal_setRemoteConnectionData:fromParticipantID:pendingConnectionPIDList:]:1041 GCKSessionPrepareConnection FAILED(80150016)

我正在使用 Cocos2D-X 游戏引擎,并且正在通过 C ++ 函数调用此方法。

对于该主题的任何建议和想法,我将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

解决方案:

使用纯 Objective-C 代码(文件应具有 .m 扩展名,而不是 .mm )。在 Objective-C ++ (扩展名为 .mm 的文件)中编写包装类,以调用这些Game Center方法。

答案 1 :(得分:0)

我绝不建议进行配对以将代码部署在自己的云端基础设施上。我使用AWS lambda + dynamodb组合完成了此任务。 Dynamo db促进了对表键的原子操作。这些键可能是您进行比赛对战的技能设定点。 Firebase云功能+ RealtimeDB(也可以尝试CloudStore。这是Firebase的新产品)是开发配对框架的另一种选择。它不提供键的原子性,但是存在PushKey的另一个概念。也可以。

这两个都是主要的云供应商,因此您不必担心延迟或停机时间。我在Firebase RealtimeDB上从美国建立了我的中心,并从印度建立了中心,我能够在500毫秒内将事件转移到印度的另一位玩家。

这两个都有一定的免费连接/请求限制(我猜Firebase的免费连接数比AWS多。您可能需要检查)。因此,在您的游戏开始真正赚钱之前,您不会在很长时间内招致任何费用。在我的AWS Lambda + DynamoDB组合上,我每天可以进行11k对接,而无需支付任何费用。

最重要的是,这两个都提供了区域中心。因此,当您扩大规模时,可以创建多区域中心。

但是这两个供应商可能都无法在C ++或Objective-C ++上工作。我用Javascript和JAVA开发了模型。也许也支持其他几种语言。您可能要检查一下。