我有以下代码,我在其中创建了一个显示动画 GIF 的 Sprite 节点。我想创建另一个函数,在调用时使 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)
最佳答案
我建议使用 colorize(with:colorBlendFactor:duration:)
方法。它是一个 SKAction,可以动画更改整个节点的颜色。这样您就不必使单个纹理或帧变暗,而且它还添加了从非暗色到暗色的漂亮过渡。操作结束后,节点将保持变暗,直到您取消变暗,因此对节点纹理的任何更改也将作为暗端对用户可见。
选择任何颜色和 colorBlendFactor 最适合您以获得所需的变暗效果,例如您可以将 color
设置为 .black
并将 colorBlendFactor
设置为 0.3。要变暗,只需将颜色设置为 .clear
并将 colorBlendFactor
设置为 0。
文档 here .
希望这对您有所帮助!
关于ios - 如何使 Sprite 节点的纹理变暗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45355143/