2013-12-17 135 views
2

所以我是一個非常新的程序員,我試圖弄清楚如何在數組中獲取矩形來檢測碰撞。我試圖想出來,發現了一些我認爲可行的例子,但到目前爲止還沒有。處理陣列中的矩形碰撞檢測

這是我的代碼,它不是很多。

我有時會在郵箱朝向屏幕頂部時收到郵件,但我不知道爲什麼。

Box [] b = new Box[1]; 

float x,y,w,h; 

void setup(){ 
    size(800,800); 
    x=random(width); 
    y=random(height); 
    w=random(200); 
    h=random(200); 


    b[0] = new Box(x,y,w,h); 

} 

void draw(){ 
    background(0); 
    x=random(width); 
    y=random(height); 
    w=25; 
    h=25; 

    for(int j = 0; j<b.length;j++){ 
    for(int k = 0; k<b.length;k++){ 
     if(j!=k){ 
     b[j].contact(b[k]); 

     } 


    } 

    } 

    for(int i=0;i<b.length;i++){ 
    b[i].run(); 


    } 



} 


void keyPressed(){ 

    if(key =='n'){ 

    Box boxnew = new Box(x,y,w,h); 
    b = (Box[]) append(b,boxnew); 



    } 


} 


class Box{ 

    float x,y,w,h,c1,c2,c3,ii,xmo,ymo; 

Box(float mx,float my,float mw,float mh){ 

    x=mx; 
    y=my; 
    w=mw; 
    h=mh; 
    c1=150; 
    c2=50; 
    c3=200; 
    xmo=1; 
    ymo=1; 


} 
    void run(){ 
    maker(); 
    mover(); 
    wcolli(); 


    } 

    void maker(){ 
    ii=random(-1,1); 
    c1+=ii; 
    c2+=ii; 
    c3+=ii; 
    fill(c1,c2,c3); 
    rect(x,y,w,h); 

    } 

    void mover(){ 
    x+=xmo; 
    y+=ymo; 


    } 

    void wcolli(){ 

    if(x>800-w||x<1){ 
     xmo*=-1; 
     } 
     if(y>800-h||y<1){ 
     ymo*=-1; 
     } 


    } 
    void contact(Box b){ 

    if((b.x>=this.x&&b.x<=this.w||b.w>=this.x&&b.w<=this.x) && (b.h>=this.y||b.y<=this.h)){ 
     println("hit"); 



    } 
    if((b.y<=this.h&&b.y>=this.y||b.h<=this.h&&b.h>=this.y) && (b.x<=this.w||b.w>=this.x)){ 
     println("hit"); 


    } 


    } 
} 
+0

問題相關..http://stackoverflow.com/questions/23774684/android-rect-intersect-is-always-false/23775232#23775232 – Nepster

回答

3

碰撞檢測中存在一些問題。最重要的是你試圖使用寬度和高度(wh),就好像它們是絕對位置一樣。他們實際上是相對於每個盒子的左上角,所以這就是爲什麼事情似乎沒有工作。在進行任何比較之前,您必須計算實際的右下角位置。

您還必須非常小心您的if條件。這是最好用括號闡明邏輯運算符的優先級,當你相結合,並與OR(&&||)等

對於簡單的軸對齊矩形碰撞這樣的,這裏是一個方法,我覺得有用:

void contact(Box b) { 

    // Calculate the bottom-right corners of the boxes. 
    float myX2 = x + w; 
    float myY2 = y + h; 
    float otherX2 = b.x + b.w; 
    float otherY2 = b.y + b.h; 

    // If this box is entirely to the left of box b, then there is no collision. 
    if (x < b.x && myX2 < b.x) return; 

    // If this box is entirely to the right of box b, then there is no collision. 
    if (x > otherX2 && myX2 > otherX2) return; 

    // If this box is entirely above box b, then there is no collision. 
    if (y < b.y && myY2 < b.y) return; 

    // If this box is entirely below box b, then there is no collision. 
    if (y > otherY2 && myY2 > otherY2) return; 

    // If we reach this point, the boxes haven't missed each other. 
    // Therefore, there must be a collision. 
    println("hit"); 

} 

這是通過檢查一個盒子可能錯過另一個盒子的每種可能情況來確定碰撞。如果它確定他們沒有錯過對方,那麼在邏輯上必定會有碰撞。