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
выполнять действия одно за другим.
Надеюсь это поможет!