Получить и изменить оттенок SKColor от SKSpriteNode (HSBA)?

SKColor в SKSpriteNode может быть создан с помощью Hue, Saturation, Brightness & Alpha:

    let myColor = SKColor(hue: 0.5, saturation: 1, brightness: 1, alpha: 1)
 mySprite.color = myColor

Как я могу получить в оттенке SKSpriteNode и внести изменения в это? например, разделите это на 2.

2 ответа

Решение

SKSpriteNode это узел, который рисует текстуру (необязательно смешанную с цветом), изображение, цветной квадрат. Итак, это природа.

Когда вы делаете SKSpriteNode, у вас есть свойство экземпляра, представляющее текстуру, используемую для рисования спрайта, которое также называется текстурой

Начиная с iOS 9.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..
            }
}

После этого интересного ответа мы можем перевести его на более удобную версию Swift 3.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
            }
}

Я не в состоянии проверить это прямо сейчас, но смотрю на UIColor документация (UIColor и SKColor в основном одно и то же), вы должны быть в состоянии использовать .getHue(...) Функция извлекает компоненты цвета, вносит в него изменения, а затем устанавливает для свойства цвета SKSpriteNode новое значение. .getHue(...) функция "Возвращает компоненты, которые составляют цвет в цветовом пространстве HSB."

https://developer.apple.com/reference/uikit/uicolor/1621949-gethue

Другие вопросы по тегам