2016-06-20 35 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()] 
} 

Wenn ich diesen Code in meinem Spiel laufen und aus dem Farbwert meines Ball drucken, druckt es manchmal aus Zahlen wie folgt aus:RGB Werte, die beim Kolorieren seltsame Dinge tun? - Swift

UIDeviceRGBColorSpace 1 2.98023e-08 2.98023e-08 1 

Warum es dies tut? Ich möchte nur sagen: UIDeviceRGBColorSpace 0 0 1 1 wenn es blau ist, IDeviceRGBColorSpace 1 0 0 1 wenn es rot ist, etc.

Wie kann ich verhindern, dass diese Zahlen höher als eins oder viel niedriger als eins werden? Was bringt sie dazu, das in meinem Code zu tun?

Antwort

1

teilweise auf zneak Antwort Basierend Ich habe das gemacht (keine Erregung oder Rüschen) Erweiterung zu UIColor, die sich als nützlich erweisen könnte:

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

Nachdem ich eine neue SWIFT-Datei erstellt habe, importiere UIKit und füge diesen Code ein. Muss ich etwas in meine GameScene.swift-Datei einfügen? –

+0

Nun, an jeder Stelle, an der Sie gerade 'isEqual:' aufrufen, sagen Sie 'sameSprite.color.isEqual (anotherSprite.color)', dass Sie den Aufruf durch 'isVisuallyEqual:' ersetzen sollen. –

1

2.98023e-08 ist 0.0000000298023. Wenn Sie den Wert 2.98023e-08 bei Google oder einer anderen Suchmaschine nachschlagen, finden Sie mehrere Beispiele für Personen, die diesen Wert aufgrund von Rundungsfehlern erhalten. Rundungsfehler treten wegen how computers treat floating-point numbers auf.

Es ist wahrscheinlich ein Rundungsfehler aus dem Interpolationscode, colorizeWithColor verwendet, und Sie erhalten es anstelle von Null. Für praktische Zwecke, wenn über Farbkomponenten gesprochen wird, die einem Endbenutzer angezeigt werden sollen, würde ich sagen, dass alles, was kleiner als 1/256 ist, als Null betrachtet werden kann.

Sie können testen, ob zwei Gleitkommazahlen „ungefähr gleich“ wie folgt aus (getippt auf meinem Handy, nicht wirklich arbeiten, garantiert) sind:

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

Wissen Sie, wie Sie es beheben können? Oder wo ich hingehen könnte, um eine Lösung zu finden? –

+0

Was brauchst du, um eine genaue 0 zu erhalten? Das könnte sein, was du reparieren könntest. Es ist unwahrscheinlich, dass Sie Apples Code erhalten können, um genau 0 zurückzugeben. – zneak

+0

Weil ich zwei Objekte mit Farbeigenschaften vergleiche. Und wenn sie nicht genau die gleichen RGB-Werte teilen, wird es denken, dass die Objekte unterschiedliche Farben haben, wenn sie tatsächlich gleich sind. –