2011-02-05 21 views
2

私はアルカノイドのようなゲームを作ろうとしていますが、今は衝突の問題に直面しています。いつものように、レンガは四角形(私の場合は四角形)で、ボールは円です。したがって、軸に沿ったバウンディングボックスのすべてです。軸合わせバウンディングボックスの衝突:どの辺が衝突しているか

これまでのところ、私は些細な衝突検出アルゴリズムを持っていますが、ボールが当たった各ブリックのどの面を知る必要があります。たとえば:

up = left = right = down = 0; 

if(mouse.left < brick.left && brick.left < mouse.right && mouse.right < brick.right){ 
    left = 1; 
} 

if(brick.left < mouse.left && mouse.left < brick.right && brick.right < mouse.right){ 
    right = 1; 
} 

if(mouse.top < brick.top && brick.top < mouse.bottom && mouse.bottom < brick.bottom){ 
    up = 1; 
} 

if(brick .top < mouse.top && mouse.top < brick.bottom && brick.bottom < mouse.bottom){ 
    down = 1; 
} 

しかし、二つのフラグ(、画像における第三のようなコーナーの近くに衝突、中: Collision cases

は、これまでのところ私は、各辺がヒットしたかどうかをチェックするアルゴリズムを持っています例えば、左と下)が1に設定されているので、私は決める方法を知らない。

これらのケースでは通常何が行われますか?

+0

逆方向の転送ですか?これは、文字通り、「エッジケース」です。ここで何をすべきかを決める必要があります。いいえ。あなたが感じていることは適切ですか? –

+0

なぜあなたはどのエッジを知る必要がありますか?あなたがボールの適切な反映をしようとしているなら、ポイント/カプセルの衝突と4つのエッジの両方のような何かをしているはずです。 – Tetrad

答えて

2

ただ、1に設定侵入深さにそれを設定しないでください:あなたが完了したら

// why is it named mouse? 
if(mouse.left < brick.left && brick.left < mouse.right && 
    mouse.right < brick.right) 
{ 
    left = mouse.right - brick.left; 
} 

// and so on... 

その後、あなたはあなたのメイン側すべき最低限の方選ぶことができます。


ところで、私はあなたがその3番目の条件付きではないと思います。

 
    +-+ 
    |B| 
+--| |--+ 
|M | | | 
| | | | 
+--| |--+ 
    +-+ 

ここでは、左または右の衝突がないとします。

+0

トピックから少し外れて、GPWikiのPythonでSATのツイートを書いたのですか? – Skurmedel

+0

私はあなたが最大ではなく、最小を望むと思います。コーナーでは、ボールを反射したい側が反対側よりも深く浸透しています。 – joriki

+0

ところで、ボールが常にレンガよりも小さい場合、衝突チェックはわずかに冗長です。いずれの場合も、第1条件と第3条件のいずれかが他方を意味します。 – joriki