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()]
}
当我在游戏中运行此代码并打印出我的球的颜色值时,它有时会打印出这样的数字:
UIDeviceRGBColorSpace 1 2.98023e-08 2.98023e-08 1
为什么这样做?我只是想说:UIDeviceRGBColorSpace 0 0 1 1如果它是蓝色,IDeviceRGBColorSpace 1 0 0 1如果它是红色等等。
如何保持这些数字不高于1或远低于1?是什么让他们在我的代码中这样做?
答案 0 :(得分:1)
2.98023e-08是0.0000000298023。如果您在Google或其他搜索引擎上查找值2.98023e-08,您可以找到几个人因为舍入错误而获得该值的示例。由于how computers treat floating-point numbers而发生舍入错误。
这可能是colorizeWithColor
使用的插值代码的舍入误差,而不是零。出于实际目的,当谈到即将向最终用户显示的颜色成分时,我会说任何小于1/256的东西都可以被认为是零。
您可以测试两个浮点数是否“大致相等”(在我的手机上键入,并不能保证正常工作):
func areAboutTheSame(a: Double, b: Double) -> Bool {
let difference = a-b
return difference < 1/256 && difference > -1/256
}
答案 1 :(得分:1)
部分基于zneak的回答我已经将这个(没有刺激或褶边)扩展到UIColor,这可能会派上用场:
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
}
}