我一直在努力尝试实现我自己的 GKMatchmaker 接口(没有 GKMatchmakerViewController)。我有一个单独的 GameKitHelper 类,如 Ray Wenderlich 教程中所写,它实现了 GKMatchDelegate 和 GKLocalPlayerListener。当我使用 GKMatchmakerViewController 时,我的邀请和随机匹配工作完美无缺。但是,我尝试切换到我自己的视图控制器,该控制器通过单击按钮触发“findMatchWithminPlayers(....)”,如下所示,它创建了一个共享的 GKMatchmaker 来执行“findMatchForRequest(... withCompletionHandler:. ..)”。我有几个 println()s 测试某些值,但每次 match.expectedPlayerCount 永远不会达到 0,只是停留在 1。这意味着“如果 matchStarted == false 和 match.expectedPlayersCount == 0” 永远不会满足,并且永远不会调用/匹配的 lookupPlayers() 方法无法启动。这是通过单击按钮调用的第一个方法:
func findMatchWithDetails(minPlayers: Int, maxPlayers: Int, playerGroup: Int, delegate: GameKitHelperDelegate) {
if enableGameCenter == false {
println("dont want to be in here")
return
}
matchStarted = false
gkMatch = nil
gkDelegate = delegate
var request = GKMatchRequest()
request.minPlayers = 2
request.maxPlayers = 2
request.defaultNumberOfPlayers = 2
request.playerGroup = 0
println(request)
let matchMaker = GKMatchmaker.sharedMatchmaker()
println(matchMaker)
matchMaker.findMatchForRequest(request, withCompletionHandler: { (match: GKMatch!, error: NSError!) -> Void in
if error != nil {
println("matchmaking canceled")
return
}
self.gkMatch = match
self.gkMatch?.delegate = self
println(match.expectedPlayerCount)
println(match)
if self.matchStarted == false && match.expectedPlayerCount == 0 {
println("in here")
self.lookupPlayers()
matchMaker.finishMatchmakingForMatch(self.gkMatch!)
}
})
}
这是 GKMatchDelegate 的玩家状态更改方法,当玩家连接时应该调用它:
func match(match: GKMatch, playerID: String, didChangeState state: GKPlayerConnectionState) {
if gkMatch != match {
println("definitely dont want to be in here")
return
}
println("there was a state change")
switch(state) {
case GKPlayerConnectionState.StateConnected:
if matchStarted == false && match.expectedPlayerCount == 0 {
println("in connected")
self.lookupPlayers()
}
break
case GKPlayerConnectionState.StateDisconnected:
println("maybe in disconnected")
matchStarted = false
gkDelegate?.matchEnded()
break
default:
break
}
}
如果您能找到问题,请告诉我,我将不胜感激。我目前正在玩两种可能性:我需要在某个地方仅在一场比赛中创建一场比赛,而另一台设备使用几种不同的方法加入该比赛......或者我需要实现 addPlayersToMatch(...) 和 finishedMatchmaking( ...) 某处的方法。提前致谢!