2

私は、SFMLとXcodeに慣れるために、自分のPongクローンにいくつかの問題を書いています。最も難しいのは、コンピューターがボールの行き先を即座に認識できるAIレベルを作成したいと思います。したがって、xVelocityとyVelocityがあれば、効果的に勾配を設定できます。つまり、ボールが上または下に当たるたびに、yVelocityが反転します。つまり、基本的に、壁にぶつかるたびに逆の代数勾配の問題が発生します。

現在、画面の高さは600ピクセルで、ヒット検出は上下5ピクセルで、スペースは590ピクセルになっています。

私の質問:これらすべての要素を網羅するような公式はありますか?たとえば、ボールがx=30およびy=240で打たれ、傾きが1.45であるとします。ここで、x=770のときに打つy値を取得します。

これを単純化できるかどうか教えてください。繰り返しになりますが、ボールが4回バウンドした場合に4回と計算することで、どのように計算できるかはわかりますが、境界でy速度スイッチを使用して計算する方法があるかどうか疑問に思いました。

ありがとう!

4

3 に答える 3

7

編集:画面の高さが実際には590ピクセルであることを読んでください。これは数学を変更しますが、式は変更しません

衝突を無視して、ボールがどこに当たるかを計算します。(0,0) がアリーナの左上の場合、y = mx + b を使用します。ここで、b は y オフセット (ボールは y = 240 で打たれた) で、m は勾配 (1.45) です。

ここで、x がさらに桁を進めたときに y がどのようになるかを知りたい770-30ので、次の計算を行います。

y = (1.45)(740) + (240) = 1313

これは明らかにあなたの範囲外です。反映しただろう

y/height = floor(1313/590) = 2 times

斜面がまだ上向きに動いていることを意味し、

y mod height = 1313 mod 590 or 133

奇数回反射した場合(floor(y/2) %2 == 1)は、次のように計算する必要があります。

MAX_HEIGHT - (y mod height) = 590 - (1903 mod 590) = 590 - 133 = 457

複数の 590 高さフィールドを互いに積み重ねることで、これを視覚化できます。

--------------------------------------------------------------------
|
|
|
|                                                 ball ends up here (*)
|                                                                *
|                                                            *
|                                                        *
------------------------(reflection  two)------------*---------------
|                                                *
|                                            *
|                                        *
|                                    *
|                                *
|                            *
|                        *
---------------------*---------(reflection 1)------------------------------
|                *
|            *
|        *
|    *
|*ball hit here
| 
|
-----------------------------------------------------------------------

下方への移動についても同じ考え方が適用されるはずです。位置を計算し、反射の数を計算し、mod または 590 - mod を使用して、位置を決定します。

于 2012-07-12T22:10:21.453 に答える
1

私はこれを試したことはありませんが、「y 軸」のどこからヒットしたか、および勾配がわかっている場合は、勾配切片の式が得られます。反対側までの距離を差し込むと、画面の上、下、または内側のいずれになるかがわかります。上または下に移動する場合は、y が上または下に達したときの x を計算し、x の合計から減算して繰り返します。

于 2012-07-12T21:59:40.410 に答える
0

数学があなたに届いている場合、ここにプログラムによるエレガントではない(そして遅い、pongのほとんどの実装では問題ではありません)ソリューションがあります:

    tempX = ball.x;
    tempY = ball.y;
    tempXVel = ball.hspeed;
    tempYVel = ball.vspeed;

    while(tempX < x) //Assumes ball is traveling at you and you are right paddle
    {                //in a X = 0 = left hand side scenario
     tempX += tempXVel;
     tempY += tempYVel; 

     if (tempY > 480 or tempY < 0)
        tempYVel *= -1; //Y Velocity Switch at boundaries
    }

    target_Y = tempY;

基本的には、ループでボールに対して行うのと同じロジックを実行し、それをターゲットとして設定するだけです。

于 2014-08-09T05:17:00.960 に答える