我一直在尝试将我的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类中工作。我被困住了,并试图解决这个问题多年。 谢谢你的帮助。
答案 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)