Search code examples
objective-ccocos2d-iphonefactory-pattern

My factory method isn't working as intended


I'm making a game, which uses large pixel art for graphics. As I would have to declare sprite.scale = 2; and [sprite.texture setAliasTexParameters]; for each and every sprite, I decided to make a factory method. I got it workin, but for some reason it crashes the program at some situations.

This is my factory code in .m file:

@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

And this from .h file:

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

I made button sprites with it like this and it works flawlessly.

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

For some reason this for example will crash the program:

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

I did include the .h file in those .m files I wanted to use the sprite factory.


Solution

  • Verify that the spriteFrameCache contains an entry for your failing sprites. If it does not, your factory will return a nil sprite, and the [self addChild:bg3 z:1] will fail on an NSAssert. Returning nil (from your factory) is not a bad thing, but it is expectable behaviour. You should program defensively around it:

    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");
    }