以预设速度

时间:2016-08-04 16:36:20

标签: ios swift sprite-kit physics skphysicsbody

所以基本上我有coin对象,我想在屏幕上启动它。我有以下代码在滑动上运行一些计算,但不确定与我当前情况相关的是什么:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    touching = true

    let touch = touches.first
    let loc = touch?.locationInNode(self)
    if coin.containsPoint(loc!){
        touchPoint = loc!
        touchTime = (touch?.timestamp)!
    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    touching = false

    let touch = touches.first
    let loc = touch?.locationInNode(self)
    var xDiff = (loc?.x)! - touchPoint.x
    var yDiff = (loc?.y)! - touchPoint.y
    let distance = sqrt(xDiff * xDiff + yDiff * yDiff)
}

我希望硬币基本上沿着滑动的方向抛出,但我希望它每次都能在屏幕上达到一定的y坐标,然后由于重力而向下滑落。所以我想我需要以某种方式计算每次达到y点的完美速度,然后以该速度在滑动方向上推动coin物体?

任何帮助非常感谢!我将在接下来的几个小时内上网,所以请求更多信息,我会很快回复你。

1 个答案:

答案 0 :(得分:1)

这取决于您是否希望硬币随后与其他物理机构进行交互。你已经在问题中添加了几个“物理”标签,所以我假设你想要:)

我确实会采用基于数学的方法。所以基本上你只是从滑动中获得方向。速度本身取决于影响硬币的重力。

您可以在垂直和水平分量中分离速度矢量。 要覆盖的垂直距离为let verticalDistance = targetHeight - coin.position.y。硬币必须在最高点处具有零垂直速度,并且我们知道在动画期间它以-9.81 pt / s * s的速度减速(从我的头顶开始)。

因此速度图如下所示:

enter image description here

使用公式f(x) = -9.81 * x + v,其中v是我们要解决的垂直起始速度。代数告诉我们f(x)与x轴相交x值v / 9.81。 直到f(x)与x轴相交的点所覆盖的总距离等于f(x)下三角形的表面积。此三角形的表面为1/2 * v/9.81 * v(宽度为1/2 * *高度)。 由于你知道这个距离应该是什么(前一段verticalDistance),代数会指示v = sqrt(2 * 9.81 * d)。现在你知道你根据硬币必须行进的高度开始垂直速度了!

由于您知道硬币角度(由用户的滑动决定)和垂直速度,您可以计算水平速度。我要把它留给你;)请注意,我们当然忽略了可能影响硬币速度的阻力/摩擦力。我的代数也可能生锈了。

作为附注
我会用

替换let touch = touches.first
guard let touch = touches.first else {
    return
}

通过这种方式,touch是非可选的。