我在我的场景中有这两种方法:
-(void)damageText:(NSString*)text atPosition:(CGPoint)position {
CCLabelBMFont *label = [CCLabelBMFont labelWithString:text fntFile:@"Font2.fnt"];
label.position = position;
[self addChild:label z:50];
label.scale = 0.01;
[label runAction:[CCSequence actions:[CCScaleTo actionWithDuration:0.08 scale:1.0],
[CCDelayTime actionWithDuration:0.2],[CCFadeOut actionWithDuration:0.8],
[CCCallFuncN actionWithTarget:self selector:@selector(killLabel:)],nil]];
label.opacity = 0;
[label runAction:[CCFadeIn actionWithDuration:0.04]];
}
-(void)killLabel:(id)sender {
CCLabelBMFont *label = (CCLabelBMFont*)sender;
[self removeChild:label cleanup:YES];
}
首先,我使用 damageText 方法,我的消息弹出正常。然后它淡出并从场景中删除。
但是第二次我这样做,它崩溃了,用EXC_BAD_ACCESS消息说
* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'TextureCache:fileimage绝不能是nill'
但我不太明白。如果之前确实找到了Font2.png,为什么第二次失败?
我怀疑 CCLabelBMFont.m 没有在第
行正确加载配置_ 变量configuration_ = FNTConfigLoadFile(fntFile);
因为当我尝试NSLog时,我得到一个EXC_BAD_ACCESS信号。
答案 0 :(得分:1)
根据您的评论,我认为您可能会找到可行的解决方案。而不是打电话......
CCLabelBMFont *label = [CCLabelBMFont labelWithString:text fntFile:@"Font2.fnt"];
每次在damageText
中为什么不只是在构造函数中创建一个成员变量,然后只在damageText
函数中设置文本。所以你最终会得到......
-(void)damageText:(NSString*)text atPosition:(CGPoint)position {
// CCLabelBMFont *label = [CCLabelBMFont labelWithString:text fntFile:@"Font2.fnt"];
label.position = position;
//[self addChild:label z:50];
label.scale = 0.01;
[label runAction:[CCSequence actions:[CCScaleTo actionWithDuration:0.08 scale:1.0],
[CCDelayTime actionWithDuration:0.2],[CCFadeOut actionWithDuration:0.8],
[CCCallFuncN actionWithTarget:self selector:@selector(killLabel:)],nil]];
label.opacity = 0;
[label runAction:[CCFadeIn actionWithDuration:0.04]];
}
我甚至不担心删除标签。当标签的父节点被解除分配时,让标签的父节点处理它(我假设一个CCLayer或CCScene对象?)。如果要从视图中删除标签,只需将其可见性设置为false或将其缩放设置为0。
更新:也支出了addChild。您只需要执行一次,并且可以在构造函数中完成。