在 spritekit 中更改节点颜色

阿曼·卡普尔

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

https://ibb.co/bNH7P8

卢卡·安杰莱蒂

在此处输入图片说明

图片

你需要两张图片,绿色的

在此处输入图片说明

和红色的。

在此处输入图片说明

元素

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

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 表示全绿色)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章