我创建了一个测试应用程序来测试将Game Center排行榜添加到我正在创建的一个简单的SwiftUI游戏中。我一直无法弄清楚如何显示Game Center排行榜上的所有分数。
我创建了一个包含Game Center所有功能的类(验证和给排行榜添加分数。这是从主ContentView视图调用的。我不知道如何让它显示排行榜(如果玩家还没有登录,甚至是游戏中心登录屏幕)。
这是我的GameCenterManager类:
class GameCenterManager {
var gcEnabled = Bool() // Check if the user has Game Center enabled
var gcDefaultLeaderBoard = String() // Check the default leaderboardID
var score = 0
let LEADERBOARD_ID = "grp.colorMatcherLeaderBoard_1" //Leaderboard ID from Itunes Connect
// MARK: - AUTHENTICATE LOCAL PLAYER
func authenticateLocalPlayer() {
let localPlayer: GKLocalPlayer = GKLocalPlayer.local
localPlayer.authenticateHandler = {(ViewController, error) -> Void in
if((ViewController) != nil) {
print("User is not logged into game center")
} else if (localPlayer.isAuthenticated) {
// 2. Player is already authenticated & logged in, load game center
self.gcEnabled = true
// Get the default leaderboard ID
localPlayer.loadDefaultLeaderboardIdentifier(completionHandler: { (leaderboardIdentifer, error) in
if error != nil { print(error ?? "error1")
} else { self.gcDefaultLeaderBoard = leaderboardIdentifer! }
})
print("Adding GameCenter user was a success")
} else {
// 3. Game center is not enabled on the users device
self.gcEnabled = false
print("Local player could not be authenticated!")
print(error ?? "error2")
}
}
} //authenticateLocalPlayer()
func submitScoreToGC(_ score: Int){
let bestScoreInt = GKScore(leaderboardIdentifier: LEADERBOARD_ID)
bestScoreInt.value = Int64(score)
GKScore.report([bestScoreInt]) { (error) in
if error != nil {
print(error!.localizedDescription)
} else {
print("Best Score submitted to your Leaderboard!")
}
}
}//submitScoreToGc()
}
下面是ContentView结构:
struct ContentView: View {
//GameCenter
init() {
self.gameCenter = GameCenterManager()
self.gameCenter.authenticateLocalPlayer()
}
@State var score = 0
var gcEnabled = Bool() //Checks if the user had enabled GameCenter
var gcDefaultLeaderboard = String() //Checks the default leaderboard ID
let gameCenter: GameCenterManager
/*End GameCenter Variables */
var body: some View {
HStack {
Text("Hello, world!")
Button(action: {
self.score += 1
print("Score increased by 10. It is now \(self.score)")
self.gameCenter.submitScoreToGC(self.score)
}) {
Text("Increase Score")
}
}
}
}
非常感谢任何帮助解决这个问题。
3条答案
按热度按时间oewdyzsn1#
我有一个固定。
我在我的SwiftUI应用程序Sound Matcher中成功地使用了Game Center。代码片段如下。
代码并没有完全遵循SwiftUI的声明性理念,但它运行得很好。我向SceneDelegate和ContentView添加了代码片段,并使用了一个GameKitHelper类,类似于托马斯为他的测试应用创建的类。我的版本基于我在raywenderlich.com上找到的代码。
实际上我第一次尝试使用符合UIViewControllerRepresentable的结构体,遵循与bg2b相同的思路,但它一直抱怨游戏中心视图控制器需要模态呈现。最终我放弃了,并尝试了目前更成功的方法。
适用于SwiftUI 1.0和iOS 13
更新:对于SwiftUI 2.0和iOS 14,代码更容易
oo7oh9g92#
在此为您提供部分答案。如果设备(或模拟器)已登录iCloud并且已在设置中启用GameCenter,我可以下载排行榜分数并在SwiftUI列表中显示它们。如果不是这样,我没有尝试显示gameCenter身份验证视图控制器。
感谢您的问题中的代码。我使用了您的GameCenterManager(),但将其放在了我的AppDelegate中:
下面是我的ShowRankings。swift SwiftUI视图。我能够成功地验证并获得分数。但我仍然有“异常”。我第一次运行这个(在模拟器中)我收到预期的“User is not logged into Game Center”(用户未登录到游戏中心)错误,指示您的GameCenterManager中的ViewController不是零(我甚至从来没有尝试过显示它)。但是我能够成功地获得分数并将它们显示在列表中。
utugiqy63#
另一种解决方案是为GameCenter创建一个UIViewControllerRepresentable,它需要一个排行榜ID来打开。这使得打开特定排行榜变得简单。
要使用,只需在需要显示排行榜的位置添加以下。