Как замедлить до остановки вращающегося SKNode

У меня есть SKNode, представляющий собой круг, разделенный на четыре четверти (каждая четверть разным цветом). к этому кругу я установил SKAction, чтобы раскрутить его. У меня есть 3 проблемы / вопросы:

  1. щас пользуюсь obstacle.run(SKAction.repeat(rotateAction, count: 10)) которые всегда останавливаются в начальном порядке (верхний правый - фиолетовый, верхний левый - желтый и т. д.) - как я могу установить его разным (использовать случайную функцию?).

  2. когда круг вращается, его внезапная остановка (после 10 повторений) - проблема в том, что он не замедляется до своей остановки. Я хочу, чтобы это было более "реалистично" - быстро вращаться -> начинать замедляться -> останавливаться. как мне это сделать?

  3. как я могу установить, что верхняя правая четверть будет немного больше, чем остальные три четверти? Я имею в виду, что в каждом вращении верхний правый будет немного отличаться?

вот мой код до сих пор:

class GameScene: SKScene {

let colors = [SKColor.yellow, SKColor.red, SKColor.blue, SKColor.purple]


override func didMove(to view: SKView) {
    createWheel()

    }



override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
}


func createWheel() {
    // 1
    let path = UIBezierPath()
    // 2
    path.move(to: CGPoint(x: 0, y: 0))
    // 3
    path.addLine(to: CGPoint(x: 0, y: -200))
    // 4
    path.addArc(withCenter: CGPoint.zero,
                radius: 200,
                startAngle: CGFloat(0.0),
                endAngle: CGFloat(3.0 * Double.pi / 2),
                clockwise: false)
    // 5
    path.addLine(to: CGPoint(x: 200, y: 0))

    let obstacle = obstacleByDuplicatingPath(path, clockwise: true)
    obstacle.position = CGPoint(x: size.width/2, y: size.height/2)
    addChild(obstacle)

    let rotateAction = SKAction.rotate(byAngle: CGFloat(3.0 * CGFloat(Double.pi / 2)), duration: 0.5)
    //obstacle.run(SKAction.repeatForever(rotateAction))
    obstacle.run(SKAction.repeat(rotateAction, count: 10))


}

func obstacleByDuplicatingPath(_ path: UIBezierPath, clockwise: Bool) -> SKNode {
    let container = SKNode()

    var rotationFactor = CGFloat(Double.pi / 2)
    if !clockwise {
        rotationFactor *= -1
    }

    for i in 0...3 {
        let section = SKShapeNode(path: path.cgPath)
        section.fillColor = colors[i]
        section.strokeColor = colors[i]
        section.zRotation = rotationFactor * CGFloat(i);

        let origin = CGPoint(x: 0.0, y: 0.0)
        switch i {
        case 0:
            section.position = CGPoint(x: (origin.x + 10), y: (origin.y - 10))
        case 1:
            section.position = CGPoint(x: (origin.x + 10), y: (origin.y + 10))
        case 2:
            section.position = CGPoint(x: (origin.x - 10), y: (origin.y + 10))
        case 3:
            section.position = CGPoint(x: (origin.x - 10), y: (origin.y - 10))
        default:
            print("bolbol")

        }

        container.addChild(section)
    }
    return container
}

}

0 ответов

Другие вопросы по тегам