2017-03-27 8 views
1

私は動いているオブジェクトの速度(イメージ)をチェックするif文を持っています。ステートメントのポイントは、画像がどのように影響を受けているかを判断することであり、いったんそうするとXまたはY平面をロックするので、滑らかな左右の動き、またはスムーズな上下の動きです。スワイプの方向を決定する文

コードは以下のとおりです(まず最初に右の動きを確認し、次に左を確認します)。左右に動く場合、動きははるかにスムーズです。しかし、時々、動きに上下に影響を与えようとするとき、それは左右の動きにロックされます。これは私が信じているのは、左と右の動きのためのif文を最初に探しているからです。私が最初にチェックされるように上下に動かすと、左右の動きが不安定になります。これを行うより良い方法はありますか?あなたはこのような右に少し非常に高速な動きまでとし、持っていたときにこれに伴う問題の

let velocity = recognizer.velocity(in: self.view) 
if velocity.x > 75 { 
    movingRight = true 
    myBlocks[objectDragging].center.y = CGFloat(initPosy) 
} else if velocity.x < -75 { 
    movingLeft = true 
    myBlocks[objectDragging].center.y = CGFloat(initPosy) 
} else if velocity.y < -30 { 
    movingUp = true 
    myBlocks[objectDragging].center.x = CGFloat(initPosx) 
} else { 
    movingDown = true 
    myBlocks[objectDragging].center.x = CGFloat(initPosx) 
} 

答えて

2

例は次のとおりです。x = 78, y = -450 これは間違いなく、垂直方向の動きの一例であるが、あなたのアルゴリズムのためにあなたにそれを知っていますvelocity.xvelocity.yの値を比較する必要があります。 これを行うより良い方法は、どの軸が速度の絶対値が最も高いかを調べることです。あなたの場合、それはまた、(水平移動のための閾値が75であり、垂直移動が30であるので)スケーリングされる必要があります。

if abs(velocity.x) > abs(velocity.y * 2.5) { 
    // this is horizontal movement 
} 
else { 
    // this is vertical movement 
} 
+0

一方、あなたは、例えばAppleがSafariで行うようにしたいと思うかもしれません。水平な指の動きから始めて水平にスクロールさせ、垂直の指の動きから始めるときだけスクロールを垂直に固定します。しかし、45度の角度またはそのまわりで動くと、スクロールは無指向性であり、どの軸にもロックされません。 – johnyu

+0

提案していただきありがとうございます。私は明白な比較をすることを考えていませんでした。 – idlehand

1

おそらく、どちらの方向の方が大きいかを確認してから、その正または負のどちらかを決定する必要があります。

let velocity = recognizer.velocity(in: self.view) 
if abs(velocity.x) > abs(velocity.y) { 
    //going left/right 
    if velocity.x > 0 { 
     movingRight = true 
     myBlocks[objectDragging].center.y = CGFloat(initPosy) 
    } else { 
     movingLeft = true 
     myBlocks[objectDragging].center.y = CGFloat(initPosy) 
    } 
} else { 
    if velocity.y > 0 { 
     movingUp = true 
     myBlocks[objectDragging].center.x = CGFloat(initPosx) 
    } else { 
     movingDown = true 
     myBlocks[objectDragging].center.x = CGFloat(initPosx) 
    } 
} 

@johnyuが示唆しているように、水平方向と垂直方向の動きを比較するために因子を使用できます。

関連する問題