首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKEffectNode to a SKTexture?

SKEffectNode to a SKTexture?
EN

Stack Overflow用户
提问于 2016-10-19 12:02:17
回答 2查看 630关注 0票数 3

SKEffectionNodes有一个shouldRasterise“开关”,它将它们烤成位图,并且在受影响的底层节点被更改之前不会更新它们。

然而,我无法找到一种方法来创建一个SKTexture从这个光栅化的“图像”。

是否可以从一个SKTexture中获得一个SKEffectNode

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-19 16:49:15

我想出了办法,用工厂来解决我的问题。

阅读更多关于如何制造工厂的信息,请参阅BenMobile's病人和清晰的发音,在这里:Factory creation and use for making Sprites and Shapes

模糊SKTextureSKSpriteNode存在一个问题,因为它将耗尽空间。模糊/光辉超出了精灵的边缘。为了解决这个问题,在下面,您将看到我创建了一个"framer“对象。这只是一个空的SKSpriteNode,它是要模糊纹理的两倍大小。将被模糊的纹理作为一个孩子添加到这个“框架”对象中。

它能工作,不管它有多讨厌;)

在静态工厂类文件中:

代码语言:javascript
复制
import SpriteKit

class Factory {

    private static let view:SKView = SKView()  // the magic. This is the rendering space

    static func makeShadow(from source: SKTexture, rgb: SKColor, a: CGFloat) -> SKSpriteNode {
        let shadowNode = SKSpriteNode(texture: source)
            shadowNode.colorBlendFactor = 0.5  // near 1 makes following line more effective
            shadowNode.color = SKColor.gray // makes for a darker shadow. White for "glow" shadow
        let textureSize = source.size()
        let doubleTextureSize = CGSize(width: textureSize.width * 2, height: textureSize.height * 2)
        let framer = SKSpriteNode(color: UIColor.clear, size: doubleTextureSize)
            framer.addChild(shadowNode)
        let blurAmount = 10
        let filter = CIFilter(name: "CIGaussianBlur")
            filter?.setValue(blurAmount, forKey: kCIInputRadiusKey)
        let fxNode = SKEffectNode()
            fxNode.filter = filter
            fxNode.blendMode = .alpha
            fxNode.addChild(framer)
            fxNode.shouldRasterize = true
        let tex = view.texture(from: fxNode) // ‘view’ refers to the magic first line
        let shadow = SKSpriteNode(texture: tex)  //WHOOPEE!!! TEXTURE!!!
            shadow.colorBlendFactor = 0.5
            shadow.color = rgb
            shadow.alpha = a
            shadow.zPosition = -1

        return shadow
    }
}

在任何地方你都可以访问你想要制作阴影或辉光纹理的雪碧:

代码语言:javascript
复制
shadowSprite = Factory.makeShadow(from: button, rgb: myColor, a: 0.33)
shadowSprite.position = CGPoint(x: self.frame.midX, y: self.frame.midY - 5)
addChild(shadowSprite)
  • button是被赋予阴影的按钮的纹理。a:是一个alpha设置(实际上透明度级别为0.0到1.0,其中1.0是完全不透明的),越低,阴影就越轻。

定位的作用是把阴影稍微落在按钮下面,所以看起来光线从顶部射过来,把阴影投射到背景上。

票数 0
EN

Stack Overflow用户

发布于 2016-10-19 13:47:45

我认为您可以尝试这样的代码(这只是一个例子):

代码语言:javascript
复制
if let effect = SKEffectNode.init(fileNamed: "myeffect") {
    effect.shouldRasterize = true
    self.addChild(effect)   
    ...         
    let texture = SKView().texture(from: self)
}

更新

在你回答完之后,希望我能更好地理解你想要实现的目标。

这是我的观点:如果您想要创建纹理的阴影,只需使用此纹理创建一个SKSpriteNode

代码语言:javascript
复制
let shadow = SKSpriteNode.init(texture: <yourTexture>)
shadow.blendMode = SKBlendMode.alpha
shadow.colorBlendFactor = 1
shadow.color = SKColor.black
shadow.alpha = 0.25

我想说的是,你可以一步一步地前进:

  • 得到你的纹理
  • 细化你的纹理(添加过滤器,做一些其他的效果.)
  • 得到阴影

这种工作方式产生了一系列有用的方法,您可以在项目中使用这些方法来构建其他类型的元素。也许,通过分离不需要使用texture(from:)的任务

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

https://stackoverflow.com/questions/40130888

复制
相关文章

相似问题

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