不知道为什么这不起作用。
当它尝试创建船舶节点时,它会因 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);
看起来是一个错误SKTexture
正如开发论坛中讨论的那样here https://devforums.apple.com/message/894095。根据 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)