2012-01-03 22 views
6

私は壁の跳ね返りを持っています。このバウンスは単純ですが、私はまた、どのプレイヤーが移動する矩形を得たしかし私はちょうどこの、(コードスニペット)跳ねるボールの論理

if (x - moveSpeed < 0) // Ball hit left wall 
    xVel *= -1; 

を行います。これでのバウンスは、実際壁にバウンスとして機能します。

しかし、私はボールが絵、その不可能と同様の動きを得たとき、私はそれが再びまっすぐ行くようすることを考え出しました。私はボールのアウト角度に影響を与えるために矩形の動きについて何らかの計算をする必要があります。移動すると、矩形は常に一定の移動速度を得ます。この写真は、左に移動する矩形と、その移動中にボールがぶつかって、90度の角度を示しています。 (必ずしも90であるべきではない)。私の安っぽい絵については申し訳ありません

私は、彼らが理にかなって願っています。私の数学は錆びているので、なぜ私は本当に正しい方向へのプッシュが必要なのでしょうか。

+4

ここで問題とは何ですか? –

+1

これにあなたの試行のコードを入力してください^ _^ – Gabe

+1

あなたは正確な物理学を持っていますか、あるいは現在の行動より "気分が良い"ものだけを持っていますか? – Howard

答えて

6

ここで空想の計算は必要ありません。この種のゲームについての私の理解は、ボールがパドルから外れる角度は、パドルがどこでバウンスするかによって決まるということです。中央に跳ね返ると、現在の角度が保持されます。それがパドルの端に近づくにつれて跳ね返るので、角度はパドルのその側の方向に調整される。パドルを丸い面と考えてください。

+0

それは私の世界でどのように動作するかではありません。 –

+0

得られた角度は「パドル」の速度に基づいていませんか? – Kekoa

+4

卓球を覚えているときは、パドルが静止していても、ボールが最後に近づくとその角度に大きな影響を受けます。私は@ Trreebranchが正しいと思います。インパクト時のパドルの動きはそれには影響しないと思います。ボールが当たる場所のみです。 – hatchet

9

ここではいくつかの物理学のチュートリアル(これはあなたが知る必要がある)であり、ベクトルについて学ぶ必要があります。このチュートリアルでは、あなたが探しているもの(バウンスとアングルの反射)を正確に調べることはできませんが、プロジェクトを完成させるためにはこれをすべて知っておく必要があるため、これは大きな始まりです。 Game Physics 101

hereは、あなたの探していることを正確に行う方法を説明するC++のコードです。

編集


あなたが実際にあなたが知る必要が正確に何で、最初のチュートリアルを第2のリンクをチェックアウトする必要があります。しかし、ボールが跳ね返るだけでなく、他の動いているオブジェクトやそのようなものを含めるというだけのことをする場合は、最初のリンクをチェックしてください。

+2

+1優れたチュートリアル – Offirmo

+1

すでに述べたように、優れたチュートリアル! –

+0

このコメントを書いている時点でコードがJSに置き換えられましたが、私はまだC++バージョンを見つけることができませんでした。 – Funk247

1

このコードでは、ボールのXまたはball.headingX=-ball.headingXball.headingY=-ball.headingYを見出しYを反転させることによってバックまたは別の方向にボールをバウンスする方法を示します。

練習に理論を置く:非常に複雑得ることができます(@に私は本当にゲームのこれらの並べ替えを考えてどのように動作するかですTreebrancheの答えを、反対に)

/* update ball's x heading */ 
ball.x+=ball.headingX; 

/* update ball's y heading */ 
ball.y+=ball.headingY; 

/* if ball at most right of screen then reverse ball's x heading */ 
if((ball.x>PONG_SCREEN_RIGHT)) 
{ 
    ball.headingX=-ball.headingX; 

} 

/* check if ball's location at top or bottom of screen,if true reverse ball's y heading */ 
if((ball.y<PONG_SCREEN_TOP) || (ball.y>PONG_SCREEN_BOTTOM-2)) 
{ 
    ball.headingY=-ball.headingY; 
} 



/* check if ball lands on pad, if true bounce back */ 
if ((ball.y>= PlayersPad.LEFT) && (ball.y<= PlayersPad.RIGHT) && (ball.x==PlayersPad.x)) 
{ 
    ball.headingX=-ball.headingX; 
    playersScore+=10; 
} 

/* let computer track ball's movement */ 
if (ball.x>PONG_SCREEN_RIGHT-18) computersPad.y=ball.y; 


/* check if ball misses pad, if true display you missed */ 
if (ball.x<PONG_SCREEN_LEFT) 
{ 
    displayYouMissed(); 
    ball.x=ball_Default_X; 
    ball.y=ball_Default_Y; 

} 
+0

このコードはどのように質問に答えますか? – Howard

+0

ball.headingX = -ball.headingXとball.headingY = -ball.headingYでボールの見出しを逆にする方法を示します。 –

4

は、実際の物理学をシミュレートするルートを行きます。摩擦、回転、接触時間などを考慮することができます。これについては、これを議論するリンクがいくつかあります。

https://physics.stackexchange.com/questions/11686/finding-angular-velocity-and-regular-velocity-when-bouncing-off-a-surface-with-f

https://physics.stackexchange.com/questions/1142/is-there-a-2d-generalization-of-the-coefficient-of-restitution/

関連する問題