CCLabelBMFont вылетает без уведомления? - PullRequest
1 голос
/ 07 октября 2011

Я получил эти два метода в моей сцене:

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

Итак, сначала я использую метод mageText , и мое сообщение всплывает в порядке.Затем он гаснет и удаляется со сцены.

Но ВТОРОЙ раз, когда я это делаю, он вылетает с сообщением EXC_BAD_ACCESS, говорящим

*Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «TextureCache: fileimage НЕ ДОЛЖЕН быть nill»

Но я не совсем понимаю.Если раньше он обнаружил Font2.png, почему он не работает во второй раз?

Я подозреваю, что CCLabelBMFont.m неправильно загрузил переменную configuration_ в строке

configuration_ = FNTConfigLoadFile(fntFile);

Потому что, когда я пытаюсь выполнить NSLog, я получаю сигнал EXC_BAD_ACCESS.

1 Ответ

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

Исходя из вашего комментария, я думаю, что вы можете найти решение, которое может работать. Вместо звонка ...

 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. Вам нужно сделать это только один раз, и, скорее всего, это можно сделать в конструкторе.

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