我试图在一个盒子的左侧和右侧击球,速度取决于摇动手势的速度/加速度。
我无法得到这个我尝试了很多东西,但我无法获得手势的速度/加速度。我使用核心动作以及motionBegun
和motionEnded
方法检测到手势,但无法检测到速度,因此我可以创建一个在盒子两侧击球的逻辑。
这是我的代码,我如何使用CoreMotion
检测摇动的方向,并使用motionBegun
和motionEnded
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.
}
答案 0 :(得分:1)
核心动作有很多选择。您可以使用高级别事件,如摇晃事件,或者您可以获得陀螺仪或更新仪表。
您发布的代码是监控陀螺事件。如果你正在寻找震动的力量,你需要acellerometer事件,而不是陀螺事件。
答案 1 :(得分:1)
同时使用gyro
和motion
来获取触发器。陀螺仪将为您提供方向和动作,为您提供某种速度分析。
使用您的自定义逻辑同时实现两者将是您想要获得的确切内容。
使用最后一个答案来查找方向。
StackAnswer