2014-09-19 1 views
0

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

Думаю, мне нужно использовать 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 
      } 
     }) 


    } 
} 

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

ответ

3

Вы можете использовать это, я создать простой класс для игрового центра 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)")} 
     } 
} 

И после этого в Button добавьте это для ваших достижений

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

} 

Вуаля вуаля

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

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

  • Нет связанных вопросов^_^