Локальные отчеты о результатах / Дисплей - PullRequest
0 голосов
/ 04 февраля 2012

Пожалуйста, кто-нибудь может направить меня к руководству или помочь мне с этой проблемой.Я хочу отображать рекорды и другую статистику игр в игре 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;
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Трудно понять ваш код, пожалуйста, посмотрите на этот небольшой пример ниже.

Хорошо, это сохранение нового счета, при условии, что у вас есть синглтон 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:

- (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];
    }
}
0 голосов
/ 04 февраля 2012

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

Например, вы можете подумать о том, чтобы следовать условию, когда переменные экземпляра начинаются со строчных букв, сохраняя заглавные имена для классов. Обычно плохая идея давать вводящие в заблуждение имена, например, вызывать NSDictinoary "defaultArray". Кроме того, старайтесь использовать пустые строки более экономно, чтобы структурировать ваш код для лучшей читабельности.

При этом, как вы устанавливаете значение по умолчанию:

[[NSUserDefaults standardUserDefaults] setValue:scoreArray 
                                         forKey:@"Score"];

Я вижу, вы знаете, как получить счет.

Что касается вашей процедуры обновления, учтите, что, как правило, не стоит изменять массив, через который вы проходите (в вашем конкретном случае он все еще может работать, но это не гарантируется). Также нет необходимости хранить весь массив в цикле. Просто сохраните его, как только вы построите полный новый массив рекордов.

В противном случае ваш код работает, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...