как обновить значение, не добавляя его как ребенка в сцену - PullRequest
1 голос
/ 08 октября 2011

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

if([self awake]){
    int score = (int) x;
    //NSLog(@"%i", score);

    CCLabelBMFont * scoreLabel = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@"Score : %d", score] fntFile:@"good_dog_plain_32.fnt"];
    scoreLabel.position = ccp(100, 300);
    [scoreScene addChild:scoreLabel];

        if([_game getChildByTag:123]){
            [_game removeChildByTag:123 cleanup:YES];
        }
    [_game addChild:scoreScene z:99 tag:123];
}

теперь этот код работает просто отлично, но он портит fps для игры !!! Есть ли в любом случае, я могу обновить значение ScoreLabel без необходимости удалять, а затем добавить счет в основную сцену игры?

спасибо

ОБНОВЛЕННЫЙ КОД окончательный фиксированный код:

в основной слой игры я добавил

CCLabelBMFont * scoreLabel;

в заголовочном файле.

в основной инициал игры я добавил

int score = 0;
        scoreLabel = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@"Score : %d", score] fntFile:@"good_dog_plain_32.fnt"];

        CCScene * scoreScene = [CCScene node];
        scoreLabel.position = ccp(100, 300);
        [scoreScene addChild:scoreLabel];
        [self addChild:scoreScene z:99 tag:123];

, а затем просто использовал setString в моем методе для обновления счета как:

 [_game.scoreLabel setString:[NSString stringWithFormat:@"Score : %d", score]];

обратите внимание, что _game связано с тем, что я объявил ScoreLabel в главной сцене, и мой метод выполняется в другом файле, поэтому, если у вас есть ваш метод рекордов в том же файле, нет необходимости в _game

Ответы [ 2 ]

1 голос
/ 08 октября 2011

CCLabelBMFont реализует CCLabelProtocol , поэтому он отвечает на метод setString:.

Вам просто нужно иметь свой "ScoreLabel" в методе init, а затем обновить счет таким образом:

if([self awake])
{
    int score = (int) x;
    //NSLog(@"%i", score);

    [scoreLabel setString:[NSString stringWithFormat:@"Score : %d", score]];
}

РЕДАКТИРОВАТЬ

Может выглядеть так:

- (id)init
{
   if ((self = [super init]))
   {
      self.score = 0;

      CCLabelBMFont *scoreLabel = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@"Score : %d", score] fntFile:@"good_dog_plain_32.fnt"];
      scoreLabel.position = ccp(100, 300);
      [self addChild:scoreLabel z:1 tag:123];
   }
}

- (void)updateScore
{
   CCLabelBMFont *scorelabel = (CCLabelBMFont *)[self getChildByTag:123];
   [scorelabel setString:[NSString stringWithFormat:@"Score: %d",self.score]];
}
0 голосов
/ 08 октября 2011

Используйте взамен CCLabelAtlas и используйте setString для изменения строки объекта CCLabelAtlas.

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