【发布时间】:2015-06-02 12:49:31
【问题描述】:
我正在尝试让我的 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:
何时不应使用操作
虽然动作是有效的,但创建和执行它们是有成本的。如果您在动画的每一帧中都对节点的属性进行更改,并且这些更改需要在每一帧中重新计算,那么您最好直接对节点进行更改,而不是使用操作来这样做。有关您可以在游戏中的何处执行此操作的更多信息,请参阅高级场景处理。
【问题讨论】:
-
我对您要完成的工作感到有些困惑。您是否希望更改中间移动的角度旋转以防玩家四处移动手指(使用 thouchesMoved),或者您是否希望在移动完成之前阻止任何进一步的动作?
-
两者都不是。我有一个炮塔,它有一个“最大旋转速度”,应该通过花时间转动来瞄准手指位置,但不是立即。我已经这样做了,但是由于 touchesMoved 被称为 60time by seconds ,因此按秒添加 60 个动作会阻止移动(动作不会运行......)
-
那么您是否正在寻找炮塔以跟踪触摸位置,即使它在视图中移动?
-
它只是自动开启,但是,它以手指为目标,但“以它的速度”
标签: ios swift rotation sprite-kit skaction