Swift SpriteKit加速计不总是准确的,或者可能过于敏感

Swift SpriteKit加速计不总是准确的,或者可能过于敏感,swift,sprite-kit,swift3,Swift,Sprite Kit,Swift3,我使用以下代码在游戏中实现运动: 如果motionManager.isAccelerometerAvailable==true{ motionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler: { data, error in let currentX = self.player.position.x self.destX = curr

我使用以下代码在游戏中实现运动:

如果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)

    })

}
然后在更新(currentTime:CFTimeInterval)函数中:

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

        self.player.run(action)

问题是它看起来非常敏感,精灵有时会与它的倾斜方向相反,只是看起来到处都是,我认为这与设备的倾斜有关,我只想检测左右移动。我遗漏了什么吗?

我想你遗漏了教程的另一部分,你可能会得到它代码来自这里:因为他觉得需要以一种奇怪的方式处理负面数据:

        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)
        }
让currentX=self.player.position.x
如果数据加速度x<0{
self.destX=currentX+CGFloat(data.acceleration.x*100)
}
否则,如果data.acceleration.x>0{
self.destX=currentX+CGFloat(data.acceleration.x*100)
}
这可能是一个问题,而整个“教程”只是一个短视的梦想,其线索是他在update()中使用SKActions的创建来推动运动

这似乎根本不对

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

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

  • 我认为两者都比运动信息的动作技术优越得多,但我可能错了。

    < P>我会尝试在你的场景更新方法中直接获取你的运动数据,所以它每秒更新60次。我从来没有使用过处理程序得到好的结果,即使你设置T,它也总是很迟钝。他休息得很慢

    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


    希望这能有所帮助

    我猜你一直在添加相互重叠的动作,为run动作分配一个键,它将取消使用上一个键的任何动作
    self.player.run(动作,带键:“移动”)
    谢谢,现在这个代码进入时,它对移动没有任何响应……它根本没有移动?没有,现在我用键添加了什么:他的加速计代码很好,没有if语句,我只想删除这个答案。教程也是正确的,不知道为什么他们会这样做。谢谢这里的输入。下面的我现在玩这个游戏的主要问题是,当使用run(SKAction.playSoundFileNamed(“phaserDown3.mp3”,waitForCompletion:false))播放声音时这是混乱的议案,我现在已经移动了加载的声音以外的冲突功能,这是更好的,但每隔一段时间,字符将'坚持'到任何一边,倾斜设备将不会做任何事,然后在30秒左右,它再次是好的-一旦我禁用这个声音,它的工作很好,真的很奇怪。。。。