获取和更改 SKSpriteNode 的 SKColor(HSBA) 的色调?
Get and change hue of SKSpriteNode's SKColor(HSBA)?
SKSpriteNode 的 SKColor 可以通过色调、饱和度、亮度和 Alpha 创建:
let myColor = SKColor(hue: 0.5, saturation: 1, brightness: 1, alpha: 1)
mySprite.color = myColor
如何获得 SKSpriteNode
的色调并对其进行更改?例如,除以 2。
我现在不在可以测试这个的地方,但是查看 UIColor
文档(UIColor 和 SKColor 基本上是一样的),你应该可以使用 .getHue(...)
函数检索颜色的组件,对其进行更改,然后将 SKSpriteNode 的颜色 属性 设置为新值。 .getHue(...)
函数 "Returns the components that make up the color in the HSB color space."
https://developer.apple.com/reference/uikit/uicolor/1621949-gethue
一个SKSpriteNode
是一个绘制纹理(可选混合颜色)、图像、彩色方块的节点。所以,这就是它的本性。
当你制作一个 SKSpriteNode
时,你有一个 实例 属性 表示用于绘制精灵的纹理也称为 texture
由于iOS9.x,我们可以按照下面的代码从纹理中检索图像。在此示例中,我将 SKSpriteNode
称为 spriteBg
:
let spriteBg = SKSpriteNode.init(texture: SKTexture.init(imageNamed: "myImage.png"))
if let txt = spriteBg.texture {
if #available(iOS 9.0, *) {
let image : UIImage = UIImage.init(cgImage:txt.cgImage())
} else {
// Fallback on earlier versions and forgot this code..
}
}
下面this有趣的回答,我们可以把它翻译成更舒服的Swift3.0版本:
func imageWith(source: UIImage, rotatedByHue: CGFloat) -> UIImage {
// Create a Core Image version of the image.
let sourceCore = CIImage(cgImage: source.cgImage!)
// Apply a CIHueAdjust filter
guard let hueAdjust = CIFilter(name: "CIHueAdjust") else { return source }
hueAdjust.setDefaults()
hueAdjust.setValue(sourceCore, forKey: "inputImage")
hueAdjust.setValue(CGFloat(rotatedByHue), forKey: "inputAngle")
let resultCore = hueAdjust.value(forKey: "outputImage") as! CIImage!
let context = CIContext(options: nil)
let resultRef = context.createCGImage(resultCore!, from: resultCore!.extent)
let result = UIImage(cgImage: resultRef!)
return result
}
所以,最后我们可以用前面的代码做:
if let txt = spriteBg.texture {
if #available(iOS 9.0, *) {
let image : UIImage = UIImage.init(cgImage:txt.cgImage())
let changedImage = imageWith(source: image, rotatedByHue: 0.5)
spriteBg.texture = SKTexture(image: changedImage)
} else {
// Fallback on earlier versions or bought a new iphone
}
}
SKSpriteNode 的 SKColor 可以通过色调、饱和度、亮度和 Alpha 创建:
let myColor = SKColor(hue: 0.5, saturation: 1, brightness: 1, alpha: 1)
mySprite.color = myColor
如何获得 SKSpriteNode
的色调并对其进行更改?例如,除以 2。
我现在不在可以测试这个的地方,但是查看 UIColor
文档(UIColor 和 SKColor 基本上是一样的),你应该可以使用 .getHue(...)
函数检索颜色的组件,对其进行更改,然后将 SKSpriteNode 的颜色 属性 设置为新值。 .getHue(...)
函数 "Returns the components that make up the color in the HSB color space."
https://developer.apple.com/reference/uikit/uicolor/1621949-gethue
一个SKSpriteNode
是一个绘制纹理(可选混合颜色)、图像、彩色方块的节点。所以,这就是它的本性。
当你制作一个 SKSpriteNode
时,你有一个 实例 属性 表示用于绘制精灵的纹理也称为 texture
由于iOS9.x,我们可以按照下面的代码从纹理中检索图像。在此示例中,我将 SKSpriteNode
称为 spriteBg
:
let spriteBg = SKSpriteNode.init(texture: SKTexture.init(imageNamed: "myImage.png"))
if let txt = spriteBg.texture {
if #available(iOS 9.0, *) {
let image : UIImage = UIImage.init(cgImage:txt.cgImage())
} else {
// Fallback on earlier versions and forgot this code..
}
}
下面this有趣的回答,我们可以把它翻译成更舒服的Swift3.0版本:
func imageWith(source: UIImage, rotatedByHue: CGFloat) -> UIImage {
// Create a Core Image version of the image.
let sourceCore = CIImage(cgImage: source.cgImage!)
// Apply a CIHueAdjust filter
guard let hueAdjust = CIFilter(name: "CIHueAdjust") else { return source }
hueAdjust.setDefaults()
hueAdjust.setValue(sourceCore, forKey: "inputImage")
hueAdjust.setValue(CGFloat(rotatedByHue), forKey: "inputAngle")
let resultCore = hueAdjust.value(forKey: "outputImage") as! CIImage!
let context = CIContext(options: nil)
let resultRef = context.createCGImage(resultCore!, from: resultCore!.extent)
let result = UIImage(cgImage: resultRef!)
return result
}
所以,最后我们可以用前面的代码做:
if let txt = spriteBg.texture {
if #available(iOS 9.0, *) {
let image : UIImage = UIImage.init(cgImage:txt.cgImage())
let changedImage = imageWith(source: image, rotatedByHue: 0.5)
spriteBg.texture = SKTexture(image: changedImage)
} else {
// Fallback on earlier versions or bought a new iphone
}
}