多人游戏的游戏中心回合超时

问题描述

我使用 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...