2012-03-05 76 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