SKEffectNode 到 SKTexture?
SKEffectNode to an SKTexture?
SKEffectionNodes
有一个 shouldRasterise "switch" 将它们烘焙到位图中,并且在受效果影响的底层节点发生更改之前不会更新它们。
但是我找不到从这个栅格化 "image" 创建 SKTexture
的方法。
是否可以从 SKEffectNode
得到 SKTexture
?
我想你可以试试这样的代码(这只是一个例子):
if let effect = SKEffectNode.init(fileNamed: "myeffect") {
effect.shouldRasterize = true
self.addChild(effect)
...
let texture = SKView().texture(from: self)
}
更新:
你回答后,希望我能更好地理解你想要实现的目标。
这是我的观点:如果你想制作一个纹理的阴影,你可以简单地用这个纹理创建一个SKSpriteNode
:
let shadow = SKSpriteNode.init(texture: <yourTexture>)
shadow.blendMode = SKBlendMode.alpha
shadow.colorBlendFactor = 1
shadow.color = SKColor.black
shadow.alpha = 0.25
我想说的是,你可以一步一步来:
- 得到你的纹理
- 精心制作您的纹理(添加滤镜,制作其他效果..)
- 获取影子
这种工作方式产生了一系列有用的方法,您可以在项目中使用这些方法来构建其他类型的元素。
也许,通过分离你不需要使用的任务 texture(from:)
我已经解决了这个问题,使用工厂解决了我的问题。
从BenMobile's patient and clear articulation, here:
阅读更多关于如何建造工厂的信息
模糊 SKTexture
或 SKSpriteNode
存在问题,因为它会从 space 变成 运行。 blur/glow 超出了精灵的边缘。为了解决这个问题,在下面,您会看到我创建了一个 "framer" 对象。这只是一个空的 SKSpriteNode
,它是要模糊的纹理大小的两倍。要模糊的纹理作为子对象添加到此 "framer" 对象。
无论这有多么骇人听闻,它都能正常工作 ;)
静态工厂内部 class 文件:
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
}
}
在任何您可以访问要为其制作阴影或发光纹理的精灵的地方:
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 是完全不透明的)越低阴影越亮。
该定位用于将阴影略低于按钮,因此看起来光线从顶部射来,将阴影向下投射到背景上。
SKEffectionNodes
有一个 shouldRasterise "switch" 将它们烘焙到位图中,并且在受效果影响的底层节点发生更改之前不会更新它们。
但是我找不到从这个栅格化 "image" 创建 SKTexture
的方法。
是否可以从 SKEffectNode
得到 SKTexture
?
我想你可以试试这样的代码(这只是一个例子):
if let effect = SKEffectNode.init(fileNamed: "myeffect") {
effect.shouldRasterize = true
self.addChild(effect)
...
let texture = SKView().texture(from: self)
}
更新:
你回答后,希望我能更好地理解你想要实现的目标。
这是我的观点:如果你想制作一个纹理的阴影,你可以简单地用这个纹理创建一个SKSpriteNode
:
let shadow = SKSpriteNode.init(texture: <yourTexture>)
shadow.blendMode = SKBlendMode.alpha
shadow.colorBlendFactor = 1
shadow.color = SKColor.black
shadow.alpha = 0.25
我想说的是,你可以一步一步来:
- 得到你的纹理
- 精心制作您的纹理(添加滤镜,制作其他效果..)
- 获取影子
这种工作方式产生了一系列有用的方法,您可以在项目中使用这些方法来构建其他类型的元素。
也许,通过分离你不需要使用的任务 texture(from:)
我已经解决了这个问题,使用工厂解决了我的问题。
从BenMobile's patient and clear articulation, here:
模糊 SKTexture
或 SKSpriteNode
存在问题,因为它会从 space 变成 运行。 blur/glow 超出了精灵的边缘。为了解决这个问题,在下面,您会看到我创建了一个 "framer" 对象。这只是一个空的 SKSpriteNode
,它是要模糊的纹理大小的两倍。要模糊的纹理作为子对象添加到此 "framer" 对象。
无论这有多么骇人听闻,它都能正常工作 ;)
静态工厂内部 class 文件:
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
}
}
在任何您可以访问要为其制作阴影或发光纹理的精灵的地方:
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 是完全不透明的)越低阴影越亮。
该定位用于将阴影略低于按钮,因此看起来光线从顶部射来,将阴影向下投射到背景上。