我的工厂方法没有按预期工作

时间:2012-03-05 12:19:56

标签: objective-c cocos2d-iphone factory-pattern

我正在制作一款游戏,它使用大型像素艺术作为图形。因为我必须为每个精灵声明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 个答案:

答案 0 :(得分:1)

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