2016-06-20 1 views
0
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()] 
} 

Когда я запускаю этот код в моей игре, и распечатать значение цвета моего шара, иногда печатает числа как это:RGB Ценности делают странные вещи при раскраске? - Swift

UIDeviceRGBColorSpace 1 2.98023e-08 2.98023e-08 1 

Почему он это делает? Я просто хочу сказать: UIDeviceRGBColorSpace 0 0 1 1, если он синий, IDeviceRGBColorSpace 1 0 0 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 
    } 
} 
+0

После того как я создаю новый .swift-файл, импортируйте UIKit и вставьте этот код, мне нужно что-то поместить в файл GameScene.swift? –

+0

Ну, в любом месте, которое вы теперь вызываете 'isEqual:' в экземпляре цвета, например 'someSprite.color.isEqual (anotherSprite.color)' вы должны заменить вызов 'isVisuallyEqual:'. –

1

2.98023e-08 - 0.0000000298023. Если вы посмотрите на значение 2.98023e-08 в Google или другой поисковой системе, вы можете найти несколько примеров того, как люди получают это значение из-за ошибок округления. Ошибки округления происходят из-за 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 
} 
+0

Знаете ли вы, как исправить это? Или где я могу найти решение? –

+0

Что вы делаете, полагаясь на получение точного 0? Это может быть то, что вы можете исправить. Маловероятно, что вы можете заставить код Apple вернуть точное 0. – zneak

+0

Потому что я сравниваю свойства цвета двух объектов. И если они не разделяют те же самые значения RGB, они будут думать, что объекты имеют разные цвета, когда они на самом деле одинаковы. –

Смежные вопросы