SpriteKit SKTexture崩溃

时间:2013-10-08 08:49:05

标签: sprite-kit cifilter skspritenode

不确定为什么这不起作用。

当它尝试创建发运节点时,它与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 个答案:

答案 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版本。