Я хотел бы переместить SKNode вдоль полуовального пути - PullRequest
0 голосов
/ 29 сентября 2019

Мой сценарий заключается в том, что я перемещаю существующий узел вдоль арки и хотел бы, чтобы он остановился, как только он достигнет другой стороны.Простая аналогия состоит в том, что я хочу, чтобы что-то двигалось по радуге.

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

Сокращенная версия моего кода:

override func didMove(to view: SKView) {
    let size = CGSize(width: frame.width - 60, height: 100)
    let box = SKSpriteNode(color: .orange,
                           size: CGSize(width: 30, height: 30))
    box.position = CGPoint(x: frame.midX, y: frame.midY)
    addChild(box)
    let origin = CGPoint(x: 30, y: frame.midY)
    let rect = CGRect(origin: origin, size: size)
    let path = UIBezierPath(ovalIn: rect)
    let action = SKAction.follow(path.cgPath,
                                 asOffset: false,
                                 orientToPath: false,
                                 speed: 250)
    box.run(action)
}

Приведенный выше код выдает это при запуске:

enter image description here

Моя цель - остановить оранжевую коробку, как только она достигнет левой стороны.

Я просмотрел различные инициализаторы UIBezierPath, и единственное, что выглядит многообещающе, - это использовать UIBezierPath(cgPath:).В идеале мне нужно было бы cgPath, чтобы заполнить это, чтобы удовлетворить мои критерии.

1 Ответ

0 голосов
/ 29 сентября 2019

Так что я был прав насчет подхода UIBezierPath(cgPath:).

Для меня ключевой задачей было запустить код, размещенный в вопросе, а затем захватить содержимое переменной path, чтобыЯ мог бы извлечь значения из этого.С их помощью я мог бы затем создать жестко закодированный CGPath, который затем мог бы использовать.

override func didMove(to view: SKView) {
    let box = SKSpriteNode(color: .orange,
                           size: CGSize(width: 30, height: 30))
    box.position = CGPoint(x: frame.midX, y: frame.midY)
    addChild(box)
    let path = UIBezierPath()
    let start = CGPoint(x: 345, y: 383.5)
    let end = CGPoint(x: 30, y: 383.5)
    let controlPoint = CGPoint(x: 190, y: 533.5)
    path.move(to: start)
    path.addQuadCurve(to: end, controlPoint: controlPoint)
    let action = SKAction.follow(path.cgPath,
                                 asOffset: false,
                                 orientToPath: false,
                                 speed: 250)
    box.run(SKAction.repeatForever(action))
}

Наконец, как это выглядит при использовании:

enter image description here

Если я уклонюсь от repeat на SKAction, он будет дополнен объектом, расположенным именно там, где я хочу.

Поскольку я не являюсь экспертом по SpriteKit, мне будет интересновыяснить, есть ли лучший способ приблизиться к этому.

...