1

私はポンのゲームを作ろうとしています。画面にすべてを描画し、壁のボールをバウンドさせ、パドルがマップ内にのみあることを確認しました. 私が抱えている問題の1つは、衝突検出です。私が使用しているアルゴリズムは、ボール (実際には正方形) がパドルの端からぶら下がっていない状態でパドルの真ん中に当たる場合にうまく機能します。ボールがパドルの角に当たったり、ボールの一部がパドルからぶら下がったりすると、ボールはパドルにグリッチし、跳ね返りません。これが私のアルゴリズムです...

bool CheckCollision(float Ax,float Ay,float Aw,float Ah,float Bx,float By,
float Bw,float Bh) {
    if(Ax>Bx+Bw) {
        return(false);
    }else if(Ax+Aw<Bx) {
        return(false);
    }else if(Ay>By+Bh) {
        return(false);
    }else if(Ay+Ah<By) {
        return(false);
    }
    return(true);
} 

A と B は異なるオブジェクトを表し、x、y、w、および h は、その特定のオブジェクトの x pos、y pos、幅、および高さを表します。受信側では...

if(CheckCollision(ball->x,ball->y,ball->width,ball->height,paddle->x,paddle->y,
paddle->width,paddle->height)) {
    ball->vellx = -ball->vellx;
}

これは、ボールがパドルの真ん中に当たった場合、前述のように機能します。

もしあなたがこれを理解しているなら(私は言葉が上手ではないことを知っているので)、ボールがパドルにグリッチしないようにする方法はありますか?そうでない場合、使用できる別のアルゴリズムはありますか? これは 2D のみであることに注意してください。

これは何が起こっているかのスクリーンショットです

http://gyazo.com/920d529217864cca6480a91b217c9b61

ご覧のとおり、ボールの側面には衝突がなく、ポイントだけです。

これが役立つことを願っています

4

1 に答える 1

1

ball->vellx = -ball->vellx;

それは正しくありません。

衝突が検出された場合、ボールがパドルに向かって移動する場合にのみ、速度を反転 (x) する必要があります。ボールがすでにパドルから離れている場合は、何もせず、速度を変更しないでください。

衝突のたびにやみくもに速度を反転させると、ボールがパドルに引っかかってしまいます。

PS他にも微調整できることがいくつかあります(ボールがコーナーで適切にバウンドするようにする、パドル速度に基づいてボールの速度を調整するなど)が、それは別の話です...

于 2012-05-30T09:27:19.393 に答える