[英]Local high scores reporting/Display
請任何人將我推薦給教程或幫助我解決這個問題。 我希望在Over游戲中顯示高分和其他游戲統計信息,但是盡管看了教程並嘗試了一些東西,但我似乎並沒有取得進展。 我似乎不明白如何使用NSUserdefaults實現這一目標。
我的代碼如下:
Gameplaylayer.mm
- (id)initWithHUDLayer:(HUDLayer *)hudLayer {
if ((self = [super init]))
{
score = 0;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *defaultArray = [NSDictionary dictionaryWithObject:[NSArray arrayWithObjects:[NSNumber numberWithInt:0],
[NSNumber numberWithInt:0],
[NSNumber numberWithInt:0],
[NSNumber numberWithInt:0],
[NSNumber numberWithInt:0],
nil]
forKey:@"Scores"];
[defaults registerDefaults:defaultArray];
[defaults synchronize];
}
return self;
}
-(void)gameOver:(id)sender{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *HighScores = [NSMutableArray arrayWithArray:[defaults arrayForKey:@"Scores"]];
for (unsigned int i = 0; i < [HighScores count]; i++)
{
if (dist >= [[HighScores objectAtIndex:i] intValue])
{
[HighScores insertObject:[NSNumber numberWithInt:dist] atIndex:i];
[HighScores removeLastObject];
[defaults setObject:HighScores forKey:@"Scores"];
[defaults synchronize];
NSLog(@"Saved new high score of %i", dist);
break;
}
}
}
-(void)update:(ccTime)dt {
CGSize winSize = [CCDirector sharedDirector].winSize;
score += (int)delta;
dist = score - 18;
if (!gameOver )
{
if (!lives)
{
gameOver = true;
[self gameOver];
}
}
}
我的游戲層如下
-(id)init {
self = [super init];
if (self != nil)
{
self.isTouchEnabled = YES;
CGSize windowSize = [CCDirector sharedDirector].winSize;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *HighScores = [defaults arrayForKey:@"Scores"];
CLabelTTF *title = [CCLabelTTF labelWithString:@"high scores" fontName:@"Courier" fontSize:32.0];
[title setPosition:ccp(screenSize.width / 2, screenSize.height - title.contentSize.height)];
[self addChild:title];
NSMutableString *scoresString = [NSMutableString stringWithString:@""];
for (unsigned int i = 0; i < [HighScores count]; i++)
{
[scoresString appendFormat:@"%i. %i\n", i + 1, [[HighScores objectAtIndex:i] intValue]];
}
CCLOG(@"scores saved %i", dist);
CCLabelTTF *scoresLabel = [CCLabelTTF labelWithString:scoresString dimensions:CGSizeMake(screenSize.width, screenSize.height / 3) alignment:CCTextAlignmentCenter fontName:@"Courier" fontSize:40.0];
[scoresLabel setPosition:ccp(screenSize.width / 2, screenSize.height / 2)];
scoresLabel.color = ccc3(0, 0, 0);
[self addChild:scoresLabel z:9];
}
return self;
}
您的代碼有很多問題,其中一些只是違反約定而已,但總之,它們使您的程序難以理解。 我一直無法理解。 您沒有使用評論,也沒有告訴我們什么完全不起作用。
例如,您可以考慮遵循以下約定:讓實例變量以小寫字母開頭,並保留類的大寫名稱。 給出令人誤解的名稱,例如調用NSDictinoary
“ defaultArray”,通常是一個壞主意。 另外,請嘗試更謹慎地使用空行來組織代碼,以提高可讀性。
話雖如此,這是您設置默認值的方式:
[[NSUserDefaults standardUserDefaults] setValue:scoreArray
forKey:@"Score"];
我知道您知道如何檢索分數。
至於更新例程,請考慮修改迭代數組通常不是一個好主意(在您的特定情況下仍然可以使用,但不能保證)。 同樣,也不需要將整個數組存儲在循環中。 構建完完整的新高分數組后,只需保存它即可。
否則您的代碼可以正常工作,對嗎?
很難理解您的代碼,請看下面的這個小例子。
好吧,這是保存新的成績,假設你已經GameController單,其中scores
可變數組聲明和currentScore
在單也顯示當前玩家的分數。
-(void) saveScores {
GameController * controller = [GameController sharedController];
for(int i=0; i<5;i++)
{
if([[[controller.scores objectAtIndex:i] objectForKey:@"score"] intValue] == controller.finalscore)
{
break;
}
if([[[controller.scores objectAtIndex:i] objectForKey:@"score"] intValue] < controller.finalscore) {
for(int j=5;j>i+1;j--)
{
[controller.scores replaceObjectAtIndex:j-1 withObject:[controller.scores objectAtIndex:j-2]];
}
NSMutableDictionary *newEntry = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:controller.finalscore],@"score",@"Local player",@"name", nil];
[controller.scores replaceObjectAtIndex:i withObject:newEntry];
break;
}
}
controller.currentScore=0;
[[NSUserDefaults standardUserDefaults] setObject:controller.scores forKey:@"OurScores"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
可以看到,我們正在將更新的分數保存在NSUserDefaults中。 因此,在游戲開始時,我們應該加載它們。 我將此代碼添加到GameController的init方法中:
- (void) loadScores {
if([[NSUserDefaults standardUserDefaults] objectForKey:@"OurScores"] == nil)
{
NSMutableDictionary *empty = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:0],@"score",@"empty",@"name", nil];
for(int i=0;i<5;i++)
[scores addObject:empty];
}
else
{
NSLog(@"Loading scores");
scores = [[NSUserDefaults standardUserDefaults] objectForKey:@"OurScores"];
}
}
這就是我們可以使用cocos2d顯示此分數的方法:
-(void) drawScores {
for(int i=0; i<5; i++)
{
CCLabelTTF* score = [CCLabelTTF labelWithString:
[NSString stringWithFormat:@"%@",[[controller.scores objectAtIndex:i] objectForKey:@"name"]] fontName:@"Marker Felt" fontSize:30];
score.anchorPoint=ccp(0,0);
score.position = ccp(115, 180-i*35);
CCLabelTTF* score2 = [CCLabelTTF labelWithString:
[NSString stringWithFormat:@"%d",[[[controller.scores objectAtIndex:i] objectForKey:@"score"] intValue] ] fontName:@"Marker Felt" fontSize:35];
score2.anchorPoint=ccp(0,0);
score2.position = ccp(280, 180-i*35);
score.color=currentClr;
score2.color=currentClr;
[self addChild: score z:3 tag:i];
[self addChild: score2 z:3 tag:i+15];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.