所以我正在尝试更新游戏中的分数,代码运行正常,但结构对我来说似乎不对。我现在正在做的是将分数保存在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} }}
答案 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对象的字符串。