Мой фабричный метод не работает, как предполагалось - PullRequest
0 голосов
/ 05 марта 2012

Я делаю игру, которая использует большие пиксельные рисунки для графики. Поскольку мне нужно было бы объявить sprite.scale = 2; и [sprite.texture setAliasTexParameters]; для каждого спрайта, я решил создать фабричный метод. У меня это работает, но по какой-то причине в некоторых ситуациях происходит сбой программы.

Это мой заводской код в файле .m:

@implementation pixelSprite

+ (id) spriteFromFrame:(NSString *)frame setScale:(BOOL)scale resetAnchor:(BOOL)reset {
CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:frame];
[sprite.texture setAliasTexParameters];
if (scale) {sprite.scale = 2;}
if (reset) {sprite.anchorPoint = ccp(0, 0);}
return sprite;
}
@end

И это из .h файла:

@interface pixelSprite : CCSprite {}
+ (id)spriteFromFrame:(NSString*)frame setScale:(BOOL)scale resetAnchor:(BOOL)reset;
@end

Я сделал спрайты кнопок таким образом, и он работает безупречно.

CCSprite *spriteCampaign1 = [pixelSprite spriteFromFrame:@"buttonCampaign1.png" setScale:FALSE resetAnchor:FALSE];

По какой-то причине это, например, приведет к сбою программы:

CCSprite *bg3 = [pixelSprite spriteFromFrame:@"bgMenu3.png" setScale:TRUE resetAnchor:FALSE];
    //bg3.anchorPoint = ccp(0.5, 0);
    bg3.position = ccp(240, 210);
    [self addChild:bg3 z:1];

Я включил файл .h в те файлы .m, которые хотел использовать фабрику спрайтов.

1 Ответ

1 голос
/ 05 марта 2012

Убедитесь, что spriteFrameCache содержит запись для ваших сбойных спрайтов. Если этого не произойдет, ваша фабрика вернет нулевой спрайт, и [self addChild: bg3 z: 1] завершится ошибкой в ​​NSAssert. Возвращать ноль (с вашего завода) не плохо, но это ожидаемое поведение. Вы должны программировать оборонительно вокруг него:

CCSprite *bg3 = [pixelSprite spriteFromFrame:@"bgMenu3.png" setScale:TRUE resetAnchor:FALSE];
if(bg3) {
    //bg3.anchorPoint = ccp(0.5, 0);
    bg3.position = ccp(240, 210);
    [self addChild:bg3 z:1];
} else {
    CCLOGERROR(@"whatever your flavor of logging is");
}
...