如何从排行榜中获取用户的分数? - Swift
How to get the user's score from leaderboard? - Swift
我正在开发一款扰乱排行榜和最佳玩家得分的游戏。我希望当他进入应用程序时,它会与他在排行榜中保存的分数同步,但我没有找到任何东西 returns 对我来说很有价值。
我知道怎么定义:
public func setHighScore(score:Int) ->Void {
if (self.localUser.isAuthenticated) {
GKLeaderboard.submitScore(score, context: 0, player: self.localUser, leaderboardIDs: ["lbHighScore"], completionHandler: {error in} )
}
}
我想要的是这样的:
public func getHighScore() ->Int{
if (self.localUser.isAuthenticated) {
return GKLeaderboardScore // <- this is the score svaed on leaderboard as integer
}
return 0
}
经过一番努力,我终于找到了!1
让我们开始吧:
访问游戏中心的方式是异步的,即并行的。为了避免在接收和保存信息时出现错误和“延迟”,我建议保存在 UserDefault
。
因此,当您获取数据时,它将保存在一个全局变量中。一旦你得到它,你不能只 return 值,因为它在 completionHandler
中,其中 return 是 Void
.
要访问用户信息,您需要访问 GKLeaderboard.Entry
class,其中有 .score
方法可以保存排行榜上显示的分数。但是访问此方法的唯一方法是使用标准函数,当用户通过参数传递时,这些函数将 return 此信息。
.
第一步:使用GKLeaderboard.loadLeaderboards
函数访问排行榜。在这个函数中,作为参数:
- 包含将要访问的排行榜 ID 的列表
除了completionHandler
这将return两个实例:
- 排行榜列表
- 错误处理变量(
Error
)
class func loadLeaderboards(
IDs leaderboardIDs: [String]?,
completionHandler: @escaping ([GKLeaderboard]?, Error?) -> Void
)
.
第二步:访问排行榜数据。为此,我们将使用 GKLeaderboard.loadEntries
方法。在其中我们将作为参数传递:
- 我们将访问的用户列表
- 将在排行榜的哪个时期访问
除了completionHandler
这将return两个实例:
- 本地用户的
.Entry
class(正是我想要的)
- 包含
.Entry
class 的列表(如果有多个用户
- 错误处理变量(
Error
)
func loadEntries(
for players: [GKPlayer],
timeScope: GKLeaderboard.TimeScope,
completionHandler: @escaping (GKLeaderboard.Entry?,[GKLeaderboard.Entry]?, Error?) -> Void
)
.
因此,将这两个 classes 混合在一起,获取用户在给定排行榜中的分数的函数是:
// Function that takes information and saves it to UserDefault
func getHighScoreFromLeadboard() ->Void {
// Check if the user is authenticated
if (GKLocalPlayer.local.isAuthenticated) {
// Load the leaderboards that will be accessed
GKLeaderboard.loadLeaderboards(
IDs: ["idLeaderboard"] // Leaderboards'id that will be accessed
) { leaderboards, _ in // completionHandler 01: .loadLeaderboards
// Access the first leaderboard
leaderboards?[0].loadEntries(
for: [GKLocalPlayer.local], // User who will be accessed within the leaderboard, in this case the local user
timeScope: .allTime) // Choose which period of the leaderboard you will access (all time, weekly, daily...)
{ player, _, _ in // completionHandler 02: .loadEntries
// Save on UserDefault
UserDefaults.standard.set(player?.score, forKey: "score")
}
}
}
}
我正在开发一款扰乱排行榜和最佳玩家得分的游戏。我希望当他进入应用程序时,它会与他在排行榜中保存的分数同步,但我没有找到任何东西 returns 对我来说很有价值。
我知道怎么定义:
public func setHighScore(score:Int) ->Void {
if (self.localUser.isAuthenticated) {
GKLeaderboard.submitScore(score, context: 0, player: self.localUser, leaderboardIDs: ["lbHighScore"], completionHandler: {error in} )
}
}
我想要的是这样的:
public func getHighScore() ->Int{
if (self.localUser.isAuthenticated) {
return GKLeaderboardScore // <- this is the score svaed on leaderboard as integer
}
return 0
}
经过一番努力,我终于找到了!1
让我们开始吧:
访问游戏中心的方式是异步的,即并行的。为了避免在接收和保存信息时出现错误和“延迟”,我建议保存在 UserDefault
。
因此,当您获取数据时,它将保存在一个全局变量中。一旦你得到它,你不能只 return 值,因为它在 completionHandler
中,其中 return 是 Void
.
要访问用户信息,您需要访问 GKLeaderboard.Entry
class,其中有 .score
方法可以保存排行榜上显示的分数。但是访问此方法的唯一方法是使用标准函数,当用户通过参数传递时,这些函数将 return 此信息。
.
第一步:使用GKLeaderboard.loadLeaderboards
函数访问排行榜。在这个函数中,作为参数:
- 包含将要访问的排行榜 ID 的列表
除了completionHandler
这将return两个实例:
- 排行榜列表
- 错误处理变量(
Error
)
class func loadLeaderboards(
IDs leaderboardIDs: [String]?,
completionHandler: @escaping ([GKLeaderboard]?, Error?) -> Void
)
.
第二步:访问排行榜数据。为此,我们将使用 GKLeaderboard.loadEntries
方法。在其中我们将作为参数传递:
- 我们将访问的用户列表
- 将在排行榜的哪个时期访问
除了completionHandler
这将return两个实例:
- 本地用户的
.Entry
class(正是我想要的) - 包含
.Entry
class 的列表(如果有多个用户 - 错误处理变量(
Error
)
func loadEntries(
for players: [GKPlayer],
timeScope: GKLeaderboard.TimeScope,
completionHandler: @escaping (GKLeaderboard.Entry?,[GKLeaderboard.Entry]?, Error?) -> Void
)
.
因此,将这两个 classes 混合在一起,获取用户在给定排行榜中的分数的函数是:
// Function that takes information and saves it to UserDefault
func getHighScoreFromLeadboard() ->Void {
// Check if the user is authenticated
if (GKLocalPlayer.local.isAuthenticated) {
// Load the leaderboards that will be accessed
GKLeaderboard.loadLeaderboards(
IDs: ["idLeaderboard"] // Leaderboards'id that will be accessed
) { leaderboards, _ in // completionHandler 01: .loadLeaderboards
// Access the first leaderboard
leaderboards?[0].loadEntries(
for: [GKLocalPlayer.local], // User who will be accessed within the leaderboard, in this case the local user
timeScope: .allTime) // Choose which period of the leaderboard you will access (all time, weekly, daily...)
{ player, _, _ in // completionHandler 02: .loadEntries
// Save on UserDefault
UserDefaults.standard.set(player?.score, forKey: "score")
}
}
}
}