【发布时间】:2011-04-22 13:49:17
【问题描述】:
我只是无法弄清楚这是如何工作的。我想做的是让两个玩家玩一个游戏,如果第三个玩家加入它可以立即加入游戏,如果第四个也是最后一个玩家加入它也可以立即加入游戏。无论出于何种原因,他们也可以随时离开游戏,如果发生这种情况,应该有一个空间可供另一个人或同一个人重新连接。就是这样。
现在我得到的是以下内容。出于显而易见的原因,我对本地播放器进行了身份验证。然后我搜索这样的匹配:
if (matchRequest) [matchRequest release];
matchRequest = [[GKMatchRequest alloc] init];
matchRequest.minPlayers = 2;
matchRequest.maxPlayers = 4;
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) {
if (error) {
// An error occured
} else {
if (matchCurrent) [matchCurrent release];
matchCurrent = [match retain];
matchCurrent.delegate = self;
}
}];
如果我在三个不同的设备上执行此部分,其中两个会找到彼此,而第三个仍在寻找。所以我想在请求的查找匹配找到最小数量的玩家之后,它将被执行一次。所以我需要的是一种使用我保留的 matchCurrent 来添加更多玩家的方法。幸运的是,这种方法存在,但它是如何工作的呢?在这种情况下你什么时候调用它?我决定将它放在一个按钮下,以便在找到匹配项时手动执行它。
我发现,当我在第一台设备上按下它时,第三台设备终于可以找到第一台和第二台设备所在的匹配项。事实上,第二台和第三台设备包含了每个相关设备的播放器ID。这是一件好事。但是有两个问题。
- 哪个设备实际上应该调用 addPlayersToMatch 方法?以及如何将其限制为执行该方法的一个设备?另外,您应该什么时候调用它?
-
为什么在调用该方法的设备上,playerID 没有更新?
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) { //matchCurrent.playerIDs is not updated?! }];实际上它们已更新。当我看到 playerIDs 出现在第二台和第三台设备上时,我手动更新了设备 1 上的 matchCurrent.playerIDs 并且突然它确实识别了播放器。但是,当在设备一上发现新播放器时,甚至不会调用播放器的“didChangeState”。
【问题讨论】:
-
这是基于服务器-客户端模型还是p2p模型?什么用于初始化连接、tcp、udp、http?当前连接的玩家的数据保存在哪里?
-
“如果第三个玩家加入,我想做的是让两个玩家玩一个游戏” - 你可以在你的第二和第三句中添加一些分号和逗号吗?事实上,在连续句子中,很难判断每个 if 子句是否修改了前面或后面的独立子句。