1

コンテキスト: LCD 画面に表示されるマイクロプロセッサで小さなゲームを開発する。

この衝突検出機能を修正しようとしています。これは、ウォール スプライト (1 x 25 ピクセル) とプレーヤー スプライト (3x3 ピクセル) の間の衝突を検出することです。プレイヤー スプライトの dx/dy が変更されて動きが停止した場合は、1 または 0 を返します。したがって、基本的にウォール スプライトは実際の壁として扱われます。

int wall_collision(Sprite *w_sprite)
{

    if (((w_sprite->x >= wall_sprite.x) && ((w_sprite->x - wall_sprite.x) < 3)) && ((w_sprite->y >= wall_sprite.y) && ((w_sprite->y - wall_sprite.y) < 3)))
        return 1;

    if (((w_sprite->x <= wall_sprite.x) && ((w_sprite->x - wall_sprite.x) > -3)) && ((w_sprite->y >= wall_sprite.y) && ((w_sprite->y - wall_sprite.y) < 3)))
        return 1;

    if (((w_sprite->x >= wall_sprite.x) && ((w_sprite->x - wall_sprite.x) < 3)) && ((w_sprite->y <= wall_sprite.y) && ((w_sprite->y - wall_sprite.y) > -3)))
        return 1;

    if (((w_sprite->x <= wall_sprite.x) && ((w_sprite->x - wall_sprite.x) > -3)) && ((w_sprite->y <= wall_sprite.y) && ((w_sprite->y - wall_sprite.y) > -3)))
        return 1;

    return 0;
}

私の主な問題は、スプライトが等しい/より大きい/より小さい正確な数を指定することです。例でわかるように、それは3または-3です。数字を取り出すと、スプライトは技術的には壁と同じ x または y 軸上にあるため、1 を返し、スプライトを停止します。このための正しいサイズ パラメータは何ですか?

ケースの問題: スプライトは、壁に直接触れたときにのみ停止する必要があります。現在、スプライトは壁を通過するか、壁に近づいていないときに停止します。

4

2 に答える 2

1

まず第一に、あなたのコードは少し複雑に見えます.以下は、衝突を検出する標準的な(または私が信じている)方法です。Aこの関数を使用すると、各衝突を手動でチェックする代わりに、コライダーとの間の衝突を検出できますB。これで使用される構造体には、各コライダーの、、および座標に関するcollider情報が含まれている必要があることに注意してください。次に、すべてのコライダーを配列に格納し、それらにインデックスを付けて衝突をチェックできます。関数:topbottomleftright

int collisionFunction(collider * A, collider * B){

    //Check to see if the colliders are "lined up" on the X-axis 
    if( (A->right > B->left ) && (B->right > A->left) ){

        //Check to see if the colliders are also "lined up" on the Y-axis
        if( (A->top < B->bottom) && (B->top < A->bottom) ){
            return 1; // COLLISION DETECTED
        }
    }

    return 0;//NO COLLISION DETECTED      
}

関数/アルゴリズムの説明:まず、ABが x 軸上に「並んでいる」かどうかを確認します。「整列」とは、2 つのコライダーが X 軸上の位置に基づいて衝突する可能性があることを意味します。次に、各コライダーが Y 軸上に並んでいるかどうかを確認します。両方の条件が満たされている場合、コライダーは衝突しています。 最初はこれを把握するのが少し難しいかもしれないので、紙に形を描いてこれをトレースし (衝突するものと衝突しないものがある)、アルゴリズムが衝突しているかどうかを確認することをお勧めします。このアルゴリズムは、原点 (つまり (0,0) ) が画面の左上隅にある座標系で機能します。これは 2D グラフィックスの規則です

このアルゴリズムを使用すると、プレーヤーが壁を部分的に通過することに注意してください。これは、2D ゲームでは非常に一般的です。ただし、使用しているピクセル数を考えると、これは明らかに問題になる可能性があります。したがって、このアルゴリズムを実装するときは、それを考慮する必要があります。

于 2015-05-22T11:04:25.120 に答える
0

これはどう?

int wall_collision(Sprite *w_sprite)
{
  if(w_sprite->left >= wall_sprite->right) return 0;
  if(w_sprite->right <= wall_sprite->left) return 0;
  if(w_sprite->top >= wall_sprite->bottom) return 0;
  if(w_sprite->bottom <= wall_sprite->top) return 0;
  return 1;
}

Left/Right/Top/Bottom は、値または関数にするか、実際の値に置き換えるだけです。「左」と「上」は、スプライトまたは壁の x/y 値と同じになります。「右」と「下」は、それぞれスプライトまたは壁のピクセル単位の x/y + 幅/高さになります。

簡単な衝突検出に関する詳細なチュートリアルについては、次のリンクを参照してください: http://lazyfoo.net/SDL_tutorials/lesson17/index.php

編集:コード例では、右に行くほど x が増加し、下に行くほど y が増加する座標系を想定しています。

于 2015-05-22T10:37:52.233 に答える