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