-1

Javaでブレイクアウトゲームを作ろうとしています。ボールは石やバットに当たると弾みますが、壁に当たると弾みません。私が使用するものについては、このペーストを参照してください。

http://pastebin.com/pkGsCBMa

誰でもコードのエラーを見つけることができますか...

ありがとう

編集:速度を印刷すると、この出力が得られます。

vx 0.0     vy  0.0
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.0     vy  0.0
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02

編集

これが解決策です。バウンス()メソッドをこれに変更しました。

/**
 * This object bounces back from the other object in a natural way. Please
 * realize that the bounce is not completely accurate because this depends
 * on many properties. But in many situations the effect is good enough. Had
 * some bugs in pixel perfect detection mode if the image has a larger area
 * of complete alpha. If using PPCD, make the object fit the image size by
 * removing the alpha and resizing the image.
 */
public void bounce(GObject other){
    int xd = (int) ((other.x + other.getWidth() / 2) - (x + getWidth() / 2));
    int yd = (int) ((other.y + other.getHeight() / 2) - (y + getHeight() / 2));
    if (xd < 0) {
        xd = -xd;
    }
    if (yd < 0) {
        yd = -yd;
    }
    if (xd > yd) {
        dx = -dx;
    } else {
        dy = -dy;
    }
}
4

2 に答える 2

4

この問題の一般的な原因は、衝突するオブジェクトが重なり合っていて、連続した衝突の状態で動かなくなることです。

そのため、ボールは比較的速く動いていて、ブロックに衝突します。ただし、シミュレーションは離散的であるため、ボールは実際にブロックに少し入ります。次に、衝突を正しく検出し、速度を反転します。ただし、次の更新サイクルでは、何らかの理由で、ボールがまだブロック内にある可能性があります。したがって、プログラムは別の「衝突」を検出し、速度を再び反転させます。

その結果、ボールはブロックの端でぐらつき、常に速度が逆転します。

于 2012-06-28T01:44:40.647 に答える
3

bounce関数では、 と はすべての値をカバーするわけではありifません。またはをelse ifに置き換えることをお勧めし>ます。>=<<=

于 2012-06-28T01:54:20.020 に答える