ios - 如何使 Sprite 节点的纹理变暗

标签 ios swift sprite-kit

我有以下代码,我在其中创建了一个显示动画 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/

相关文章:

ios - 如何在 Swift3 中使用可选动画实现功能

ios - 如果用户已经使用 facebook 登录,则使用 swift 调用 segue

ios - 是Revmob,Admob,apple id都是行为广告

ios - Sprite Kit 相机平滑移动延迟

swift - 如何在整个游戏中的多个位置添加治疗节点?

objective-c - iOS:访问 XML 数据记录的简便方法?

ios - 为什么不将工作从 NSData 转换为 String? swift

ios - 使用代码在 Xcode 中欺骗 iPhone 位置

ios - 尝试使用 Realm 时应用程序崩溃 SIGABRT

ios - SpriteKit 游戏物理滞后