我想让我的spriteNode在手指触摸时旋转。
到目前为止,我已经做到了,但是我希望我的节点有一个“旋转速度”。 因此,我计算角度的长度,然后设置不同的时间来旋转它(如果弧长很长,它将需要更多的时间…)。
这是我的代码:
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")
}
}
主要问题是将多个
SKAction
添加到节点会阻止移动。
我想知道可能的解决方案是什么?如果可能的话,使用SKAction,因为我想避免在每一帧上进行更新以计算移动(但如果这是唯一的解决方案...)
回答后注意事项
当我收到答案时,我再次阅读了SpriteKit文档,并发现this clear note:
何时不应使用操作
尽管操作很有效,但创建和执行它们是有成本的。如果您在每个动画帧中更改节点的属性,并且这些更改需要在每个帧中重新计算,则最好直接对节点进行更改,而不使用操作进行更改。有关在游戏中可能需要执行此操作的更多信息,请参见高级场景处理。