With some research, this is what I thought to be the right code. Everything seems to be working and there are NO errors. The first high score uploaded shows on the leaderboard (for both Game Center accounts I am using for testing), but any score uploaded after the initial high score (which should replace it) isn't shown (I have tried using more than one account, same issue). Here is my code (I call for this function when a Button is pressed). Everything loads up fine and the Game Center window closes perfectly with NO errors, but the score for account 1 remains at 0 (which was the first score loaded) while the score for account 2 remains at 2 (which was the first score loaded). (highScore is a saved NSInteger before this function is called) Please help!
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")
}
})
}
}
This code shows the leaderboard:
//show leaderboard screen
func showLeader() {
let vc = self.view?.window?.rootViewController
let gc = GKGameCenterViewController()
gc.gameCenterDelegate = self
vc?.presentViewController(gc, animated: true, completion: nil)
}
This code is what uploads the score (which doesn't seem to be working after the FIRST score is loaded) and displays the leaderboard
let highScoreDefault = NSUserDefaults.standardUserDefaults()
if highScoreDefault.valueForKey("HighScoreSaved") != nil {
highScore = highScoreDefault.valueForKey("HighScoreSaved") as! NSInteger!
[saveHighscore()]
}
[showLeader()]
Try this:
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)")
}
})
}
}
When you want to save the high score, add this code:
self.saveHighScore("yourLeaderboardName", score: GameState.sharedInstance.highScore)
Add this class. 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
}
}
And add this helper class in it's own Swift file. Not sure if it's needed. I call it 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)
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.