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)
我一直在尝试根据本网站和其他网站上的大量教程将我的 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)