Вращайте спрайт на ощупь с ограниченной скоростью вращения
Я пытаюсь заставить мой 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 и нашелэто четкое примечание :
Когда вы не должны использовать действия
Хотя действия эффективны, их создание и выполнение сопряжены с определенными затратами. Если вы вносите изменения в свойства узла в каждом кадре анимации, и эти изменения необходимо пересчитывать в каждом кадре, то лучше вносить изменения в узел напрямую, а не использовать действия для этого. Для получения дополнительной информации о том, где вы можете сделать это в своей игре, см. Advanced Scene Processing.