GKTurnBasedMatch创建/加入一个匹配后打印第二个球员状态为匹配?

问题描述:

通过使用GKTurnbaseMatch默认配对方案,我可以连接到匹配。我也可以通过编程和使用默认视图控制器来创建新的匹配。我还可以通过编程方式和默认视图控制器找到在Game Center中创建本地用户的匹配列表。 但总是有人提到我,因为我没有跟下一个参与者打电话。 1.匹配连接后,didFindMatch被调用,并且接收到的匹配对象不会打印预期的第二个玩家的ID,而它会将该玩家的状态打印为“匹配”。GKTurnBasedMatch创建/加入一个匹配后打印第二个球员状态为匹配?

//#3 
func turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController, 
didFind match: GKTurnBasedMatch) 
{ 
    print(match) 
    match.loadMatchData { (d, e) in 

     print(d) 
     print(e) 

    } 


    self.dismiss(animated: true, completion: nil) 
    //performSegue(withIdentifier: "GamePlayScene", sender: match) 
} 

该匹配打印如下。

[ 
<GKTurnBasedParticipant 0x60000000c430 - playerID:G:25153527799 (local player) status:Active matchOutcome:None lastTurnDate:(null) timeoutDate:(null)>, 
<GKTurnBasedParticipant 0x60000000cd50 - playerID:(null) status:Matching matchOutcome:None lastTurnDate:(null) timeoutDate:(null)> 

]

我怎么能连接两个球员。

  1. 我可以找到本地玩家创建的所有匹配,有什么方法可以查找任何人在游戏中心创建的空匹配列表。

  2. 如何使用匹配ID加入比赛?

这个答案国家一些很基本的问题,如在上面的语句被传讯,专门为那些谁可能在未来面临类似的障碍。 首先,它非常重要,GKTurnBasedMatchs不会填满比赛参与者阵列中的空白位置以进行新的比赛,除非您最终轮到您。这就是为什么我在两台设备上创建新匹配时遇到麻烦的原因,但无法匹配两者。 因此,双方的参与者阵列正在打印我在上述问题中实际询问的内容。它将两名设备的本地播放器打印为第一名参与者。 幸运的是,在读出This Tutorial后,我发现比赛的创造者必须通过结束轮到辞职才能让其他求职者打开比赛。通过这种方式,只有新的参赛者可以找到你的比赛的空位。

现在结束轮到你之前,你必须选择为下一回合的参与者,虽然你match.participants阵列将与状态为每个匹配和绝对null playerIDs虚拟参与者,但你必须承担起他们与其他你比赛的球员。

因此,您必须将下一个参与者分配给您放入回合的数组的索引0。您还必须首次创建一个新的数据对象与您的匹配状态,因为在此之前还会有匹配数据null

这里是myMatch.endTurn在我的情况下,虚拟数据为Dictionary类型。

@IBAction func endMyTurn(_ sender: Any) { 

    // This is sincerely for Ending Turn 
    var dictionaryExample = [String:Any]() 
    dictionaryExample = ["name": "Asim", "value": 2] 



    let dataToSend: Data = NSKeyedArchiver.archivedData(withRootObject: dictionaryExample) 



    if (myMatch?.participants?.count)! > 0 
    { 

     // Match is started 
     var pArray : [GKTurnBasedParticipant] = myMatch!.participants! 
     let currenParticipantIndex : Int = (myMatch!.participants?.index(of: myMatch!.currentParticipant!))! 

     pArray.remove(at: currenParticipantIndex) 

     let currentParticipant = myMatch?.currentParticipant 
     pArray.append(currentParticipant!) 

     myMatch?.endTurn(withNextParticipants: pArray, turnTimeout: GKTurnTimeoutDefault, match: dataToSend, completionHandler: { (e) in 
      print(e ?? "No Error:") 
     }) 

    } 
    else 
    { 
     // No Match 


    } 





} 

现在结束轮到你之后,首次您查找匹配就会开始显示Their Turn这场比赛,不会让你玩,直到你的对手进一步端圈。 enter image description here

Asim K.是分配给您比赛的空位的其他玩家。

注意:这将显示由Game Centre找出未来的球员后,可能需要一段时间在真正的比赛,但在测试中,如果你有不同的Game Centre帐户测试您的应用程序将只发生。

**注意:这将保持原样,直到下一位玩家不会轮到他/她。 **

对于玩家2找到一个匹配,这会发生。 turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController, didFind match: GKTurnBasedMatch)将在匹配被发现/从列表中选择时调用,匹配数据和完全填充的参与者数组(在我的情况下只有2个)。

//#3 
func turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController, 
didFind match: GKTurnBasedMatch) 
{ 
    print(match) 
    myMatch = match 
    match.loadMatchData { (d, e) in 

     print(d ?? "No Data:") 
     let recievedData: [String: Any] = (NSKeyedUnarchiver.unarchiveObject(with: d!) as? [String : Any])! 


     // Check if data contains : "name" .. "value" 
     if recievedData["name"] != nil && recievedData["value"] != nil 
     { 

      let name = recievedData["name"] as! String 
      let val = recievedData["value"] as! Int 

      print("First Item: \(name)") 
      print("Second Item: \(val)") 

     } 


     print(e ?? "No Error:") 

    } 


    self.dismiss(animated: true, completion: nil) 
    //performSegue(withIdentifier: "GamePlayScene", sender: match) 
} 

这是玩家2的情况下的最终输出。 enter image description here