2011-12-27 8 views
0

私はトップダウンの小さなゲームで動作するように衝突を試みてきました。私は、プレーヤーを追いかけているエンティティの束を持っています。もし私が衝突していなければ、彼らは明らかにすべてがまったく同じ場所に束ねられます。私は衝突があったかどうかを確認する方法を知っていますが、それにどのように反応するかはわかりません。私はそれを2,3時間、ちょうど回り込むことからいくらか働いていますが、それは本当に良いことではありません。プレイヤーを追うエンティティ間の衝突検出

if (check_collision(enemies[e1]->xPos, enemies[e1]->yPos, SIZE_ENEMY, SIZE_ENEMY, enemies[e2]->xPos, enemies[e2]->yPos, SIZE_ENEMY, SIZE_ENEMY) == true) 
{ 
     //the distance that is intersecting 
    float dx, dy; 

    if (enemies[e1]->xPos > enemies[e2]->xPos) 
     dx = enemies[e2]->xPos + SIZE_ENEMY - enemies[e1]->xPos; 

    if (enemies[e2]->xPos > enemies[e1]->xPos) 
     dx = enemies[e1]->xPos + SIZE_ENEMY - enemies[e2]->xPos; 

    if (enemies[e1]->yPos > enemies[e2]->yPos) 
     dy = enemies[e2]->yPos + SIZE_ENEMY - enemies[e1]->yPos; 

    if (enemies[e2]->yPos > enemies[e1]->yPos) 
     dy = enemies[e1]->yPos + SIZE_ENEMY - enemies[e2]->yPos; 

    if (dx < dy) 
    { 
     enemies[e1]->xPos += (dx/2); 
     enemies[e2]->xPos -= (dx/2); 
    } 

    if (dy < dx) 
    { 
     enemies[e1]->yPos += (dy/2); 
     enemies[e2]->yPos -= (dy/2); 
    } 

} 

私はちょうど完全にそれを間違ったやり方にしているかもしれないし、ちょっとしたことがないかもしれないので、何か助けに感謝します。

+0

あなたはより多くの運を持っているかもしれませんhttp://gamedev.stackexchange.com/ –

答えて

0

エンティティの次の位置を計算するときに、別のエンティティとの衝突がないかどうかを確認します。もしそうなら、このエンティティをまったく動かさないでください。

もう1つのアプローチは、あるエンティティから別のエンティティへの距離とベクトルを計算することです。距離はピタゴラスの定理によって計算されます:d = (x1-x2)^2 + (y1-y2)^2。 * DD

newx2 = X2 +(X2-X1):d < 2*SIZE_ENEMY場合、それらが重複していると、あなたは、少なくともDD = 2*SIZE_ENEMY - dのために離れてベクトル(X2-X1、Y2-Y1)によってそれらのいずれかを移動する必要があります/(2 * SIZE_ENEMY)

newy2 = Y2 +(Y2-Y1)*(2 * SIZE_ENEMY)/ DD

希望、私は式にミスを犯していない:)

+0

で投稿してください。また、ベクトル計算を見てください:http://en.wikipedia.org/wiki/Euclidean_vector。比較的シンプルですが、2Dゲームでは大いに役立ちます。 – werewindle