簡體   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