簡體   English   中英

Java 2D Polygon-多邊形碰撞檢測

[英]Java 2D Polygon - Polygon Collision Detection

最近,我一直在使用Polygon類來創建小行星以及子彈和宇宙飛船。 我目前正在嘗試為程序創建碰撞檢測,但是似乎碰撞檢測僅在大約1/5的時間內起作用(沒有顯示出為什么起作用的圖案)。

這是代碼。創建多邊形:

void renderPoly() {   
    int j;
    int s = sides;
    double r, angle;
    int x, y;

    for (j = 0; j < s; j++) {
        angle = 2 * Math.PI / s * j;
        r = MIN_ROCK_SIZE + (int) (Math.random() * (MAX_ROCK_SIZE - MIN_ROCK_SIZE));
        x = (int) (r * Math.cos(angle));
        y = (int) (r * -Math.sin(angle));

        cOM[0] += x;
        cOM[1] += y;
        pointData[j][0] = x;
        pointData[j][1] = y;
    }

    cOM[0] /= asteroidShape.npoints;
    cOM[1] /= asteroidShape.npoints;

    for (int i = 0; i < asteroidShape.npoints; i++) {
        pointData[i][0] += cOM[0];
        pointData[i][1] += cOM[1];
    }    
}

旋轉和移動多邊形:

void move() {    
    int x, y, i;
    //change rotation
    theta += rotVel;

    //change x
    asteroidData[0] += deltaX;

    //change y
    asteroidData[1] += deltaY;

    for (i = 0; i < asteroidShape.npoints; i++) {

        x = (int) (pointData[i][0] * Math.cos(theta) - pointData[i][1] * Math.sin(theta) );
        y = (int) (pointData[i][0] * Math.sin(theta) + pointData[i][1] * Math.cos(theta) );

        asteroidShape.xpoints[i] = x + asteroidData[0];
        asteroidShape.ypoints[i] = y + asteroidData[1];

        asteroidShape.invalidate();
    }
}

檢查是否碰到子彈:

    boolean hitBullet(Bullet b) {
    this.asteroidShape.invalidate();
    for (int i = 0; i < b.bulletShape.npoints; i++) 
        if (this.asteroidShape.contains(b.bulletShape.xpoints[i], b.bulletShape.ypoints[i]) )
            return true;

    for (int j = 0; j < this.asteroidShape.npoints; j++)
        if (b.bulletShape.contains(this.asteroidShape.xpoints[j], this.asteroidShape.ypoints[j]) )
            return true;

    return false;

}

(ship方法是相同的,除了構造函數需要一個ship對象)

以及在“游戲”類中調用它的循環:

    for (int i = 0; i < aArray.length-1; i++) {
    if (aArray[i] != null) {

        for (int j = 0; j < bArray.length-1; j++) {
            if (bArray[j] != null) {

                if (aArray[i].hitBullet(bArray[j])) {
                    aArray[i] = null;
                    bArray[j] = null;
                    i = aArray.length-1;
                    j = bArray.length-1;
                }

            }
            else {
                i = aArray.length-1;
                j = bArray.length-1;
            }
        }

    }
    else {
        i = aArray.length-1;
    }
}

我一直在尋找諸如“分離軸定理”之類的替代解決方案,但是我有時確實有凸多邊形,並且由於該方法(.contains())已經存在,所以我想使用它。

任何幫助,將不勝感激,謝謝!

解決的簡單方法是將Shapes (在您的情況下為Polygon(2D?))轉換為Areas 您可以使用Area.intersect(Area)來查看兩個Area是否碰撞

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM