6

壁に跳ね返るボールを持っています。このバウンスは単純です、私はこれを行うだけです(コードスニペット)

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

ただし、プレーヤーが移動する長方形も取得しました。これでの跳ね返りは、実際には壁での跳ね返りとして機能します。

しかし、ボールが写真と同じように動くと、再び真っ直ぐに上がることは不可能だと思いました。したがって、ボールの出てくる角度に影響を与えるために、長方形の動きに関する何らかの計算が必要です。長方形は、移動するときに常に一定の移動速度を取得しました。この写真は、長方形が左に移動し、移動中にボールがそれに当たって、90度の角度になることを示しています。(これは常に90である必要はありません)。

私のくだらない写真について申し訳ありませんが、私はそれらが理にかなっていることを願っています。私の数学はさびているので、私は本当に正しい方向へのプッシュが必要になる可能性があります。

4

4 に答える 4

9

これはいくつかの物理学(あなたが知る必要があることです)に関するチュートリアルであり、あなたはベクトルについて学ぶ必要があります。チュートリアルでは、探しているもの(バウンスと角度の反映)を正確に説明していませんが、プロジェクトを完了するにはこれらすべてを知る必要があるため、これは最初の素晴らしいスタートです。ゲーム物理学101

あなたがそれを簡単な方法でやりたいのなら、ここにあなたが探していることをする方法を正確に説明するc++のコードがあります。

編集


実際には、最初に2番目のリンクを確認する必要があります。これは、正確に知っておく必要のあるチュートリアルです。ただし、ボールをバウンドさせるだけではなく、他の動くオブジェクトなどを含める場合は、最初のリンクを確認してください。

于 2012-01-03T16:54:31.437 に答える
7

ここでは派手な数学は必要ありません。これらのタイプのゲームについての私の理解は、ボールがパドルから離れる角度は、ボールがパドルのどこで跳ね返るかによって決まるということです。中央で跳ね返る場合は、現在の角度が保持されます。パドルの端に近づくと、パドルのその側の方向に角度が調整されます。パドルは丸みを帯びた表面と考えてください。

于 2012-01-03T16:55:30.513 に答える
4

実際の物理学をシミュレートするルートを進むと(@Treebrancheの答えとは対照的に、この種のゲームは実際に機能すると思います)、非常に複雑になる可能性があります。摩擦、スピン、接触時間などを考慮することができます。これについて説明しているリンクがいくつかあります。

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/

于 2012-01-03T17:25:39.047 に答える
1

Xこのコードは、ボールを逆にするか、およびで Yヘディングすることにより、ボールを元に戻す方法または別の方向にバウンスする方法を示しています。ball.headingX=-ball.headingXball.headingY=-ball.headingY

理論を実践する:

/* 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;

}
于 2012-01-03T17:23:11.840 に答える