Перетащите Повернуть узел вокруг фиксированной точки
Я пытаюсь создать вращающийся узел, похожий на «призовое колесо» вэтот вопрос, Пока у меня есть возможность бросать, добавляя угловые импульсы к физическому телу, используя UIPanGestureRecognizer, который работает очень хорошо. Я также могу остановить вращение, используя прикосновение.
Теперь я пытаюсь разрешить точную настройку колеса с помощью жеста перетаскивания или смахивания, чтобы, если игрок не доволен тем, что у него получилось, он может вручную вращать / перетаскивать / вращать его в предпочтительное вращение.
В настоящее время я сохраняю местоположение касания в touchesBegan и пытаюсь увеличить zRotation моего узла в цикле обновления.
Вращение не следует за моим пальцем и прерывисто. Я не уверен, получаю ли я достаточно точные показания о движении пальца или если положение изменения пальца не переводится точно в радианы. Я подозреваю, что обнаружение касания, а затем работа с ним в обновлении не является хорошим решением.
Вот мой код
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent?) {
if let touch = touches.first as? UITouch {
var location = touch.locationInView(self.view)
location = self.convertPointFromView(location)
mostRecentTouchLocation = location
let node = nodeAtPoint(location)
if node.name == Optional("left") && node.physicsBody?.angularVelocity != 0
{
node.physicsBody = SKPhysicsBody(circleOfRadius:150)
node.physicsBody?.applyAngularImpulse(0)
node.physicsBody?.pinned = true
}
}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if mostRecentTouchLocation != CGPointZero{
let node = nodeAtPoint(mostRecentTouchLocation)
if node.name == Optional("left")
{
var positionInScene:CGPoint = mostRecentTouchLocation
let deltaX:Float = Float(positionInScene.x) - Float(node.position.x)
let deltaY:Float = Float(positionInScene.y) - Float(node.position.y)
let angle:CGFloat = CGFloat(atan2f(deltaY, deltaX))
let maths:CGFloat = angle - (CGFloat(90) * (CGFloat(M_PI) / 180.0))
node.zRotation += maths
mostRecentTouchLocation = CGPointZero
}
}
}
В этом обновлении я распределил некоторые математические функции по нескольким строкам, чтобы облегчить отладку.
Я могу добавить код PanGestureRecognizer, если это необходимо, но сейчас я постараюсь сделать его кратким.
РЕДАКТИРОВАТЬ Вот мой последний код, основанный на рекомендации GilderMan. Я думаю, что это работает лучше, но вращение далеко не гладкое. Он прыгает большими шагами и плохо следит за пальцем. Значит ли это что-то не так с моим расчетом угла?
override func didSimulatePhysics() {
if mostRecentTouchLocation != CGPointZero {
let node = nodeAtPoint(mostRecentTouchLocation)
if node.name == Optional("left")
{
var positionInScene:CGPoint = mostRecentTouchLocation
let deltaX:Float = Float(positionInScene.x) - Float(node.position.x)
let deltaY:Float = Float(positionInScene.y) - Float(node.position.y)
let angle:CGFloat = CGFloat(atan2f(deltaY, deltaX))
node.zRotation += angle
println(angle)
mostRecentTouchLocation = CGPointZero
}
}
}