Xcode Swift SKAction.follow начальная точка

Я пытаюсь сделать космический корабль вокруг планеты. Я сейчас занимаюсь

let playerPos = player.position
let planetPos = planet.position

let radius = playerPos.x - planetPos.x

let rect = CGRect(x: planetPos.x - radius, y: planetPos.y - radius, width: 2 * radius, height: 2 * radius)

let bezPath = UIBezierPath(roundedRect: rect, cornerRadius: 0)
let path = bezPath.cgPath

let shape = SKShapeNode(path: path)
shape.strokeColor = .blue
shape.zPosition = 10
self.addChild(shape)

let move = SKAction.follow(path, asOffset: false, orientToPath: true, speed: 200)

и это создает правильный путь, скриншот

Тем не менее, когда я пытаюсь запустить move Действие, игрок телепортируется прямо под планету, а затем начинает следовать по пути. Есть ли способ заставить его начать следовать по пути от того места, где сейчас находится игрок? Я открыт для того, чтобы полностью изменить то, как я собираюсь заставить корабль двигаться по кругу, пока он начинает, где он находится, и кружит вокруг планеты.

2 ответа

Решение было использовать вместо CGMutablePath

let dx = playerPos.x - planetPos.x
let dy = playerPos.y - planetPos.y
let currentTheta = atan(dy / dx)
let endTheta = currentTheta + CGFloat(Double.pi * 2)

let newPath = CGMutablePath.init()
newPath.move(to: player.position)
newPath.addArc(center: planetPos, radius: radius, startAngle: currentTheta, endAngle: endTheta, clockwise: false)

let move = SKAction.follow(newPath, asOffset: false, orientToPath: true, speed: 200)
player.run(SKAction.repeatForever(move))

newPath.move(to: player.position) линия начинает путь в позиции корабля и newPath.addArc линия рисует круг с позиции игрока и делает вращение на 360 градусов вокруг планеты, оказываясь обратно на позиции игрока.

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

Если это так, вы можете рассмотреть возможность выполнения другого действия, чтобы сначала переместить игрока из его текущей позиции в какую-то начальную точку на пути, например CGPoint(x: planetPos.x - radius, y: planetPos.y - radius), Затем, когда игрок достигнет этой точки, запустите move действие, которое вы определили. Ты можешь использовать SKAction.sequence выполнять действия одно за другим.

Надеюсь это поможет!

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