Как изменить цвет SKShapeNode случайным образом при каждом появлении?

В настоящее время при запуске этого кода цветной шарик бежит от верхней части экрана к нижней. Когда он достигает дна, он возрождается наверху и снова падает. Мне нужно, чтобы мяч менялся на случайный цвет каждый раз, когда он снова появляется. У меня есть действие colorChange, но оно по-прежнему не меняет цвет мяча при запуске.

import SpriteKit

class GameScene: SKScene {



    let ball = SKShapeNode(circleOfRadius: 20)
    let label = SKLabelNode(fontNamed: "Futura")

    let colorChange = SKAction.colorizeWithColor(.blueColor(), colorBlendFactor: 1, duration: 1)


    let randomRed = Int(arc4random_uniform(255))
    let randomGreen = Int(arc4random_uniform(255))
    let randomBlue = Int(arc4random_uniform(255))

    override func didMoveToView(view: SKView) {

        let sceneBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        self.physicsBody = sceneBody

        //Ball Transition
        let ballTransition = SKAction.sequence([SKAction.fadeInWithDuration(1)])
        ball.runAction(ballTransition)

        ball.fillColor = UIColor(red: 100, green: 100, blue: 0, alpha: 1)
        ball.physicsBody = SKPhysicsBody(circleOfRadius: 25)
        ball.physicsBody?.affectedByGravity = false

        ball.position = CGPoint(x: self.frame.size.width/2, y: CGFloat(self.frame.size.height*1))

        ballMovement()

        self.addChild(ball)

        self.addChild(label)
    }

    func ballMovement() {
        let moveBall = SKAction.moveToY(0, duration: 3)
        let goBackUp = SKAction.moveToY(self.frame.size.height, duration:0)
        let keepFalling = SKAction.sequence([moveBall, goBackUp, colorChange])
        ball.runAction(SKAction.repeatActionForever(keepFalling))

        //Label Sprite
        label.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
        label.fontColor = SKColor.redColor()
        label.fontSize = 30
    }




    override func update(currentTime: CFTimeInterval) {

        label.text = "\(ball.position.y)"

        if ball.position.y < 26 {
            ball.position = CGPoint(x: self.frame.size.width/2, y: CGFloat(self.frame.size.height*1))
        }
    }


}

person user6686513    schedule 15.08.2016    source источник
comment
Ваш синий цвет заливки равен 0. Когда вы умножаете что-либо на 0, он остается равным нулю, даже если коэффициент смешивания цветов равен 1. Если вы планируете использовать раскрашивание, вам нужно начать с белого (1,1,1,1). Я не уверен, устанавливает ли действие цвет после завершения, поэтому вместо этого просто измените цвет заливки на желаемый цвет. Используйте customActionWithDuration, если вы хотите сделать эффект перехода   -  person Knight0fDragon    schedule 15.08.2016


Ответы (2)


Вместо того, чтобы использовать SKAction для изменения цвета, просто выполните

ball.color = UIColor...

Чтобы создать случайный цвет, проверьте это: Как сделать случайный цвет фона в Swift

и используйте это для генерации случайного цвета

ball.color = .randomColor()
person Entitize    schedule 15.08.2016

Я предлагаю вам не использовать SKShape для важной движущейся части, потому что я считаю, что они могут замедлить работу приложения и вызвать проблемы. Вместо мяча я бы использовал SKSpritenode. Если вы затем сделаете мяч по умолчанию полностью белым, вы можете изменить цвет, выполнив следующие действия:

ball.colorBlendFactor = 1

ball.color = SKColor(hue: randomNumberFunctionBetweenZeroAndOne(), saturation: 0.75, contrast: 0.5) 

Оттенок должен быть случайным значением от 0 до 1.

Если вы поместите это внутрь функции, вы можете вызвать функцию, чтобы изменить цвет мяча внутри и SKAction или где-нибудь еще.

person Nik    schedule 19.08.2016