如何更新值而不将其作为子项添加到场景中

时间:2011-10-08 11:13:33

标签: iphone objective-c ios cocoa-touch cocos2d-iphone

所以我正在尝试更新游戏中的分数,代码运行正常,但结构对我来说似乎不对。我现在正在做的是将分数保存在var中,然后移除旧孩子并添加一个新孩子来更新分数,例如:

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,而我的方法在另一个文件中运行,所以如果你在同一个文件中使用了你的高分算法,则不需要{{1} }}

2 个答案:

答案 0 :(得分:1)

CCLabelBMFont实现CCLabelProtocol,因此它响应setString:方法。

你只需要在init方法中获得“scoreLabel”,然后像这样更新分数:

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]];
}

答案 1 :(得分:0)

改为使用CCLabelAtlas并使用setString更改CCLabelAtlas对象的字符串。