2011-09-30 130 views
2

我想在乒乓球遊戲中做簡單的碰撞檢測。 球是方形,槳(蝙蝠)是長方形。簡單碰撞檢測 - Android

我有兩個實體進來,我可以得到當前的X和Y位置,以及位圖的高度和寬度。這是最簡單的方法嗎?

我有這樣的代碼:

public void getCollision(Entity enitityOne, Entity enitityTwo){ 

    double eventCoordX = (enitityOne.getCenterX() - (enitityTwo.getBitmapWidth()/2)); 
    double eventCoordY = (enitityOne.getCenterY() - (enitityTwo.getBitmapHeight()/2)); 

    double X = Math.abs(enitityTwo.getxPos() - eventCoordX); 
    double Y = Math.abs(enitityTwo.getyPos() - eventCoordY); 

    if(X <= (enitityTwo.getBitmapWidth()) && Y <= (enitityTwo.getBitmapHeight())){ 
     enitityOne.collision(); 
     enitityTwo.collision(); 
    } 
} 

但我很盲目的,在槳的中間這隻作品不是在兩側。 問題是我看不到代碼是錯的。 有人嗎? 有人有更好的主意嗎?

+2

我覺得繪畫的正常情況下和邊緣的情況下圖是非常有用的。 – Skizz

+0

Joakim,getBitmapWidth和getBitmapHeight返回實體的實際大小?我這樣問,因爲實體可以有一個邊界,這個邊界不是這個大小的總和。 –

+0

布魯諾 - 是的,它返回位圖的真實大小,我已經仔細檢查;-) –

回答

4

如果你想要的是找到2米中給出的矩形是否以某種方式相交(因此碰撞),這裏是最簡單的檢查(C代碼;隨意使用浮點值):

int RectsIntersect(int AMinX, int AMinY, int AMaxX, int AMaxY, 
        int BMinX, int BMinY, int BMaxX, int BMaxY) 
{ 
    assert(AMinX < AMaxX); 
    assert(AMinY < AMaxY); 
    assert(BMinX < BMaxX); 
    assert(BMinY < BMaxY); 

    if ((AMaxX < BMinX) || // A is to the left of B 
     (BMaxX < AMinX) || // B is to the left of A 
     (AMaxY < BMinY) || // A is above B 
     (BMaxY < AMinY)) // B is above A 
    { 
     return 0; // A and B don't intersect 
    } 

    return 1; // A and B intersect 
} 

矩形A和B由角的最小和最大X和Y座標定義。

... This has been asked before

+0

非常感謝。 –

+1

爲什麼不使用內建的'Rect.intersect(Rect)'方法 – slayton

0

,如果你正在處理的矩形,然後

/** 
* Check if two rectangles collide 
* x_1, y_1, width_1, and height_1 define the boundaries of the first rectangle 
* x_2, y_2, width_2, and height_2 define the boundaries of the second rectangle 
*/ 
boolean rectangle_collision(float x_1, float y_1, float width_1, float height_1, float x_2, float y_2, float width_2, float height_2) 
{ 
    return !(x_1 > x_2+width_2 || x_1+width_1 < x_2 || y_1 > y_2+height_2 || y_1+height_1 < y_2); 
} 

,這是一個很好的例子......