SpriteKit 加速度计并不总是准确或可能过于敏感

Posted

技术标签:

【中文标题】SpriteKit 加速度计并不总是准确或可能过于敏感【英文标题】:SpriteKit accelerometer not always accurate or maybe over sensitive 【发布时间】:2016-12-07 16:42:16 【问题描述】:

我正在使用以下代码在我的游戏中实现动作:

如果motionManager.isAccelerometerAvailable == true

    motionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler: 

        data, error in

        let currentX = self.player.position.x

        self.destX = currentX + CGFloat((data?.acceleration.x)! * 200)

    )


然后在update(_currentTime:CFTimeInterval)函数中:

let action = SKAction.moveTo(x: destX, duration: 0.2)

        self.player.run(action)

问题是它看起来真的很敏感,精灵有时会与它的倾斜相反,看起来到处都是,我认为这与设备的倾斜有关,我只是想检测侧面侧向运动。我错过了什么吗?

【问题讨论】:

我的猜测是您不断添加相互重叠的动作,为运行动作分配一个键,它将取消使用前一个键的任何动作 self.player.run(action, withKey:"Move") 谢谢你,现在这个代码根本不响应移动...... 它根本不动? 现在什么都没有,我已经添加了 withKey: 【参考方案1】:

我会尝试直接在场景的更新方法中获取运动数据,因此每秒更新 60 次。我使用处理程序从来没有得到好的结果,即使你将间隔设置得很低,它也总是很慢。

override func update(_ currentTime: TimeInterval) 
     if let data = motionManager.accelerometerData 
          let currentX = player.position.x
          destX = currentX + CGFloat((data.acceleration.x) * 200)
          ...
     
 

您可能需要调整 200 才能获得所需的结果。我也会减少 SKAction 的持续时间,0.2 太长了。或者尝试不使用 SKAction 直接更新 Sprite 位置。

希望对你有帮助

【讨论】:

【参考方案2】:

我认为您错过了本教程的其他部分,您可能会从这里获取此代码:https://www.ioscreator.com/tutorials/move-sprites-accelerometer-spritekit-swift,因为他觉得有必要以一种奇怪的方式处理负面数据:

        let currentX = self.player.position.x

   if data.acceleration.x < 0 
          self.destX = currentX + CGFloat(data.acceleration.x * 100)
        

   else if data.acceleration.x > 0 
          self.destX = currentX + CGFloat(data.acceleration.x * 100)
        

这可能是一个问题的线索,以及整个“教程”一个短视的梦想,是他正在使用在 update() 中创建 SKAction 来推动运动。

这似乎根本不对。

还有另外两种使用运动数据移动物体的好方法:

    将反映设备角度的力应用于对象 根据设备角度更改影响对象的重力方向和强度

我认为两者都远远优于响应运动信息的动作技术,但我可能错了。

【讨论】:

他的加速度计代码很好,没有 if 语句,我只想删除这个答案。该教程也是正确的,但不知道他们为什么会这样做 感谢您在此输入。我现在玩这个的主要问题是,当使用 run(SKAction.playSoundFileNamed("phaserDown3.mp3", waitForCompletion: false)) 播放声音时,它弄乱了动作,我现在已经移动了加载冲突功能之外的声音,它要好得多,但每隔一段时间,角色会“粘”在任一侧,倾斜设备将无济于事,然后在 30 秒左右后再次恢复正常 - 一旦我禁用此声音它工作正常,真的很奇怪....

以上是关于SpriteKit 加速度计并不总是准确或可能过于敏感的主要内容,如果未能解决你的问题,请参考以下文章

如何制作一个不会不加速物体的力SpriteKit Swift

SpriteKit中的加速度计不起作用

SpriteKit 自定义 UIScrollView 带加速

苹果和富士康坚持推进印度制造,过于一厢情愿了,或加速衰退

Spritekit - 将加速应用于物理主体

SpriteKit 以定义的角度停止旋转***