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);

2 ответа

Решение

Похоже, ошибка в SKTexture как обсуждалось на форумах разработчиков здесь. Следуя трассировке 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);

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

Другие вопросы по тегам