Arraste Girar um nó em torno de um ponto fixo
Estou tentando criar um nó giratório semelhante à "roda do prêmio" noessa questão. Até agora, tenho a capacidade de arremessar, adicionando impulsos angulares em um corpo físico usando um UIPanGestureRecognizer que funciona muito bem. Também posso parar a rotação usando um toque.
Agora, estou tentando permitir o ajuste fino da roda usando um gesto de arrastar ou deslizar; assim, se o jogador não estiver satisfeito com o que acaba, poderá girar / arrastar / girar manualmente para a rotação preferida.
Atualmente, salve o local do toque em touchesBegan e tento incrementar o zRotation do meu nó no loop de atualização.
A rotação não segue meu dedo e é irregular. Não tenho certeza se estou recebendo uma leitura suficientemente precisa sobre o movimento do dedo ou se a mudança de posição do dedo não está sendo traduzida com precisão em radianos. Suspeito de detectar o toque e, em seguida, lidar com ele na atualização não é uma ótima solução.
Aqui está o meu código.
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
}
}
}
Espalhei algumas das matemáticas por várias linhas na atualização para facilitar a depuração.
Posso adicionar o código PanGestureRecognizer, se necessário, mas tentarei mantê-lo breve por enquanto.
EDITAR Aqui está o meu código mais recente, com base na recomendação do GilderMan. Eu acho que está funcionando melhor, mas a rotação está longe de ser suave. Ele está pulando em grandes incrementos e não segue bem o dedo. Isso significa que há algo errado com meu cálculo de ângulo?
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
}
}
}