6.对Achievement进行操作
这一部分内容比较多,而且有的地方有点重复的感觉.
6.1汇报一个成就的进度
对于一个玩家可见的成就,你需要尽可能的报告给玩家解锁的进度;对于一个一部完成的成就,则不需要,当玩家的进度达到100%的时候,会自动解锁该成就.
- (void) reportAchievementIdentifier: (NSString*) identifier percentComplete: (float) percent
{
GKAchievement *achievement = [[[GKAchievement alloc] initWithIdentifier: identifier] autorelease];
if (achievement)
{
achievement.percentComplete = percent;
[achievement reportAchievementWithCompletionHandler:^(NSError *error)
{
if (error != nil)
{
//The proper way for your application to handle network errors is retain
//the achievement object (possibly adding it to an array). Then, periodically
//attempt to report the progress until it is successfully reported.
//The GKAchievement class supports the NSCoding protocol to allow your
//application to archive an achie
NSLog(@"报告成就进度失败 ,错误信息为: \n %@",error);
}else {
//对用户提示,已经完成XX%进度
NSLog(@"报告成就进度---->成功!");
NSLog(@" completed:%d",achievement.completed);
NSLog(@" hidden:%d",achievement.hidden);
NSLog(@" lastReportedDate:%@",achievement.lastReportedDate);
NSLog(@" percentComplete:%f",achievement.percentComplete);
NSLog(@" identifier:%@",achievement.identifier);
}
}];
}
}
其中该函数的参数中identifier是你成就的ID, percent是该成就完成的百分比
6.2读取一个成就
方法一:得到所有的成就
- (void) loadAchievements
{
NSMutableDictionary *achievementDictionary = [[NSMutableDictionary alloc] init];
[GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements,NSError *error)
{
if (error == nil) {
NSArray *tempArray = [NSArray arrayWithArray:achievements];
for (GKAchievement *tempAchievement in tempArray) {
[achievementDictionary setObject:tempAchievement forKey:tempAchievement.identifier];
NSLog(@" completed:%d",tempAchievement.completed);
NSLog(@" hidden:%d",tempAchievement.hidden);
NSLog(@" lastReportedDate:%@",tempAchievement.lastReportedDate);
NSLog(@" percentComplete:%f",tempAchievement.percentComplete);
NSLog(@" identifier:%@",tempAchievement.identifier);
}
}
}];
}
函数中NSArray返回的是你的所有成就ID.
方法二:根据ID获取成就
- (GKAchievement*) getAchievementForIdentifier: (NSString*) identifier
{
NSMutableDictionary *achievementDictionary = [[NSMutableDictionary alloc] init];
GKAchievement *achievement = [achievementDictionary objectForKey:identifier];
if (achievement == nil)
{
achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease];
[achievementDictionary setObject:achievement forKey:achievement.identifier];
}
return [[achievement retain] autorelease];
}
6.3获取成就描述和图片
在自定义界面中,玩家需要一个成就描述,以及该成就的图片,Game Center提供了该功能.当然,你也可以自己在程序中完成,毕竟玩家不可能时刻处于在线状态.
- (NSArray*)retrieveAchievmentMetadata
{
//读取成就的描述
[GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:
^(NSArray *descriptions, NSError *error) {
if (error != nil)
{
// process the errors
NSLog(@"读取成就说明出错");
}
if (descriptions != nil)
{
// use the achievement descriptions.
for (GKAchievementDescription *achDescription in descriptions) {
NSLog(@"1..identifier..%@",achDescription.identifier);
NSLog(@"2..achievedDescription..%@",achDescription.achievedDescription);
NSLog(@"3..title..%@",achDescription.title);
NSLog(@"4..unachievedDescription..%@",achDescription.unachievedDescription);
NSLog(@"5............%@",achDescription.image);
//获取成就图片,如果成就未解锁,返回一个大文号
/*
[achDescription loadImageWithCompletionHandler:^(UIImage *image, NSError *error) {
if (error == nil)
{
// use the loaded image. The image property is also populated with the same image.
NSLog(@"成功取得成就的图片");
UIImage *aImage = image;
UIImageView *aView = [[UIImageView alloc] initWithImage:aImage];
aView.frame = CGRectMake(50, 50, 200, 200);
aView.backgroundColor = [UIColor clearColor];
[[[CCDirector sharedDirector] openGLView] addSubview:aView];
}else {
NSLog(@"获得成就图片失败");
}
}];
*/
}
}
}];
return nil;
}
如果你不主动使用注释中的方法,那么你得到的description中不会有图片,这样可以减少网络的使用,尽量少下载东西.当使用注释中的代码时,如果成就已经解锁,则返回该成就的图标,如果没有解锁,则返回一个大问号,至于未解锁图标是否可以自定义,我找寻的结果好像是不可以.
GameCenter 成就提示更新:
GameCenter中成就提示需要开发者自定义,即使官方Demo的例子程序中也没有给与提示框(横幅样式)通知用户的官方代码,所以这里Himi介绍如何模仿官方的成就提示:
1. iOS5以及更高SDK中,apple已经提供官方的成就提示:方法很简单,代码如下:
- (void)sendAchievement:(GKAchievement *)achievement {
achievement.percentComplete = 100.0; //Indicates the achievement is done
achievement.showsCompletionBanner = YES; //Indicate that a banner should be shown
[achievement reportAchievementWithCompletionHandler:
^(NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^(void)
{
if (error == NULL) {
NSLog(@"Successfully sent archievement!");
} else {
NSLog(@"Achievement failed to send... will try again \
later. Reason: %@", error.localizedDescription);
}
});
}];
}
将“showsCompletionBanner”属性设置成YES,提交给苹果。新iOS属性“showsCompletionBanner”,其默认设置是NO,但若将其调整成YES,屏幕就呈现包含成就标题和描述的漂亮横幅;
2.如果低于5.0的SDK设备中是没有“showsCompletionBanner”属性的,所以需要我们自定义提示样式,当然这里Himi也分享一下如何模仿官方横幅提示样式的方法和代码:
(责任编辑:admin) |