【发布时间】:2016-08-25 15:37:18
【问题描述】:
我对 Swift 很陌生,在我的游戏中实现排行榜时遇到了一些麻烦。我刚刚看了一个教程:'Game Center 排行榜! (Xcode 中的 Swift 2)',其中 GameCenter 信息全部通过应用程序的一个视图。在我的游戏中,我希望用户能够玩游戏,然后只有当他们在特定的SKScene 上时,他们才能访问 GameCenter。
例如,在GameOverScene 上,他们将通过用户身份验证,并且还能够上传他们的高分。我想我还遗漏了GameViewController(所有教程逻辑所在的位置)与我制作的众多场景之一之间的一些差异。
这是我尝试在GameOverScene 上使用GKGameCenterControllerDelegate 并创建各种功能以访问GameCenter 的代码。当用户在视图中点击某个标签时进行调用:(这显然不起作用,因为我试图访问这样的行上的场景:self.presentViewController(view!, animated:true, completion: nil)
class GameOverScene: SKScene, GKGameCenterControllerDelegate {
init(size: CGSize, theScore:Int) {
score = theScore
super.init(size: size)
}
...
override func didMoveToView(view: SKView) {
authPlayer()
leaderboardLabel.text = "Tap for Leaderboard"
leaderboardLabel.fontSize = 12
leaderboardLabel.fontColor = SKColor.redColor()
leaderboardLabel.position = CGPoint(x: size.width*0.85, y: size.height*0.1)
addChild(leaderboardLabel)
...
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch : AnyObject in touches {
let location = touch.locationInNode(self)
if(CGRectContainsPoint(leaderBoardLabel.frame, location)){
saveHighScore(score)
showLeaderBoard()
}
}
}
func authPlayer(){
//Create a play
let localPlayer = GKLocalPlayer.localPlayer()
//See if signed in or not
localPlayer.authenticateHandler = {
//A view controller and an error handler
(view,error) in
//If there is a view to work with
if view != nil {
self.presentViewController(view!, animated:true, completion: nil) //we dont want a completion handler
}
else{
print(GKLocalPlayer.localPlayer().authenticated)
}
}
}
//Call this when ur highscore should be saved
func saveHighScore(number:Int){
if(GKLocalPlayer.localPlayer().authenticated){
let scoreReporter = GKScore(leaderboardIdentifier: "scoreBoard")
scoreReporter.value = Int64(number)
let scoreArray: [GKScore] = [scoreReporter]
GKScore.reportScores(scoreArray, withCompletionHandler: nil)
}
}
func showLeaderBoard(){
let viewController = self.view.window?.rootViewController
let gcvc = GKGameCenterViewController()
gcvc.gameCenterDelegate = self
viewController?.presentViewController(gcvc, animated: true, completion: nil)
}
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController) {
gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
}
任何关于如何解决此问题的建议都会很棒,我认为我可能会将整个场景/视图控制器弄混并导致问题。谢谢!
【问题讨论】:
-
我很困惑..问题到底出在哪里?您是否在进入 GameOver 场景时遇到问题,或者在加载高分时遇到问题,或者两者兼而有之? @Sam,如果这是 Jared 的代码,那么我猜它可以编译,,,我无法测试它,因为你有一些剪掉它出现
-
@fluidity 这是 Jared 的代码。如果有帮助,我将添加剩余的代码,我的问题是我认为我不完全理解在
GameViewController中加载和存储 GameCenter 信息(就像在 Jared 的单视图教程中一样)和放置逻辑之间的区别在众多SKScene之一。除非这必须通过GameViewController并且管理所有场景?最终,当用户在给定场景 (GameOverScene) 中点击标签时,我会尝试保存和检索 GC 数据。 -
好的,我几乎和你在一起(我还没有使用过 GC)。如果您的
GameViewController中有 GC 代码,那么您也需要发布它。我认为这可能只是一个范围问题,但如果您将函数正确放入标签中,它应该可以工作。 -
我现在去看视频,如果你能把你所有的代码贴出来#^^
-
我下载了他的项目,现在正在为你做一些事情。确保 iTunes 中的所有步骤都已连接
标签: swift sprite-kit gamekit game-center-leaderboard