![](/img/trans.png)
[英]How to get high score to submit/reportt to Game Center Leaderboard?
[英]Need help to fix my code when uploading a High Score to a Game Center leaderboard in iOS
經過研究,我認為這是正確的代碼。 一切似乎都正常, 沒有錯誤。 上榜的第一個高分顯示在排行榜上(針對我用於測試的兩個Game Center帳戶),但未顯示在初始高分(應替換為高分)之后上載的任何分數(我嘗試使用多個帳戶,同樣的問題)。 這是我的代碼(按下按鈕時我需要此功能)。 一切正常,Game Center窗口完美關閉,沒有錯誤,但是帳戶1的得分保持為0(這是加載的第一個分數),而帳戶2的得分仍然為2(加載的第一個分數)。 (highScore是在調用此函數之前已保存的NSInteger),請幫助!
func saveHighscore() {
//check if user is signed in
if GKLocalPlayer.localPlayer().authenticated {
let gameScoreReporter = GKScore(leaderboardIdentifier: "color_runner_leaderboard")
gameScoreReporter.value = Int64(highScore)
let scoreArray1: [GKScore] = [gameScoreReporter]
GKScore.reportScores(scoreArray1, withCompletionHandler: {(NSError) -> Void in
if NSError != nil {
print(NSError!.localizedDescription)
} else {
print("completed Easy")
}
})
}
}
此代碼顯示了頁首橫幅:
//show leaderboard screen
func showLeader() {
let vc = self.view?.window?.rootViewController
let gc = GKGameCenterViewController()
gc.gameCenterDelegate = self
vc?.presentViewController(gc, animated: true, completion: nil)
}
這段代碼是上傳分數(加載FIRST分數后似乎不起作用)並顯示排行榜的代碼
let highScoreDefault = NSUserDefaults.standardUserDefaults()
if highScoreDefault.valueForKey("HighScoreSaved") != nil {
highScore = highScoreDefault.valueForKey("HighScoreSaved") as! NSInteger!
[saveHighscore()]
}
[showLeader()]
嘗試這個:
func saveHighScore(identifier: String, score: Int) {
if (GKLocalPlayer.localPlayer().authenticated) {
let scoreReporter = GKScore(leaderboardIdentifier: identifier)
scoreReporter.value = Int64(score)
let scoreArray:[GKScore] = [scoreReporter]
GKScore.reportScores(scoreArray, withCompletionHandler: {
error -> Void in
if (error != nil) {
print("error")
}
else {
print("Posted score of \(score)")
}
})
}
}
要保存高分時,請添加以下代碼:
self.saveHighScore("yourLeaderboardName", score: GameState.sharedInstance.highScore)
添加此類。 GameState.swift:
import Foundation
class GameState {
var score: Int
var highScore: Int
var coins: Int
init() {
// Init
score = 0
highScore = 0
coins = 0
// Load game state
let defaults = NSUserDefaults.standardUserDefaults()
highScore = defaults.integerForKey("highScore")
coins = defaults.integerForKey("coins")
}
func saveState() {
// Update highScore if the current score is greater
highScore = max(score, highScore)
// Store in user defaults
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setInteger(highScore, forKey: "highScore")
defaults.setInteger(coins, forKey: "coins")
NSUserDefaults.standardUserDefaults().synchronize()
}
class var sharedInstance: GameState {
struct Singleton {
static let instance = GameState()
}
return Singleton.instance
}
}
並在自己的Swift文件中添加此幫助器類。 不知道是否需要。 我稱它為GameKitHelper.swift:
import UIKit
import Foundation
import GameKit
let PresentAuthenticationViewController = "PresentAuthenticationViewController"
class GameKitHelper: NSObject {
static let sharedInstance = GameKitHelper()
var authenticationViewController: UIViewController?
var gameCenterEnabled = false
func authenticateLocalPlayer() {
//1
let localPlayer = GKLocalPlayer()
localPlayer.authenticateHandler = {(viewController, error) in
if viewController != nil {
//2
self.authenticationViewController = viewController
NSNotificationCenter.defaultCenter().postNotificationName(PresentAuthenticationViewController, object: self)
} else if error == nil {
//3
self.gameCenterEnabled = true
}
}
}
func reportAchievements(achievements: [GKAchievement], errorHandler: ((NSError?)->Void)? = nil) {
guard gameCenterEnabled else {
return
}
GKAchievement.reportAchievements(achievements, withCompletionHandler: errorHandler)
}
func showGKGameCenterViewController(viewController: UIViewController) {
guard gameCenterEnabled else {
return
}
//1
let gameCenterViewController = GKGameCenterViewController()
//2
gameCenterViewController.gameCenterDelegate = self
//3
viewController.presentViewController(gameCenterViewController, animated: true, completion: nil)
}
func saveHighScore(identifier: String, score: Int) {
if (GKLocalPlayer.localPlayer().authenticated) {
let scoreReporter = GKScore(leaderboardIdentifier: identifier)
scoreReporter.value = Int64(score)
let scoreArray:[GKScore] = [scoreReporter]
GKScore.reportScores(scoreArray, withCompletionHandler: {
error -> Void in
if (error != nil) {
print("error")
}
else {
print("Posted score of \(score)")
}
})
}
}
}
extension GameKitHelper: GKGameCenterControllerDelegate {
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController) {
gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.