Изменить цвет узла в spritekit

У меня есть векторная иллюстрация ветки с несколькими листьями на ней. Я перемещаю ветку с нижней части экрана в верхнюю часть экрана. Но по мере того, как ветка перемещается из исходного положения (снизу экрана) в конечное положение (верх экрана), я хочу, чтобы ветви меняли цвет от зеленого до оранжевого, когда они перемещаются в верхнюю часть. Это должен быть плавный переход. У меня есть ветка и листья как векторные изображения. Я использую spritekit (ios) для разработки. Филиал был прикреплен по ссылке ниже. Я не хочу, чтобы цвет мгновенно менялся с зеленого на красный. Я хочу, чтобы он медленно переходил из зеленого в красный, когда ветка перемещается в верхнюю часть

https://ibb.co/bNH7P8

ios,colors,sprite-kit,skspritenode,vector-graphics,

0

Ответов: 1


1 принят

введите описание изображения здесь

Изображений

Вам понадобятся 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")
    }

    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 означает полный зеленый цвет).

КСН цвет, спрайты-комплект, skspritenode, вектор-график,
Похожие вопросы