Reputation: 3818
I am making a game that uses Game Center achievements for when a player reaches certain scores. However, in my testing, I realised that the banners were being displayed every time they reached a certain score, regardless of whether they had already done so.
I think I need to use loadAchievementsWithCompletionHandler to check if the achievement has already been completed. However, I'm a little unsure of how to do this. This is my code:
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
}
})
}
}
I'm not really sure if the last part is right so far, and I don't know how to access the array, so that I can check if the achievement has been completed.
Upvotes: 0
Views: 1666
Reputation: 10839
You can use that, I create a simple class for iOS game center in github https://github.com/DaRkD0G/Easy-Game-Center-Swift Or I have the solution for begin add this code
// 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)
}
}
}
After in 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)")}
}
}
And after in Button add this for your achievement
@IBAction func action(sender: AnyObject) {
gameCenterLoadAchievements()
gameCenterAddProgressToAnAchievement(100.00, achievementID: "vous_etre_encore_vivant")
}
Voila voila
;-) French Developer Thanx : RMeeuws
Upvotes: 3