说我有一个GKTurnBasedMatch有2个玩家,而第二个玩家在他的回合中被没收。如何向第一个用户显示该游戏已结束?或者也许让第一个玩家以编程方式退出?
另一个GKTurnBasedMatch--这次是12名球员。我不明白这里有什么 - 比如玩家7退出,这意味着当转弯到达他时,它会卡住游戏,我需要以编程方式结束所有用户的比赛?或者GC可能会对其余玩家进行相应的重新编号
提前致谢!
答案 0 :(得分:1)
您需要将以下其中一项发送到GKTurnBasedMatch对象:
- (void)participantQuitInTurnWithOutcome:(GKTurnBasedMatchOutcome)matchOutcome
nextParticipants:(NSArray *)nextParticipants
turnTimeout:(NSTimeInterval)timeout
matchData:(NSData *)matchData
completionHandler:(void (^)(NSError *error))completionHandler
- (void)participantQuitOutOfTurnWithOutcome:(GKTurnBasedMatchOutcome)matchOutcome
withCompletionHandler:(void (^)(NSError *error))completionHandler
调用participantQuitOutOfTurnWithOutcome
会向比赛中的其他玩家发送转弯事件,通知他们玩家已退出。 match.participants中玩家的对象将具有matchOutcome GKTurnBasedMatchOutcomeQuit
答案 1 :(得分:0)
我创建了game kit turn based match example project,说明轮流退出并轮流退出。请查看quit()
文件中的GameModel.swift
函数,了解如何调用这些函数:
func quit(completionHandler: @escaping (Error?) -> Void) {
if isLocalPlayerTurn {
let next = nextParticipants()
let data = NSKeyedArchiver.archivedData(withRootObject: self)
match?.participantQuitInTurn(with: .quit, nextParticipants: next, turnTimeout: 600, match: data) { error in
completionHandler(error)
}
} else {
match?.participantQuitOutOfTurn(with: .quit) { error in
completionHandler(error)
}
}
}
当然,检查某人是否赢了也很重要。以下是此文件中的checkForWin()
函数。
func checkForWin(completionHandler: @escaping (Bool, Error?) -> Void) {
guard let stillPlaying = match?.participants?.filter({ $0.matchOutcome == .none }),
stillPlaying.count == 1,
stillPlaying[0].player?.playerID == currentPlayerID
else {
return completionHandler(false, nil)
}
stillPlaying[0].matchOutcome = .won
let data = NSKeyedArchiver.archivedData(withRootObject: self)
match?.endMatchInTurn(withMatch: data) { error in
print("***** match ended")
completionHandler(true, error)
}
}
所有这些在整个示例项目的上下文中更有意义。我希望它有所帮助。