私はしばらくの間、独自の 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( ...) メソッドはどこかにあります。前もって感謝します!