2016-07-27 68 views
1

我會保持這個快速。如何使一個矩形的一個角落的圓形反彈 - 處理

只是製作一個處理程序,其中球從長方形反彈。

目前我只能弄清楚如何做頂部,左側,右側和底部,但當球進入矩形的角落時,它不會彈開,而是進入矩形, 1或2次反彈獲得贖回。

我真的想知道我應該怎麼去造球偏轉關閉長方形的角,因此好好嘗試毛刺

這裏是我的代碼:

float x = 100, y = 100, radius = 50; 
    float vx = 3, vy = 3; 
    float MX = 0; 
    float MY = 0; 


    void setup() { 
     size(500, 700); 
    } 

    void draw() { 
     background(0); 
     fill(255); 

     x += vx; 
     y += vy; 
     if (x + radius > width) { 
      vx = vx * -1; 
     } 
     //makes the ball bounce off the right 
     if (x - radius < 0) { 
      vx = vx * -1; 
     } 
     //makes the ball bounce off the left 
     if (y + radius > height) { 
      vy = vy * -1; 
      y = height - radius; 
     } 
     //make the ball bounce off the top 
     if (y - radius < 0) { 
      vy = vy * -1; 
      y = radius; 
     } 
     //makes the ball bounce off the top 
     if (y + radius > MY && x + radius > MX + 50 && x + radius < MX + 150 && 
      y + radius < MY + 20) { 
      vy *= -1; 
      y = MY - 3 - radius; 
     } //Top Side 
     if (x - radius < MX + 100 && y > MY - 10 && y < MY + 10 && x - radius > MX) { 
      vx *= -1; 
     } // Right Side 

     if (y - radius < MY + 20 && x + radius > MX + 50 && x + radius < MX + 150 && 
      y - radius > MY) { 
      vy *= -1; 
      y = MY + 20 + radius; 
     } //Bottom Side 

     if (x + radius > MX && y > MY - 10 && y < MY + 10 && x + radius < MX + 100) { 
      vx *= -1; 
     } // Left Side 

     ellipse(x, y, radius * 2, radius * 2); 
     rect(MX, MY, 100, 20); 

    } 

void mouseMoved() { 

     MX = mouseX - 50; 
     MY = mouseY - 10; 
     if (MX < 0) { 
      MX = 0; 
     } 
     if (MX > 400) { 
      MX = 400; 
     } 
     if (MY < 0) { 
      MY = 0; 
     } 
     if (MY > 680) { 
      MY = 680; 
    } 

對不起,我做知道,知道,如何插入的代碼非常好,我是新來這個網站,請憐憫哈哈:)

乾杯

+0

你和這個人在同一班嗎? http://stackoverflow.com/questions/38559208/circle-and-rectangle-collision –

回答

0

一個快速骯髒的方式我以前的政績有這是通過首先向每邊添加邊界框並將它們定位,以便如果球與右上角發生碰撞,那麼我將有一個條件:

如果球攔截界限右上界:做這個;

我希望這有助於!

1

問題不在於您需要檢測角落碰撞。您還有其他兩個問題:

問題1:當您檢測到碰撞時,您需要移動球,使其不再碰撞矩形。

如果不這樣做,那麼當球與盒子頂部相交時,將vy變量乘以-1。這會導致圈子開始向上移動。但是下一幀,圓仍然與矩形碰撞,因爲它還沒有完全移動。因此,您的代碼會檢測到該碰撞,再次通過-1倍增vy,並且球向下移動。下一幀發生同樣的事情,直到球最終停止與矩形碰撞。

慢的幀率下,看看我說的是:

bad collision

要解決這個問題,你需要「啪」球回到那個沒有再與矩形相交的位置。這樣你就知道它不會在下一幀中碰撞。

問題2:你不應該單獨在每一邊進行碰撞。相反,在整個圓和整個矩形之間進行碰撞,然後一次檢查一個運動軸。

一次檢查一邊會導致很多頭痛,包括一次碰到多邊的問題。我也會打賭你的代碼沒有按照你的想法進行:嘗試將println()語句添加到你的所有if語句中,以確保它們在他們認爲是正在執行時執行。

要解決這個問題,我會創造一個collides()函數,它的參數球的下一個位置,並返回球是否將與矩形的任何一側發生碰撞。然後通過下一個X和Y位置並翻轉它們的速度。它看起來像這樣:

if (collides(circleX + vx, circleY)) { 
    vx*=-1; 
    } 
    else { 
    circleX += vx; 
    } 
    if (collides(circleX, circleY + vy)) { 
    vy*=-1; 
    } 
    else { 
    circleY += vy; 
    } 

你還想添加「彈出」球的邏輯,使它不再碰撞。

good collision

PS:你有沒有嘗試搜索對谷歌或堆棧溢出的搜索問題了嗎? This question幾乎是你的問題的完全重複,直到我確信你在同一個班級!