首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpriteKit SKTexture坠机

SpriteKit SKTexture坠机
EN

Stack Overflow用户
提问于 2013-10-08 08:49:04
回答 2查看 2K关注 0票数 0

不知道为什么这不管用。

当它试图创建ship节点时,它会与EXC_BAD_ACCESS崩溃。

代码语言:javascript
复制
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,但是它的代码要多得多?同样的过滤器。下面的工作。

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-08 12:54:20

看起来是SKTexture中的一个bug,就像开发论坛这里中讨论的那样。按照lldb跟踪,我想这是一个内存管理问题,因为它在使用过滤器时如何分配图像数据缓冲区。如果您真的想避免使用SKEffectNode,这段代码应该通过直接处理过滤器和避免对SKTexture的依赖来绕过它。

代码语言:javascript
复制
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代码。不知道哪一个更有效率,你得和他们一起玩。

代码语言:javascript
复制
// adding the texture to a sprite with above filter works
SKSpriteNode *spriteToFilter = [SKSpriteNode spriteNodeWithTexture:texDone];
[self addChild:spriteToFilter];
spriteToFilter.position = CGPointMake(200, 200);
票数 1
EN

Stack Overflow用户

发布于 2014-01-21 20:57:13

我对雪碧套件中的粒子也有类似的问题--这似乎是因为源纹理位于纹理地图集文件夹中,而且它没有相应的@2x图像。尝试将纹理移出纹理地图集和/或添加图像的@2x版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19243111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档