创建/加入比赛后GKTurnBasedMatch将第二个玩家状态打印为匹配?

时间:2017-07-01 19:23:25

标签: ios iphone gamekit gkturnbasedmatch

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

 //#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的匹配项?

1 个答案:

答案 0 :(得分:0)

这个答案陈述了上述声明中所讨论的一些非常基本的问题,特别是对于那些将来可能面临类似障碍的人。 首先,非常重要的是, GKTurnBasedMatchs 不会填补匹配参与者阵列中的空位以换取新的比赛,除非您最终轮到你。这就是为什么我在两个设备上创建新匹配时遇到麻烦,但无法与两者匹配。 因此,双方的参与者阵列都打印了我在上述问题中提出的实际问题。它将第一个参与者打印为两个设备的本地播放器。 幸运的是,在读完This Tutorial之后,我发现比赛的创造者必须在轮到结束时辞职,以便为其他寻求者打开比赛。通过这种方式,只有新参与者可以找到您的比赛的空位。

现在在结束你的回合之前,你必须选择参与者进行下一回合,虽然你的match.participants数组将有虚拟参与者,状态为匹配每个和明确null的玩家ID,但你必须假设他们是你比赛的其他球员。

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

在我的情况下,myMatch.endTurnDictionary类型的虚拟数据。

 @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找到下一个玩家后显示,并且可能需要一段时间才能进行实际匹配,但在测试中,只有在您使用不同的{{1帐户。

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

对于玩家2找到一场比赛,这将会发生。当从列表中找到/选择匹配时,将调用Game Centre,匹配数据和完全填充的参与者数组(在我的情况下仅为2)。

turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController,
    didFind match: GKTurnBasedMatch)

这是播放器2的最终输出。 enter image description here