1

私はしばらくの間、独自の GKMatchmaker インターフェイス (GKMatchmakerViewController なし) を実装しようとして苦労してきました。GKMatchDelegate と GKLocalPlayerListener を実装する Ray Wenderlich チュートリアルに書かれている別の GameKitHelper クラスがあります。GKMatchmakerViewController を使用すると、招待とランダム マッチメイキングが問題なく機能しました。ただし、以下に示すように、「findMatchForRequest(... withCompletionHandler:. ..)」。特定の値をテストする println() がいくつかありますが、毎回 match.expectedPlayerCount が 0 に達することはなく、1 のままです。これは、「if matchStarted == false and 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
    }
}

問題が見つかりましたらお知らせください。よろしくお願いいたします。私が現在遊んでいる可能性は 2 つあります: いくつかの異なる方法を使用してその試合に参加する他のデバイスとの 1 つの試合でのみ試合を作成する場所が必要です... または addPlayersToMatch(...) と finishedMatchmaking( ...) メソッドはどこかにあります。前もって感謝します!

4

0 に答える 0