1

我一直在努力尝试实现我自己的 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( ...) 某处的方法。提前致谢!

4

0 回答 0