2013-10-08 4 views
0

Не знаете, почему это не работает.SpriteKit SKTexture Crash

Он вылетает с 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

Да, должно быть, ошибка, если я хочу SKSpriteNode, тогда у меня не может быть изображения, которое было отфильтровано ... Я застрял с узлом SKEffect. – DogCoffee

0

У меня была аналогичная проблема с частицами в Sprite Kit - это, казалось бы, потому что текстура источник был в папке Texture Atlas, и у него не было соответствующего @ 2x изображение. Попробуйте переместить текстуру из атласа текстуры и/или добавьте версию изображения в формате 2x.

Смежные вопросы