Swift SpriteKit游戏中心

时间:2015-06-18 22:09:16

标签: swift ios8

我一直在尝试将我的Game Center代码拆分为帮助类,如本网站和其他网站上的众多教程。

这是我目前在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的助手类中,该类是NSObject的子类。我在类名之后写了这个,以便在我的其他场景中可以访问上面提到的方法(根据教程)。

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调用某些类函数时,例如" GameCenter.loadGameCenter()"或者" GameCenter.showLeaderboard()",它在POINT 1-2引起了我的问题。

换句话说,我如何重写旧的现有代码以使其在NSObject类中工作。我被困住了,并试图解决这个问题多年。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我很久以前也解决了,但只是因为有人看到这个。 我只是将这些函数放在gameViewController中,以显示Login屏幕或Menu,而不是我之前在Helper类中的内容。

func showGameCenterLogin() {

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

func showGameCenterMenu() {

    GameCenter.showGameCenterMenu(self, viewState: .Default)

}

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

要记录分数,我只需使用相关分数和/或排行榜ID来调用该功能以保存它,这很明显,我不记得为什么这会导致我的问题。

   GameCenter.sharedInstance.saveHighScore(highScore)