繁体   English   中英

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

[英]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.

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