以预设速度向滑动方向移动 SpriteNode

Move SpriteNode in direction of a swipe at a preset speed

所以基本上我有 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 对象?

非常感谢任何帮助!接下来的几个小时我都在线,所以请询问更多信息,我会很快回复你。

这取决于您是否希望硬币之后与其他物理物体相互作用。您在问题上附加了几个 "physics" 标签,所以我假设您想要那个 :)

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

您可以在垂直和水平分量中分离速度矢量。 要覆盖的垂直距离是 let verticalDistance = targetHeight - coin.position.y。硬币在最高点的垂直速度必须为零,我们知道在动画期间它以恒定的 -9.81 pt/s*s(超出我的头脑)减速。

所以速度图是这样的:

使用公式 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就是一个非可选的