0

不知道为什么这不起作用。

当它尝试创建 ship 节点时,它会因 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);
4

2 回答 2

1

看起来是这里SKTexture的开发论坛中讨论的错误。在 lldb 跟踪之后,我猜这是一个内存管理问题,它在使用过滤器时如何分配图像数据缓冲区。如果你真的想避免使用,这段代码应该通过直接处理过滤器并避免依赖.SKEffectNodeSKTexture

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);
于 2013-10-08T12:54:20.020 回答
0

我在 Sprite Kit 中遇到了类似的粒子问题——这似乎是因为源纹理位于 Texture Atlas 文件夹中,并且没有相应的 @2x 图像。尝试将纹理移出纹理图集和/或添加图像的@2x 版本。

于 2014-01-21T20:57:13.077 回答