这个答案陈述了上述声明中询问的一些非常基本的问题,特别是针对那些将来可能面临类似障碍的人。首先,非常重要的一点是,GKTurnBasedMatchs不会为新的比赛填满比赛参与者数组中的空白位置,除非你轮到你了。这就是为什么我在两台设备上都创建新匹配但无法同时匹配两者时遇到麻烦的原因。因此,双方的参与者阵列正在打印我在上述问题中实际提出的问题。它正在打印两个设备的第一个参与者作为本地播放器。幸运的是,在阅读了本教程之后,我发现比赛的创建者必须通过结束轮到辞职才能使比赛对其他搜索者开放。这样,只有新参与者才能找到您的比赛的空位。
现在在结束你的回合之前,你必须选择下一回合的参与者,虽然你的match.participants
数组将有虚拟参与者,它们的状态为 match 并且 playerIDs 为 absolute 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
这场比赛,并且在你的对手进一步结束回合之前不允许你玩。![在此处输入图像描述](https://i.stack.imgur.com/3rKT8.png)
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 的最终输出。
![在此处输入图像描述](https://i.stack.imgur.com/gfAHE.png)