2015-08-23 2 views
0

Я сделал игру, используя SpriteKit и Xcode 7 beta. Я попытался добавить GameCenter и Leaderboard, но проблема в том, что оценка в таблице лидеров не изменится (HighScore не загружается в GameCenter), он остается 0 все время, и я не знаю, как это исправить. Я использую 2 различных файлов: GameViewController.swift и PointsLabel.swiftКак правильно установить GameCenter на приложение?

GameViewController.swift:

import GameKit 

class GameViewController: UIViewController,UIGestureRecognizerDelegate, GKGameCenterControllerDelegate { 

var score: PointsLabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //initiate gamecenter 
func authenticateLocalPlayer(){ 

    let localPlayer = GKLocalPlayer.localPlayer() 

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

     if (GameViewController != nil) { 
      self.presentViewController(GameViewController!, animated: true, completion: nil) 
     } 

     else { 
      print((GKLocalPlayer.localPlayer().authenticated)) 
     } 
    } 
    } 
} 

@IBAction func leaderboard(sender: UIButton) { 
    saveHighscore(score) 
    showLeader() 
} 


//send high score to leaderboard 
func saveHighscore(score:Int) { 

    //check if user is signed in 
    if GKLocalPlayer.localPlayer().authenticated { 

     let scoreReporter = GKScore(leaderboardIdentifier: "Leaderboard_01") 

     scoreReporter.value = Int64(score) 

     let scoreArray: [GKScore] = [scoreReporter] 

     GKScore.reportScores(scoreArray, withCompletionHandler: {error -> Void in 
      if error != nil { 
       print("error") 
      } 
     }) 
    } 
} 


    //shows leaderboard screen 
    func showLeader() { 
     let vc = self.view?.window?.rootViewController 
     let gc = GKGameCenterViewController() 
     gc.gameCenterDelegate = self 
     vc?.presentViewController(gc, animated: true, completion: nil) 
    } 
} 

//hides leaderboard screen 
func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController) 
{ 
    gameCenterViewController.dismissViewControllerAnimated(true, completion: nil) 

} 

Существует ошибка в этом файле:

Cannot invoke 'saveHighscore' with an argument list of type '(PointsLabel!)'

на код:

@IBAction func leaderboard(sender: UIButton) { 
    saveHighscore(score) //<- Here is Error 
    showLeader() 
} 

PointsLabel.swift:

import Foundation 
import UIKit 
import SpriteKit 

class PointsLabel: SKLabelNode { 

var score:Int = 0 

init(num: Int) { 
    super.init() 

    fontColor = UIColor.blackColor() 
    fontSize = 30.0 

    score = num 
    text = "\(num)" 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

func increment() { 
    score++ 
    text = "\(score)" 
} 

func setTo(num: Int) { 
    self.score = num 
    text = "\(self.score)" 
} 
} 

Я не знаю, как это исправить!

+0

Ваша переменная 'score' имеет тип' PointsLabel', но функция 'saveHighscore' ожидает' Int' как параметр. – Moritz

+0

Итак, как мне нужно вызвать класс PointsLabel.swift в классе GameViewController.swift, потому что, пока я показываю по вопросу, находится в классе PointsLabel.swift и есть как Int? – Emm

ответ

1

Ваша score переменная имеет тип PointsLabel, но ваш saveHighscore функция ожидает Int как параметр.

Глядя на ваш код, переменная score будет экземпляром PointsLabel, так что я думаю, вы могли бы использовать score свойство вашего инстанциирован класса, который является Int (тот факт, что вы использовали «счет» в качестве названия для обоих переменные запутывают. Я предлагаю изменить имена, чтобы сделать их более явными.).

@IBAction func leaderboard(sender: UIButton) { 
    saveHighscore(score.score) 
    showLeader() 
} 
+0

Я сделал так, как вы сказали, я запустил симулятор, и когда я нажимаю кнопку в таблице лидеров, симулятор останавливается и обнаруживает ошибку на том же коде: Неустранимая ошибка: неожиданно найден нуль при развертывании Необязательное значение – Emm

+0

Ну, это, вероятно, потому, что 'score' является nil, и он выходит из строя, потому что вы объявили его как неявно развернутый необязательный. Дайте ему значение, и это сработает. // Я дал вам объяснение и решение конкретной проблемы, заданной вами в вашем вопросе, теперь вам нужно самостоятельно отлаживать другие проблемы, я не могу сделать это за вас. :) Если вы застряли в новой проблеме, задайте новый вопрос. – Moritz

+0

Я думаю, что он имеет значение, все равно за вашу помощь – Emm

Смежные вопросы