2016-08-04 79 views
0

所以基本上我有coin對象,我想在屏幕上啓動它。我有它運行輕掃一些計算下面的代碼,但不知道什麼是有關我目前的情況:將SpriteNode以預設速度向滑動方向移動

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點,然後以該速度將滑動方向上的對象推入?

任何幫助非常感謝!我在接下來的幾個小時內上線,因此要求提供更多信息,我將很快回復您。

+0

假設我明白你在問什麼,它實際上非常難 - 像**真的很難解決這個在遊戲物理學中相當常見的問題。這是關於它的質量保證https://math.stackexchange.com/q/166039/34973 – Fattie

+0

相反,它可能只是問這個簡單的問題:https://stackoverflow.com/a/46919374/294884 – Fattie

回答

1

這取決於你是否希望硬幣與其他物理體相互作用。你已經附加了幾個「物理」標籤的問題,所以我想你想要的:)

我會去一個基於數學的方法的確。所以基本上你只是從滑動中獲得一個方向。速度本身取決於影響硬幣的重力。

您可以在垂直和水平分量中分離速度向量。 覆蓋的垂直距離爲let verticalDistance = targetHeight - coin.position.y。硬幣在最高點必須具有零垂直速度,並且我們知道在動畫期間它以-9.81pt/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)。現在,你知道你開始垂直速度,根據硬幣的高度旅行!

由於您知道硬幣角度(由用戶的滑動指示)和垂直速度,因此可以計算水平速度。我要把它留給你;)請注意,我們當然忽略了可能影響硬幣速度的阻力/摩擦。我的代數也可能是生鏽的。

作爲一個側面說明
我會

guard let touch = touches.first else { 
    return 
} 

更換let touch = touches.first這樣,touch是一個非可選。