Swift - loadAchievementsWithCompletionHandler

Я делаю игру, в которой используются достижения Game Center, когда игрок набирает определенные очки. Однако в ходе моего тестирования я понял, что баннеры показывались каждый раз, когда они набирали определенную оценку, независимо от того, сделали ли они это уже.

Я думаю, что мне нужно использовать loadAchievementsWithCompletionHandler, чтобы проверить, было ли достижение уже завершено. Тем не менее, я немного не уверен, как это сделать. Это мой код:

func checkAchievements() {
    var identifier : String? = nil
    var index : Int!
    var percentComplete : Double = 0
    switch(score)
    {
    case 30:
        identifier = "30"
        index = 0 // Index for array made in loadAchievementsWithCompletionHandler
        percentComplete = 100.0
    case 60:
        identifier = "60"
        index = 1
        percentComplete = 100.0
    case 90:
        identifier = "90"
        index = 2
        percentComplete = 100.0
    case 120:
        identifier = "120"
        index = 3
        percentComplete = 100.0
    case 150:
        identifier = "150"
        index = 4
        percentComplete = 100.0
    default:
        identifier = nil
    }
    if identifier != nil {
        let achievement = GKAchievement(identifier: identifier)
        achievement.showsCompletionBanner = true

        GKAchievement.loadAchievementsWithCompletionHandler({(achievement, var error) in
            if (error != nil) {

                // Not sure what to put here
            }
        })


    }
}

Я не совсем уверен, что последняя часть права до сих пор, и я не знаю, как получить доступ к массиву, чтобы я мог проверить, было ли достижение завершено.

1 ответ

Вы можете использовать это, я создаю простой класс для игрового центра iOS в github https://github.com/DaRkD0G/Easy-Game-Center-Swift или у меня есть решение для начала добавить этот код

// Game Center
let gameCenterPlayer=GKLocalPlayer.localPlayer()
var canUseGameCenter:Bool = false {
    didSet{if canUseGameCenter == true {// load prev. achievments form Game Center
        gameCenterLoadAchievements()}
    }}
var gameCenterAchievements=[String:GKAchievement]()

// MARK: Game Center
// load prev achievement granted to the player
func gameCenterLoadAchievements(){
    // load all prev. achievements for GameCenter for the user to progress can be added
    var allAchievements=[GKAchievement]()

    GKAchievement.loadAchievementsWithCompletionHandler({ (allAchievements, error:NSError!) -> Void in
        if error != nil{
            println("Game Center: could not load achievements, error: \(error)")
        } else {
            for anAchievement in allAchievements  {
                if let oneAchievement = anAchievement as? GKAchievement {
                    self.gameCenterAchievements[oneAchievement.identifier]=oneAchievement}
            }
        }
    })
}
// add progress to an achievement
func gameCenterAddProgressToAnAchievement(progress:Double,achievementID:String) {
    if canUseGameCenter == true { // only update progress if user opt-in to use Game Center
        // lookup if prev progress is logged for this achievement = achievement is already know (and loaded) form Game Center for this user
        var lookupAchievement:GKAchievement? = gameCenterAchievements[achievementID]

        if let achievement = lookupAchievement {
            // found the achievement with the given achievementID, check if it already 100% done
            if achievement.percentComplete != 100 {
                // set new progress
                achievement.percentComplete = progress
                if progress == 100.0  {achievement.showsCompletionBanner=true}  // show banner only if achievement is fully granted (progress is 100%)

                // try to report the progress to the Game Center
                GKAchievement.reportAchievements([achievement], withCompletionHandler:  {(var error:NSError!) -> Void in
                    if error != nil {
                        println("Couldn't save achievement (\(achievementID)) progress to \(progress) %")
                    }
                })
            }
            else {// achievemnt already granted, nothing to do
                println("DEBUG: Achievement (\(achievementID)) already granted")}
        } else { // never added  progress for this achievement, create achievement now, recall to add progress
            println("No achievement with ID (\(achievementID)) was found, no progress for this one was recoreded yet. Create achievement now.")
            gameCenterAchievements[achievementID] = GKAchievement(identifier: achievementID)
            // recursive recall this func now that the achievement exist
            gameCenterAddProgressToAnAchievement(progress, achievementID: achievementID)
        }
    }
}

После в ViewDidLoad

    override func viewDidLoad() {
    super.viewDidLoad()


        // Do any additional setup after loading the view.
    self.gameCenterPlayer.authenticateHandler={(var gameCenterVC:UIViewController!, var gameCenterError:NSError!) -> Void in
            if gameCenterVC != nil {
                //showAuthenticationDialogWhenReasonable: is an example method name. Create your own method that displays an authentication view when appropriate for your app.
                //showAuthenticationDialogWhenReasonable(gameCenterVC!)
                self.presentViewController(gameCenterVC, animated: true, completion: { () -> Void in
                    // no idea
                })
            }
            else if self.self.gameCenterPlayer.authenticated == true {
                self.self.canUseGameCenter = true
            } else  {
                self.canUseGameCenter = false
            }

            if gameCenterError != nil
            { println("Game Center error: \(gameCenterError)")}
        }
}

А после в кнопку добавить это для вашего достижения

    @IBAction func action(sender: AnyObject) {
    gameCenterLoadAchievements()
    gameCenterAddProgressToAnAchievement(100.00, achievementID: "vous_etre_encore_vivant")

}

Вуаля вуаля

;-) Французский Разработчик Спасибо: RMeeuws

Другие вопросы по тегам