所以基本上我有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
物体?
任何帮助非常感谢!我将在接下来的几个小时内上网,所以请求更多信息,我会很快回复你。
答案 0 :(得分:1)
这取决于您是否希望硬币随后与其他物理机构进行交互。你已经在问题中添加了几个“物理”标签,所以我假设你想要:)
我确实会采用基于数学的方法。所以基本上你只是从滑动中获得方向。速度本身取决于影响硬币的重力。
您可以在垂直和水平分量中分离速度矢量。
要覆盖的垂直距离为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
是非可选的。