0

私はポンを作っていますが、ボールを4つの壁で適切に跳ね返すアルゴリズムを作成するのは非常に難しいと感じています(西+東側の一部だけがゴールになるため、後でスコアリングを扱います)。ですから、現時点では、ボールをボックスの周りでバウンドさせたいと思います。

ボールが壁に当たったかどうかを検出するのは簡単ですが、新しい角度を計算するのに問題があります。

これは私がこれまでに思いついたものです:

        if(dstY == 0) {
            // North wall
            if(angle < 90) {
                newAngle = angle + 90;
            } else {
                newAngle = angle - 90;
            }
        } else if(dstX == maxWidth) {
            // East wall
            if(angle < 90) {
                newAngle = angle + 270;
            } else {
                newAngle = angle + 90;
            }
        } else if(dstY == maxHeight) {
            // South wall
            newAngle = angle + 90;
        } else if(dstX == 1) {
            // West wall
            if(angle < 270) {
                newAngle = angle - 90;
            } else {
                newAngle = angle - 270;
            }
        }

これは衝突の約半分でしか機能せず、本当に醜いように見えます。これは本当に簡単なはずで、これまで何度も行われたと思います。

私のコードでは、dstX/dstYはX/Yの宛先座標です。左上のX=0およびy=0。

4

4 に答える 4

1

このKineticModel場合、この方法でcollideWalls()は2次元ベクトル演算を使用して、粒子と平面の間の弾性衝突のシミュレーションを簡略化します。

于 2010-12-29T00:35:34.917 に答える
1

これは2つの方法で見ることができます。

角度:ボールが衝突している角度がわかっている場合は、180度の角度を実行して新しい角度を見つけます。

グラデーション:おそらくもっと簡単です。tミリ秒ごとに特定のdYとdXでボールを動かしている必要があります。したがって、壁にぶつかった場合は、dYとdXの符号を逆にして遊ぶことができます。たとえば、右の壁にぶつかった場合、dY​​がコースを続行している間、dXは-dXになります。

于 2010-12-29T01:07:41.433 に答える
0

jbxの勾配法の使用に関する知恵の言葉。ボールがボックスの角の近くに当たった場合、dxは反転しますが、dyはボールを上部の境界より上に配置できます。

于 2010-12-29T23:11:12.997 に答える
-1

@jbxに感謝します、私はもっと簡単な方法があることを知っていました:)しかし、それは東と西の壁とパドル(それらがそれらの壁にある場合)ではうまくいかないようです。しかし、これは東と西の壁でうまくいくようです:

(180 - (angle + 90)) - 90.

これは単純化して(180-angle)。お役に立てば幸いです。

于 2011-04-12T17:43:23.617 に答える