2016-09-29 15 views
1

私はスプライトキットとスウィフトでアプリケーションを作成していますが、画面が押されている間に上方に飛ぶスプライトを作成したいので、スクリーンを高く押すほど高くジャンプします。私はその効果を達成しましたが、物理エンジンの重力はスクリーンが解放されるまで適用されません。したがって、ある点(2次方程式/放物線のような)で平準化するのではなく、無限にジャンプします(指数関数的に増加します)。スプライトキットとスウィフトでジャンプする

スプライトの移動中に重力を積極的に適用するにはどうすればよいですか?ここで

は、私の基本的な動きコードです:

override func update(_ currentTime: TimeInterval) { 
    // Called before each frame is rendered 
    // touched is true while screen is touched 
    if touched { 
     nodeLeft.physicsBody?.applyImpulse(CGVector(dx: -5, dy: 0)) 
    } 
} 

注:オブジェクトは、右と左のジャンプではなく

答えて

3

上下される重力が常に働いて、おそらくする必要があります。しかし、すべてのダニでインパルスを適用すると、この力は重力よりもはるかに強くなります。

あなたがする必要があるのは、時間の経過とともにインパルスの影響を減らすことです。 これは、例えば、スプライトの位置をインパルスのベースとして使用するなど、さまざまな方法で実現できます。スプライトの位置が高いほど、インパルスは低くなります。

if touched { 
    let minX: CGFloat = 200 // some suitable value 
    let multiplier: CGFloat = 10 
    let force = max(0, (nodeLeft.position.x/minX - 1) * multiplier) 
    nodeLeft.physicsBody?.applyImpulse(CGVector(dx: -force, dy: 0)) 
} 

上記の例の値はおそらく意味がありません。しかし、論理はかなり信じています。あなたは、あなたのニーズに合うように、これを実験して微調整する必要があります。

+0

私はあなたにキスすることができたら私はそうです。これは偉大な仕事をありがとう –

+0

ハハ、あなた自身にあなたの唇を保つ。 :-Dあなたにはうまくいったことがうれしい! –

+1

また、インパルス間のタイムラインを奪うこともできます。インパルスは、画面がタッチされ、最後のタッチから一定の時間(1秒、5秒、10秒など)が経過したときにのみ適用されます。 update()は呼び出されたときに現在時刻が渡されるので、これは実装するのがかなり簡単です。 –

関連する問題