ios - 在 spritekit 中更改节点颜色

标签 ios colors sprite-kit skspritenode vector-graphics

我有一个带有几片叶子的 Twig 的矢量图。我正在将分支从屏幕底部移动到屏幕顶部。但是,当分支从初始位置(屏幕底部)移动到最终位置(屏幕顶部)时,我希望分支在移动到顶部时将颜色从绿色更改为橙​​色。它应该是一个平稳的过渡。我有 Twig 和树叶作为矢量图像。我正在使用 spritekit(ios) 进行开发。该分支已附加在下面的链接中 我不希望颜色立即从绿色变为红色。我希望当 Twig 移动到顶部时它慢慢地从绿色过渡到红色

https://ibb.co/bNH7P8

最佳答案

enter image description here

图片

你需要两张图片,绿色的一张

enter image description here

还有红色的。

enter image description here

元素

现在你需要一个节点来保存两个图像

class Element: SKNode {

    private let green = SKSpriteNode(imageNamed: "green")
    private let red = SKSpriteNode(imageNamed: "red")

    override init() {
        super.init()
        self.addChild(green)
        red.alpha = 0
        self.addChild(red)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func turnRed(duration: TimeInterval) {
        green.run(.fadeOut(withDuration: duration))
        red.run(.fadeIn(withDuration: duration))
    }

}

动画

最后你只需要调用turnRed(duration:)方法

class GameScene: SKScene {

    let element = Element()

    override func didMove(to view: SKView) {
        self.addChild(element)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        // move the element to bottom
        let bottomY = self.frame.minY + element.calculateAccumulatedFrame().height / 2
        let moveToBottom = SKAction.moveTo(y: bottomY, duration: 2)
        element.run(moveToBottom)

        // change the color
        element.turnRed(duration: 2)
    }
}

更新

如果你想在给定的绿色和红色比例下设置颜色,那么使用下面的代码

class Element: SKNode {

    private let green = SKSpriteNode(imageNamed: "green")
    private let red = SKSpriteNode(imageNamed: "red")

    override init() {
        super.init()
        self.addChild(green)
        red.alpha = 0
        self.addChild(red)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // colorProgressionRatio must be a value between 1 (full green) and 0 (full red)
    func update(colorProgressionRatio: CGFloat) {
        guard colorProgressionRatio >= 0 && colorProgressionRatio <= 1 else {
            debugPrint("colorProgressionRatio must be a value between 0 and 1")
            return
        }

        let greenIntensity: CGFloat
        let redIntensity: CGFloat

        if colorProgressionRatio == 0 {
            greenIntensity = 0
            redIntensity = 1
        } else if colorProgressionRatio == 1 {
            greenIntensity = 1
            redIntensity = 0          
        } else {
            greenIntensity = colorProgressionRatio
            redIntensity = 1 - colorProgressionRatio
        }

        green.run(.fadeAlpha(to: greenIntensity, duration: 2))
        red.run(.fadeAlpha(to: redIntensity, duration: 2))

    }

}

现在你只需要调用

element.update(colorProgressionRatio: 0.4)

传递一个介于 0 和 1 之间的值(0 表示红色,1 表示全绿色)。

关于ios - 在 spritekit 中更改节点颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51230937/

相关文章:

ios - UITableView 没有填满数据

ios - 在 iOS 上将 UIView 导出为 png

ios - 我怎样才能像在谷歌地图中那样缩放

ios - 如何以编程方式更新 SKScene?

ios - 如何将此游戏代码转换为 Swift 4?

ios - 如何在 SpriteKit 中使用不同大小的纹理制作动画

ios - Swift - 如何在 Firebase 上创建降序排序查询?

matlab - 如何在 MATLAB 中为曲面的不同侧面选择不同的颜色

在 R 中删除 spplot 上的色标?

javascript - 基于列的 Highchart 钻取系列为每列分配颜色代码