2013-10-08 74 views
0

不知道爲什麼這不起作用。SpriteKit SKTexture崩潰

當它嘗試創建出貨節點時,它會與EXC_BAD_ACCESS一起崩潰。

SKTexture *tex = [SKTexture textureWithImageNamed:@"Spaceship"]; 
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"]; 
[filter setValue:@0.6 forKey:kCIInputIntensityKey]; 

SKTexture *texDone; 

if (filter) { 
    texDone = [tex textureByApplyingCIFilter:filter]; 
} 

if (texDone) { 
    SKSpriteNode *ship = [SKSpriteNode spriteNodeWithTexture:texDone]; 
    [self addChild:ship]; 
    ship.position = CGPointMake(200, 200); 
} 

與創建船相同的崩潰。

我已經使用了這個SKEffect,但它有更多的代碼?對於相同的濾鏡。以下作品。

SKSpriteNode *spriteToFilter = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 

CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"]; 
[filter setValue:@1.0 forKey:kCIInputIntensityKey]; 

SKEffectNode *effectNode = [SKEffectNode node]; 
effectNode.filter = filter; 
effectNode.shouldEnableEffects = YES; 

[effectNode addChild:spriteToFilter]; 
[self addChild:effectNode]; 
effectNode.position = CGPointMake(200, 200); 

回答

1

看起來是在SKTexture的錯誤如在開發論壇here討論。在lldb跟蹤之後,我猜想這是一個內存管理問題,它在使用過濾器時如何分配圖像數據緩衝區。如果你真的想避免使用SKEffectNode,這段代碼應該通過直接處理過濾器並避免依賴於SKTexture來解決它。

UIImage *ship = [UIImage imageNamed:@"Spaceship.png"]; 
CIImage *shipImage = [[CIImage alloc] initWithImage:ship]; 
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" keysAndValues:kCIInputImageKey, shipImage, @"inputIntensity", [NSNumber numberWithFloat:0.6], nil]; 
CIContext *context = [CIContext contextWithOptions:nil]; 
CIImage *out = [filter outputImage]; 
CGImageRef cg = [context createCGImage:out fromRect:[out extent]]; 
SKTexture *texDone = [SKTexture textureWithCGImage:cg]; 

經過測試和在這裏工作,但可能更容易使用您發佈的SKEffectNode代碼。不知道哪個更有效,你必須和他們一起玩。

// adding the texture to a sprite with above filter works 
SKSpriteNode *spriteToFilter = [SKSpriteNode spriteNodeWithTexture:texDone]; 
[self addChild:spriteToFilter]; 
spriteToFilter.position = CGPointMake(200, 200); 
+0

是啊,必須是一個bug,如果我想要一個SKSpriteNode,那麼我不能有一個這是一個圖像已被過濾...我堅持與SKEffect節點。 – DogCoffee

0

我在Sprite Kit中有類似的問題,它似乎是因爲源紋理位於Texture Atlas文件夾中,並沒有相應的@ 2x圖像。嘗試將紋理移出紋理圖集和/或添加@ 2x版本的圖像。