2016-06-20 55 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值在着色時做奇怪的事情? - 斯威夫特

UIDeviceRGBColorSpace 1 2.98023e-08 2.98023e-08 1 

它爲什麼要這樣做呢?我只想讓它說:UIDeviceRGBColorSpace 0 0 1 1如果它是藍色的,IDeviceRGBColorSpace 1 0 0 1如果它是紅色的等

如何保持這些數字不會高於1或遠低於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,你可以找到幾個人因爲舍入錯誤而獲得價值的例子。由於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?這可能是你可以修復的。這是不可能的,你可以讓蘋果的代碼返回一個確切的0. – zneak

+0

因爲我比較兩個對象的顏色屬性。如果它們不共享完全相同的RGB值,則它們會認爲實際上相同的對象是不同的顏色。 –