问题描述
我使用 Swift 和 Game Center 创建了一个回合制多人棋盘游戏,效果非常好。我想添加的最后一项内容是,如果玩家知道自己会输,则可以防止他们在接近尾声时放弃游戏。似乎 endTurn 函数的 turnTimeout 部分是专门为此目的而内置的,但我无法让它工作。我的 endTurn 函数如下:
func endTurn(_ model: GameModel,completion: @escaping CompletionBlock) {
guard let match = currentMatch else {
completion(GameCenterHelperError.matchNotFound)
return
}
do {
let currenParticipantIndex: Int = (match.participants.firstIndex(of: match.currentParticipant!))!
let nextPerson = [match.participants[(currenParticipantIndex+1) % match.participants.count]]
print("end turn,next participant \(String(describing: nextPerson[0].player?.alias))")
match.endTurn(
withNextParticipants: nextPerson,turnTimeout: 15,match: try JSONEncoder().encode(model),completionHandler: completion
)
} catch {completion(error)}
}
这个函数考虑了Anton在这个问题的答案的评论中的建议: Trying to set a time limit on my Game Center game 更新 nextParticipant 玩家的数组,以便永远不会到达数组的末尾。我还试图在我的测试中解决这个问题,让玩家 1 和玩家 2 延迟他们的回合结束,看看它是否会触发(游戏只是一个 2 人游戏)
这也应该回答这个问题: Game Center turn timeouts
文档说:
timeoutDate:玩家在放弃回合之前必须采取行动的时间。你的游戏决定了当一个回合被放弃时会发生什么。对于某些比赛,弃权的回合可能会结束比赛。对于其他游戏,您可以为玩家选择一组合理的默认操作,或者干脆什么都不做。 https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/GameKit_Guide/ImplementingaTurn-BasedMatch/ImplementingaTurn-BasedMatch.html
不幸的是,我根本无法启动 turnTimeout 函数。我做了大量的研究,但我没有找到明确的答案来说明当它触发时实际调用的是什么函数(即玩家需要比分配的时间更长的时间来轮到他们)。我希望调用与 endTurn 函数的常规调用相同的函数超时,并调用以下播放器侦听器:
func player(_ player: GKPlayer,receivedTurnEventFor match: GKTurnBasedMatch,didBecomeActive: Bool) {
if let vc = currentMatchmakerVC {
currentMatchmakerVC = nil
vc.dismiss(animated: true)
}
print("received turn event")
if !didBecomeActive {
print("\n\n\n player listener did become active")
print("match did change")
NotificationCenter.default.post(name: .matchDidChange,object: match)
} else if didBecomeActive {
print("present game")
NotificationCenter.default.post(name: .presentGame,object: match)
}
}
当从游戏中特别调用 endTurn 时,我能够让玩家侦听器(接收到的转弯事件)触发,但我没有看到在 turnTimeout 事件触发时调用的任何内容。如果是播放器监听器,我会在控制台中看到打印语句以及下一个播放器设备上的通知。
GKTurnTimeoutDefault 是 604,800 并且是一个时间间隔,我对它进行了一些研究并得出结论,它以秒为单位,即 7 天。我将其更改为 0.00001、15、2000 以及介于两者之间的一些值,但我无法启动它。
我也找到了下面的,但第一个没有答案,第二个只说转弯超时可能需要它自己的完整答案:
Game Center Turnbased Game turn timeout
How to detect when Game Center turn based match has ended in iOS9?
我想我的错误可能是我无法找到回合超时触发时调用的函数,尽管我也可能对我输入的时间间隔值有误。>
感谢您花时间查看我的问题:)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)