【问题标题】:Decreasing accelerometer's sensitivity降低加速度计的灵敏度
【发布时间】:2015-06-07 07:21:33
【问题描述】:

我正在制作一个游戏,它有一个从左到右移动的正方形,起初我使用applyForce 这样做,但我不喜欢结果,因为它不够敏感。然后我换成了velocity

func motionSensorUpdate(currentTime: CFTimeInterval){

    let square = childNodeWithName(ksquarename) as! SKSpriteNode

    updateSquare(currentTime, Square: square)

    if let data = motionManager.accelerometerData {

        if CGFloat(data.acceleration.x) > 0.2 {
            square.physicsBody!.velocity = CGVectorMake(200, -200)
        } else if CGFloat(data.acceleration.x) < 0.2 {
            square.physicsBody!.velocity = CGVectorMake(-200, -200)
        }
    }
}

现在的问题是它太敏感了。所以,如果我不移动手机,它仍然会移动物体。如何在不返回 applyforce 的情况下修复它?

【问题讨论】:

  • 我不确定在这里使用velocity 是否合适 - 您是否看到节点根本没有移动的结果,然后在您将手机倾斜超过阈值时突然移动?你本可以增加你施加的力量的力量......
  • 我用力时,反应不快。例如,如果我向左倾斜,然后我想快速向右移动,所施加的力会模仿一个真实的物体,这不是我想要的。使用速度它可以快速响应,但它非常敏感,即使我停下来,方块也会向左或向右移动,经常曲折,感觉很奇怪。

标签: ios swift sprite-kit accelerometer core-motion


【解决方案1】:

试试:

let multiplier = 200.0
let x = data.acceleration.x

if x > 0.2 {
    square.physicsBody!.velocity = CGVector(dx: x * multiplier, dy: -200)
} else if x < 0.2 {
    square.physicsBody!.velocity = CGVector(dx: x * multiplier, dy: -200)
}

以上将根据设备平铺的多少来改变节点的速度;只需更改multiplier 即可更改灵敏度。

【讨论】:

  • 我不得不更改代码,因为它不能同时处理 Int 和 Double。但现在由于某种原因 CGVectorMake 不将 X 识别为 Int
  • let multiplier = 200.0 let x = data.acceleration.x * multiplier if x / multiplier > 0.2 { square.physicsBody!.velocity = CGVectorMake(Int(x), Int(-x)) } else if x / multiplier
  • 你为什么使用Int?使用DoubleCGFloat 是一个更好的主意,因为您将能够拥有不是整数的x 值 - 使节点速度的变化更平滑。另外,我更新了我的答案以使用CGVector(dx: x, dy: x)
  • 就我的游戏而言,我无法在 DY 中使用 X,但现在它可以完美运行了!!!非常感谢@ABakerSmith
  • 很高兴为您提供帮助 :) 祝您游戏顺利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2013-05-13
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2022-08-06
相关资源
最近更新 更多