简体   繁体   English

将高分上传到iOS中的Game Center排行榜时需要帮助修复我的代码

[英]Need help to fix my code when uploading a High Score to a Game Center leaderboard in iOS

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). 上榜的第一个高分显示在排行榜上(针对我用于测试的两个Game Center帐户),但未显示在初始高分(应替换为高分)之后上载的任何分数(我尝试使用多个帐户,同样的问题)。 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). 一切正常,Game Center窗口完美关闭,没有错误,但是帐户1的得分保持为0(这是加载的第一个分数),而帐户2的得分仍然为2(加载的第一个分数)。 (highScore is a saved NSInteger before this function is called) Please help! (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")
                }

            })

        }

    }

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 这段代码是上传分数(加载FIRST分数后似乎不起作用)并显示排行榜的代码

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: 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. 并在自己的Swift文件中添加此帮助器类。 Not sure if it's needed. 不知道是否需要。 I call it GameKitHelper.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM