アニメーション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)
これは機能しました。しかし、 '.clear'はイメージを見失わないようです。狂ったことに対する他の提案はありますか? –
解決しました。 colorBlendFactorを0に変更し、 'SKAction'を再度適用してフィルタを削除してください。 –
ええ、申し訳ありません、追加することを忘れてしまったのは、colorBlendFatorを0に設定して、元に戻す必要があるということです。ありがとう!私は今答えを編集しました。 – JohnV