creating/joining 一场比赛后 GKTurnBasedMatch 将第二个玩家状态打印为匹配?

GKTurnBasedMatch after creating/joining a match prints 2nd player status as matching?

通过使用 GKTurnbaseMatch 默认匹配场景,我能够连接到匹配项。我还可以通过编程方式和使用默认视图控制器来创建新的匹配项。我还可以找到以编程方式和使用默认视图控制器在游戏中心创建本地用户的匹配项列表。 但是总是提到轮到我了,因为我还没有叫下一个参与者结束轮次。 1. 匹配连接后,didFindMatch 被调用,接收到的匹配对象没有打印预期的第二个玩家的ID,而是打印该玩家的状态为'matching'。

 //#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 之后,我发现比赛的创建者必须通过结束轮次而辞职,才能让比赛对其他寻求者开放。这样,只有新参与者才能找到您的比赛的空位。

现在,在结束你的回合之前,你必须 select 参与下一回合,尽管你的 match.participants 数组将有虚拟参与者,其状态与每个参与者和玩家 ID 肯定 null,但你必须假设他们是你比赛的其他球员。

因此,您必须将下一位参与者分配给您在结束回合时放入的数组的索引 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,并且直到你的对手结束回合才会让你继续比赛。

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

注意:这将在 Game Centre 找到下一个玩家后显示,在真实比赛中可能需要一段时间,但在测试中只有当您测试您的应用程序时才会发生不同 Game Centre 帐户。

**注意:这将保持原样,直到下一个玩家不会 his/her 转弯。 **

如果玩家 2 找到匹配项,就会发生这种情况。 turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController, didFind match: GKTurnBasedMatch) 将在匹配项来自列表 found/selected 时调用,包含匹配数据和完全填充的参与者数组(在我的例子中只有 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 案例的最终输出。