2016-12-05 13 views
0

ボックスの左右にあるボールを打つのは、振ったジェスチャーの速度/加速に依存します。 私はこれを得ることができません。私は多くのことを試しましたが、私はジェスチャーの速度/加速を得ることができません。私はコアの動きだけでなく、motionBegunmotionEndedの方法でジェスチャーを検出しますが、速度を検出することができないので、ボックスの両側にボールを打つというロジックを作り出すことができました。ここ は、どのように私はCoreMotionと揺れの方向を検出し、motionBegunでジェスチャ検出を振るとmotionEnded速攻でのシェイクジェスチャー3

var startedLeftTilt = false 
var startedRightTilt = false 
var dateLastShake = NSDate(timeIntervalSinceNow: -2) 
var dateStartedTilt = NSDate(timeIntervalSinceNow: -2) 
var motionManager = CoreMotion.CMMotionManager() 
let tresholdFirstMove = 3.0 
let tresholdBackMove = 0.5 



override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    motionManager.startGyroUpdates(to: OperationQueue.current!, withHandler: { (gyroData, error) -> Void in 
     self.handleGyroData(rotation: (gyroData?.rotationRate)!) 
    }) 

} 

private func handleGyroData(rotation: CMRotationRate) { 

    if fabs(rotation.z) > tresholdFirstMove && fabs(dateLastShake.timeIntervalSinceNow) > 0.3 
    { 
     if !startedRightTilt && !startedLeftTilt 
     { 
      dateStartedTilt = NSDate() 
      if (rotation.z > 0) 
      { 
       startedLeftTilt = true 
       startedRightTilt = false 
      } 
      else 
      { 
       startedRightTilt = true 
       startedLeftTilt = false 
      } 
     } 
    } 

    if fabs(dateStartedTilt.timeIntervalSinceNow) >= 0.3 
    { 
     startedRightTilt = false 
     startedLeftTilt = false 
    } 
    else 
    { 
     if (fabs(rotation.z) > tresholdBackMove) 
     { 
      if startedLeftTilt && rotation.z < 0 
      { 
       dateLastShake = NSDate() 
       startedRightTilt = false 
       startedLeftTilt = false 


      } 
      else if startedRightTilt && rotation.z > 0 
      { 
       dateLastShake = NSDate() 
       startedRightTilt = false 
       startedLeftTilt = false 


      } 
     } 
    } 

} 

override func becomeFirstResponder() -> Bool { 
    return true 
} 
override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) { 
    if motion == .motionShake { 
     NSLog("Motion is Started"); 
    } 
} 
override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) { 
    if motion == .motionShake { 
     NSLog("Motion is Ended"); 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    motionManager.gyroUpdateInterval = 0.01 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

答えて

1

コア運動は多くのオプションを持っているというのが私のコードです。シェイクイベントなどの高度なイベントを使用することも、ジャイロや加速度計のアップデートを取得することもできます。

投稿したコードは、ジャイロイベントを監視しています。あなたが振れの力を求めているのであれば、ジャイロイベントではなく、加速度計イベントが必要です。

+0

私にチュートリアル/例を教えてください。 –

+0

いいえ、私はあなたに与えるチュートリアル/例はありません。私はあなたと同じものを見つけなければならないでしょう。 –

+0

こちら[link](https://github.com/cansurmeli/pedestrian-status) –

1

gyromotionを同時に使用すると、トリガーが得られます。ジャイロはあなたに方向性を提供し、動きはあなたにある種のスピード解析を提供します。 カスタムロジックと同時に両方を実装すると、まさにあなたが得ようとしているものが得られます。 方向を見つけるための最後の答えを使用します。 StackAnswer