簡體   English   中英

本地高分報告/顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM