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色付けするときに奇妙なことをする値はありますか? - 私は私のゲームでこのコードを実行すると、私のボールの色の値をプリントアウトするとスウィフト

UIDeviceRGBColorSpace 1 2.98023e-08 2.98023e-08 1 

なぜそれがこれを行うのですか?私はちょうどそれが言いたい:UIDeviceRGBColorSpace青、IDeviceRGBColorSpace 1 0 0 1それが赤い場合など1

私はそれらの数値が1より大きくなる、または1よりもずっと低くならないようにする方法はありますか?彼らは私のコードでそれを何にするのでしょうか?

答えて

1

私はこれを作ったの(スリルやフリルがない)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である。 Googleや他の検索エンジンで2.98023e-08の値を調べると、丸め誤差のために値を取得する人々の例がいくつか見つかります。丸め誤差はhow computers treat floating-point numbersのため発生します。

colorizeWithColorが使用している補間コードからの丸め誤差で、ゼロの代わりに値が返されている可能性があります。実用的な目的のために、エンドユーザに表示しようとする色成分について話すとき、私は1/256より小さいものはゼロであると考えることができると言いたい。

2つの浮動小数点数は次のように(実際に動作する保証はありません、私の携帯電話に入力された)「ほぼ等しい」している場合は、テストすることができます。zneakの答えに部分的に基づき

func areAboutTheSame(a: Double, b: Double) -> Bool { 
    let difference = a-b 
    return difference < 1/256 && difference > -1/256 
} 
+0

あなたはそれを修正する方法を知っていますか?それとも解決策を見つけるためにどこに行くことができるのですか? –

+0

あなたは正確な0を得ることに頼って何をしますか?それはあなたが修正できるものかもしれません。正確に0を返すようにAppleのコードを取得することはほとんどありません。 – zneak

+0

2つのオブジェクトの色のプロパティを比較しているためです。そして、もし彼らが正確に同じRGB値を共有していなければ、オブジェクトは実際に同じ色であると考えるでしょう。 –

関連する問題