2017-07-27 14 views
1

アニメーションGIFを表示するスプライトノードを作成するには、次のコードを用意します。私は呼び出されたときにGIFを暗くする別の関数を作成したい。私はまだアニメーションを見ることができますが、内容は目に見えて暗くなります。私はこれにどのように接近するか分からない。アニメーションの作成に使用したテクスチャやフレームを個別に暗くする必要がありますか?もしそうなら、最初にテクスチャやフレームをどのように暗くするのですか?スプライトノードのテクスチャを黒くする方法

// 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) 

答えて

0

私はcolorize(with:colorBlendFactor:duration:)メソッドを使用することをお勧めします。これは、ノード全体の色をアニメーション化するSKActionです。そうすることで、個々のテクスチャやフレームを暗くする必要がなくなり、暗い色から暗い色に素早く切り替えることができます。アクションが終了すると、ノードはあなたがそれを知らないうちに暗くなるので、ノードのテクスチャへの変更もユーザーに暗く表示されます。

必要な暗い効果を得るには、どの色やcolorBlendFactorを選択してください。 color.blackに、colorBlendFactorを0.3に設定できます。見逃すには、.clearcolorBlendFactorから0に設定してください。

ドキュメントhere

希望すると便利です。

+0

これは機能しました。しかし、 '.clear'はイメージを見失わないようです。狂ったことに対する他の提案はありますか? –

+1

解決しました。 colorBlendFactorを0に変更し、 'SKAction'を再度適用してフィルタを削除してください。 –

+0

ええ、申し訳ありません、追加することを忘れてしまったのは、colorBlendFatorを0に設定して、元に戻す必要があるということです。ありがとう!私は今答えを編集しました。 – JohnV

関連する問題