Swift SpriteKit 游戏中心

Swift SpriteKit Game Center

我一直在尝试根据本网站和其他网站上的大量教程将我的 Game Center 代码拆分成一个助手 class。

这是我目前在 GameViewController.swift

中的内容
func loadGameCenter() {

    var localPlayer = GKLocalPlayer.localPlayer()

    localPlayer.authenticateHandler = {(viewController, error) -> Void in

        if (viewController != nil) {

        self.presentViewController(viewController, 
        animated: true, completion: nil) //POINT 1
        }
        else {
            println((GKLocalPlayer.localPlayer().authenticated))
        }
    }
}

在我的 MenuScene.swift 中,这是一个 SKScene,我有这个代码。

func saveHighScore(highScore:Int) {

    if GKLocalPlayer.localPlayer().authenticated {
        var scoreReporter = GKScore(leaderboardIdentifier: leaderboardID)
        scoreReporter.value = Int64(highScore)

        var scoreArray: [GKScore] = [scoreReporter]
        GKScore.reportScores(scoreArray, withCompletionHandler: {(error : NSError!) -> Void in
            if error != nil {
                println("Error")
            }
        })
    }
}
func showGameCenter() {

    var vc = self.view!.window!.rootViewController! //POINT 2
    var gc = GKGameCenterViewController()
    gc.gameCenterDelegate = self
    gc.viewState = GKGameCenterViewControllerState.Leaderboards
    vc.presentViewController(gc, animated: true, completion: nil)
}
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController!) {

    gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
}

现在我一直在尝试将上面提到的代码放入一个名为 GameCenter.swift 的助手 class 中,它是 NSObject 的子class。我在 class 名称之后写了这篇文章,以便在我的其他场景中可以访问上面提到的方法(根据教程)。

class var sharedInstance: GameCenter {
    struct Static {
        static let instance = GameCenter()
    }
    return Static.instance
}

class func loadGameCenter() {
    GameCenter.sharedInstance.loadGameCenter()
}

class func saveHighScore() {
    GameCenter.sharedInstance.saveHighScore(highScore)
}

class func showLeaderboard() {
    GameCenter.sharedInstance.showLeaderboard()
}

我遇到的问题是,当我尝试从我的 MenuScene.swift 调用某些 class 函数时,例如 "GameCenter.loadGameCenter()" 或 "GameCenter.showLeaderboard() ",它导致我第 1-2 点的问题。

换句话说,我需要如何重写现有的旧代码才能使其在 NSObject class 中工作。我被困住了,多年来一直试图解决这个问题。 感谢您的帮助。

我很久以前也解决了,但只是为了防止有人看到。 我只是将这些功能放在 gameViewController 中以显示登录屏幕或菜单,而不是我之前在 Helper class.

中的功能
func showGameCenterLogin() {

    self.presentViewController(GameCenter.sharedInstance.presentingViewController, animated: true, completion: nil)
}

func showGameCenterMenu() {

    GameCenter.showGameCenterMenu(self, viewState: .Default)

}

并在需要时使用 NSNotificationCenter 调用它们。

为了记录分数,我只是用正确的分数 and/or 排行榜 ID 调用函数来保存它,这很明显,我不记得为什么这会导致我回来。

   GameCenter.sharedInstance.saveHighScore(highScore)