私はアンドロイドスタジオでブレイクアウトゲームを作っています。(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;
}
だから私はこのような何かにこれを変換する方法を前もって感謝します!
私のFPSが60 に設定しかし、私は私の次のボールの位置は、任意のブロックやパドルを傍受した場合、それはそれが設定されない場合は、解決策が見にあると考えていることができます最も近い壁と速度を逆転させる。 – MrPako
が間違っています!上で述べたように、衝突が検出されると、衝突が発生する前にボールの位置を前の位置に設定する必要があります。次に、偏向の角度を考慮しない速度を逆にすることができます。したがって、各ループの前のフレーム位置を保存する必要があります – Rob85
Hmm。しかし、ボールの位置が非常に遠く、ボールが非常に速い場合、衝突する可能性があります。実際には、私はそれを最終的に把握し、私はすべての作業を取得した後、私の答えを投稿します:D – MrPako