[英]How to make a circle bounce of a corner of a rectangle - Processing
我會保持這個快速。
只是制作一個處理程序,讓球從矩形上彈開。
目前我只能弄清楚如何做頂部,左側,右側和底部,但是當球進入矩形的角落時,它不會反彈而是進入矩形並在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;
}
對不起,我知道如何很好地插入代碼,我是這個網站的新手,請憐憫哈哈:)
干杯
問題不在於您需要檢測角碰撞。 你還有另外兩個問題:
問題 1:當您檢測到碰撞時,您需要移動球,使其不再與矩形碰撞。
如果不這樣做,那么當球與盒子頂部相交時,將vy
變量乘以-1
。 這導致圓圈開始向上移動。 但是下一幀,圓仍然與矩形碰撞,因為它還沒有向上移動。 所以,你的代碼檢測到碰撞,倍數vy
由-1
一遍,球移動退縮。 下一幀發生同樣的事情,直到球最終停止與矩形碰撞。
減慢幀率,看看我在說什么:
要解決此問題,您需要將球“彈回”到不再與矩形相交的位置。 這樣你就知道它不會在下一幀仍然發生碰撞。
問題 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;
}
您還想添加“彈出”球的邏輯,使其不再發生碰撞。
PS:您是否嘗試在 google 或 Stack Overflow 搜索上搜索您的問題? 這個問題幾乎與您的問題完全相同,以至於我很確定您在同一個班級!
我以前實現的一種快速骯臟的方法是首先在每一側添加邊界框並以這樣的方式定位它們,如果球碰撞,例如在右上角,我就會有一個條件:
如果球攔截到邊界頂部和邊界右側:這樣做;
我希望這會有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.