Search code examples
swiftrandomrgbuicolorarc4random

RGB Values doing strange things when colorizing? - Swift


func colorBall() {

let colorize1 = SKAction.colorizeWithColor(UIColor.redColor(), colorBlendFactor: 1.0, duration: 0.1)
let colorize2 = SKAction.colorizeWithColor(UIColor.greenColor(), colorBlendFactor: 1.0, duration: 0.1)
let colorize3 = SKAction.colorizeWithColor(UIColor.blueColor(), colorBlendFactor: 1.0, duration: 0.1)

let actions = [colorize1, colorize2, colorize3]
let randomIndex = Int(arc4random_uniform(3))
self.Ball.runAction(actions[randomIndex])


    }
 var colorBucket = [UIColor]()

func randomColor() -> UIColor {

    if colorBucket.isEmpty {
        fillBucket()

    }

    let randomIndex = Int(arc4random_uniform(UInt32(colorBucket.count)))
    let randomColor = colorBucket[randomIndex]
    colorBucket.removeAtIndex(randomIndex)
    return randomColor

}
  func fillBucket() {
    colorBucket = [UIColor.redColor(), UIColor.greenColor(), UIColor.blueColor()]
}

When I run this code in my game, and print out the color value of my ball, it sometimes prints out numbers like this:

 UIDeviceRGBColorSpace 1 2.98023e-08 2.98023e-08 1

Why does it do this? I just want it to say: UIDeviceRGBColorSpace 0 0 1 1 if it's blue, IDeviceRGBColorSpace 1 0 0 1 if it's red, etc.

How can I keep those numbers from going higher than one, or much lower than one? What makes them do that in my code?


Solution

  • Based partially on zneak's answer I've made this (no thrills or frills) extension to UIColor which could come in handy:

    extension UIColor {
        func isVisuallyEqual(color: UIColor) -> Bool {
            let compareValues = CGColorGetComponents(color.CGColor)
            let values = CGColorGetComponents(self.CGColor)
    
            let count = CGColorGetNumberOfComponents(self.CGColor)
            if count != CGColorGetNumberOfComponents(color.CGColor) {
                debugPrint("color-parameter has mismatching colorSpace")
                return false
            }
            for index in 0..<count {
                if !fuzzyFloatCompares(values[index], float2: compareValues[index]) {
                    return false
                }
            }
            return true
        }
    
        private func fuzzyFloatCompares(float1: CGFloat, float2: CGFloat) -> Bool {
            let difference = float1 - float2
            return difference >= -1/256 && difference <= 1/256
        }
    }