Gire o sprite por toque com uma velocidade de rotação limitada
Estou tentando fazer meu spriteNode girar sobre o toque do dedo.
Até agora eu posso fazer isso, mas o que eu quero é que meu nó tenha uma "velocidade de rotação". Então, calculo o comprimento do ângulo e defino um tempo diferente para girar com ele (se o arco for longo, levará tempo ...).
Aqui está o meu código:
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
_isTouched = true
for touch in touches {
let location:CGVector = touch.locationInNode(self) - miner.position
miner.weaponRotation = location.angle() - CGFloat(M_PI_2)
}
}
var wantedRotation: CGFloat {
get { return _wantedRotation }
set(rotation) {
if rotation > CGFloat(M_PI) || rotation < -CGFloat(M_PI) {
_wantedRotation = CGFloat(M_PI) + rotation % CGFloat(M_PI)
}
else {
_wantedRotation = rotation
}
removeActionForKey("rotation")
let arc: CGFloat = CGFloat(abs(_wantedRotation - zRotation))
let shortestArc: CGFloat = min(arc, CGFloat(M_PI * 2.0) - arc)
runAction(SKAction.rotateToAngle(_wantedRotation, duration: NSTimeInterval(shortestArc / CGFloat(M_PI) * rotationSpeed), shortestUnitArc: true), withKey: "rotation")
}
}
O principal problema é que adicionar váriosSKAction
para o nó bloquear o movimento.
Gostaria de saber qual poderia ser a solução? Se possível, usando o SKAction, pois eu gostaria de evitar fazer uma atualização em cada quadro para calcular o movimento (mas se é a única solução ...)
NOTA APÓS RESPOSTA
Ao receber respostas, li novamente a documentação do SpriteKit e encontreiesta nota clara :
Quando você não deve usar ações
Embora as ações sejam eficientes, há um custo para criá-las e executá-las. Se você estiver fazendo alterações nas propriedades de um nó em cada quadro de animação e essas alterações precisarem ser recalculadas em cada quadro, é melhor fazer as alterações diretamente no nó e não usar ações para fazê-lo. Para mais informações sobre onde você pode fazer isso no seu jogo, consulte Processamento de cena avançado.