2012-03-05 43 views
0

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

我没有包括在这些.m文件我想用精灵工厂.h文件。

回答

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

谢谢。错误是我试图使用相同的方法来使用spritesheet中的单个图像和帧。真的是虚假的错误。 – Liuhu 2012-03-05 14:53:58