@PietroPepeが指摘しているように、アクションを1つずつ積み重ねています。
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
これは、あなたのタッチのライフサイクルを通して複数回タッチが行われることを示しています。クイックタッチの上下操作でも、この方法で少なくとも2回の呼び出しを行うことは非常に可能です。コードの現在の位置に
newLocation = touch.location(in: self)
turnAngle = atan2(newLocation.y - lastLocation.y - mySprite.position.y, newLocation.x - lastLocation.x - mySprite.position.x)
このコードのポイントは、最後の位置からタッチの変更でスプライトの動きを持つことである
mySprite.run(SKAction.rotate(byAngle: turnAngle, duration: 0.1))
lastLocation = newLocation
print("mySprite zRotation: \(mySprite.zRotation)")
}
}
最後に、この時点で行う語ります1/10秒で表示されます。
ここでシナリオを実行しましょう。画面に触れて移動して放します。
実行に要した時間は4フレームで、これは1タッチベーガン、2タッチモーフィング、1タッチアンドドンを意味します。
私たちのtoucheMovedイベントでは、毎回60度の変化を計算します。
フレームは1/60秒ということに留意してください。
私たちの回転イベントは、0/60から6/60秒、6フレームになるように1/10th秒かかるでしょう。
これは、すべてのフレームが10度移動していることを意味します。
ここでrotateByの2番目のフレームに移動します。
上記の最初のフレームと同じロジックが適用されるため、10度移動する別の一連の回転が適用されます。
これは、スプライトを6度ずつ回転させる2つのイベントを持つことを意味します。
続くようにタイムラインがある:
フレーム:0 1 2 3 4 5 6 7 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 + 10
ローテーションの終了と開始の間に一貫性のない動作があることに注目してください。これは物事がすべてぎこちないように見える理由です。
ここでは、あなたが探している効果がわかりませんが、これを行う場合は、アクションを使用する代わりにzRotation
を設定します。
あなたが遅延効果を探しているなら、あなたが唯一の実行中の1つのアクションを持つようにrun
機能にwithKey
パラメータを使用して、スプライトは常に最後の可能なタッチ位置に回転持つようにSKAction.rotateTo
を使用しています。これは、タッチが最初に開始されたときを、最後にタッチしたときではなく、追跡する必要があることを意味します。あなたはduration:.01 - timeSinceTouchBegan
ので基本的に、と呼ばれるtouchesMoved
イベントの数の間の経過時間を追跡し、あなたの持続時間に時間差を適用する必要があるかもしれないので、これはまた、所望の効果に応じて、少しトリッキー取得
、
このアクションの実行は多く呼び出され、予期しない結果をもたらす可能性のある移動アクションを積み重ねるので、これはお勧めしません。 zRotationを「手動で」設定するほうが簡単です。頻繁に呼び出される 'touchesMoved'は、回転を円滑にします。 再計算すると、角度を -/+ Piまたは0-2Piの間の等価に変換する関数を意味しますか? –