CCLabelBMFont崩溃,恕不另行通知?

时间:2011-10-07 00:16:07

标签: objective-c cocos2d-iphone

我在我的场景中有这两种方法:

-(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信号。

1 个答案:

答案 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。您只需要执行一次,并且可以在构造函数中完成。