2017-08-16 12 views
1

私はアンドロイドスタジオでブレイクアウトゲームを作っています。(Java)ブレイクアウトゲームでのベクトル衝突の使用

パドルとレンガとのゲームループと基本的な衝突をした後、私のボールがスピードを上げた後に私のレンガとパドルをクリップし始めたことに気付きました。

問題はフレーム内で2回衝突するということです。そのため、基本的な衝突では十分ではありません。

解決策としてベクトル演算を使用したことがあります。しかし、あまりにも私の周りに私の頭を包むためにあまりにもです。 私はこの質問の答えを参照しています: Refer Here

if (RectF.intersects(bricks[i].getRect(), ball.getRect())) { 

Brick brick = bricks[i]; 

if(ball.getRect().centerX()>brick.minX() && ball.getRect().centerX() < brick.maxX()){ 

    ball.reverseYVelocity(); 

    if(ball.getRect().top > brick.getRect().centerY()){ 

     ball.clearObstacleY(brick.getRect().bottom - ball.getRect().height()); 

    } else { 

     ball.clearObstacleY(brick.getRect().top + ball.getRect().height()); 

    } 

} else { 

ball.reverseXVelocity(); 

if(ball.getRect().left > brick.getRect().centerX()){ 

    ball.clearObstacleX(brick.getRect().right + ball.getRect().width()); 

} else { 

ball.clearObstacleX(brick.getRect().left - ball.getRect().width()); 

} 
} 

そして、私のボールの更新は次のとおりです。 Demo

public void update(long fps, float speed){ 
    rect.left = rect.left + (xVelocity*speed/fps); 
    rect.top  = rect.top + (yVelocity*speed/fps); 
    rect.right = rect.left + ballWidth; 
    rect.bottom = rect.top - ballHeight; 
} 

だから私はこのような何かにこれを変換する方法を前もって感謝します!

答えて

0

すべてのループには、ボールの前の位置を記録しておく必要があります。あなたが衝突を検出すると直ちに前のフレーム位置にボールを移動し、バウンス効果を処理しなければなりません。衝突を2回登録しないでください。これはあなたが衝突を正しく処理しないことを意味します。スピードを上げるとボールがパドルを通過しているように見える場合は、速度の仕方やフレームレートを上げる必要があります。あなたのFPSはどのように設定されていますか?

あなたも私の答えを参照herehere

+0

私のFPSが60 に設定しかし、私は私の次のボールの位置は、任意のブロックやパドルを傍受した場合、それはそれが設定されない場合は、解決策が見にあると考えていることができます最も近い壁と速度を逆転させる。 – MrPako

+0

が間違っています!上で述べたように、衝突が検出されると、衝突が発生する前にボールの位置を前の位置に設定する必要があります。次に、偏向の角度を考慮しない速度を逆にすることができます。したがって、各ループの前のフレーム位置を保存する必要があります – Rob85

+0

Hmm。しかし、ボールの位置が非常に遠く、ボールが非常に速い場合、衝突する可能性があります。実際には、私はそれを最終的に把握し、私はすべての作業を取得した後、私の答えを投稿します:D – MrPako