不确定为什么这不起作用。
当它尝试创建发运节点时,它与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);
答案 0 :(得分: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);
答案 1 :(得分:0)
我在Sprite Kit中遇到类似的问题 - 这似乎是因为源纹理位于Texture Atlas文件夹中,并且它没有相应的@ 2x图像。尝试将纹理移出纹理图集和/或添加图像的@ 2x版本。