2017-07-27 1 views
1

Ich habe den folgenden Code, wo ich einen Sprite-Knoten erstellen, der ein animiertes GIF anzeigt. Ich möchte eine andere Funktion erstellen, die das GIF verdunkelt, wenn es aufgerufen wird. Ich könnte immer noch in der Lage sein, die Animation zu sehen, aber der Inhalt wäre sichtbar dunkler. Ich bin mir nicht sicher, wie ich das angehen soll. Soll ich jede Textur oder jeden Frame, der zum Erstellen der Animation verwendet wird, individuell verdunkeln? Wenn ja, wie verdunkle ich eine Textur oder einen Rahmen überhaupt?So verdunkeln Sie die Textur des Sprite-Knotens

// Extract frames and duration 
    guard let imageData = try? Data(contentsOf: url as URL) else { 
     return 
    } 
    let source = CGImageSourceCreateWithData(imageData as CFData, nil) 
    var images = [CGImage]() 
    let count = CGImageSourceGetCount(source!) 
    var delays = [Int]() 
    // Fill arrays 
    for i in 0..<count { 
     // Add image 
     if let image = CGImageSourceCreateImageAtIndex(source!, i, nil) { 
      images.append(image) 
     } 

     // At it's delay in cs 
     let delaySeconds = UIImage.delayForImageAtIndex(Int(i), 
                 source: source) 
     delays.append(Int(delaySeconds * 1000.0)) // Seconds to ms 
    } 

    // Calculate full duration 
    let duration: Int = { 
     var sum = 0 

     for val: Int in delays { 
      sum += val 
     } 

     return sum 
    }() 

    // Get frames 
    let gcd = SKScene.gcdForArray(delays) 
    var frames = [SKTexture]() 

    var frame: SKTexture 
    var frameCount: Int 
    for i in 0..<count { 
     frame = SKTexture(cgImage: images[Int(i)]) 
     frameCount = Int(delays[Int(i)]/gcd) 

     for _ in 0..<frameCount { 
      frames.append(frame) 
     } 
    } 


    let gifNode = SKSpriteNode.init(texture: frames[0]) 
    gifNode.position = CGPoint(x: skScene.size.width/2.0, y: skScene.size.height/2.0) 
    gifNode.name = "content" 


    // Add animation 
    let gifAnimation = SKAction.animate(with: frames, timePerFrame: ((Double(duration)/1000.0))/Double(frames.count)) 
    gifNode.run(SKAction.repeatForever(gifAnimation)) 
    skScene.addChild(gifNode) 

Antwort

0

würde ich empfehlen, die colorize(with:colorBlendFactor:duration:) Methode zu verwenden. Es ist ein SKAction, der animiert, die Farbe eines ganzen Knotens zu ändern. Auf diese Weise müssen Sie nicht die einzelnen Texturen oder Rahmen verdunkeln, und es fügt auch einen schönen Übergang von einer nicht dunklen zu einer dunklen Farbe hinzu. Sobald die Aktion beendet ist, bleibt der Knoten dunkel, bis Sie ihn deaktivieren, sodass alle Änderungen an der Textur des Knotens auch als dunkle Punkte für den Benutzer sichtbar sind.

Wählen Sie eine beliebige Farbe und FarbeBlendFactor funktioniert am besten, wenn Sie den gewünschten dunklen Effekt erzielen möchten, z. Sie könnten color auf .black und colorBlendFactor auf 0,3 setzen. Zum Deaktivieren setzen Sie einfach die Farbe .clear und colorBlendFactor auf 0.

Dokumentation here.

Hoffe, das hilft!

+0

Es hat funktioniert! ".clear" scheint das Bild jedoch nicht zu deaktivieren. Irgendwelche anderen Vorschläge für das Deaktivieren? –

+1

Gelöst es. Ändern Sie einfach den colorBlendFactor auf 0 und wenden Sie die 'SKAction' erneut an, um den Filter zu entfernen. –

+0

Ja, leider vergessen zu hinzufügen, dass Sie den colorBlendFator auf 0 setzen sollten, um zu deaktivieren. Vielen Dank! Ich habe die Antwort jetzt bearbeitet. – JohnV

Verwandte Themen