2017-07-27 35 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,它可以改变整个节点的颜色。这样,您就不必逐渐变暗个别纹理或框架,并且还可以添加从非黑暗到黑暗颜色的良好转变。一旦动作结束,节点将保持黑暗状态,直到您将其解除为止,因此对节点的纹理所做的任何更改都会在用户不熟悉时显示出来。

选择任何颜色和颜色BlendFactor将最适合您的需要,例如黑暗效果。您可以将color设置为.blackcolorBlendFactor设置为0.3。要取消注释,只需将颜色设置为.clearcolorBlendFactor为0.

文档here

希望这会有所帮助!

+0

它的工作!然而,'.clear'似乎并没有使图像脱颖而出。还有其他建议吗? –

+1

解决了它。只需将colorBlendFactor更改为0,然后重新应用SKAction来移除过滤器。 –

+0

是的,不好意思忘了补充一点,你应该把colorBlendFator设置为0来解除。谢谢!我现在编辑了答案。 – JohnV