如何使一个矩形角的圆形反弹 - 处理

时间:2016-07-27 11:29:10

标签: java 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;
    }

抱歉,我知道如何很好地插入代码,我是这个网站的新手,请怜悯哈哈:)

干杯

2 个答案:

答案 0 :(得分:2)

问题不在于您需要检测角落碰撞。你还有另外两个问题:

问题1:当您发现碰撞时,您需要移动球,使其不再与矩形相撞。

如果不这样做,那么当球与框顶部相交时,您将vy变量乘以-1。这导致圆圈开始向上移动。但是下一帧,圆圈仍然与矩形相撞,因为它尚未向上移动。因此,您的代码会检测到该冲突,再次将vy乘以-1,然后球向下移动。下一帧发生同样的事情,直到球最终停止与矩形碰撞。

降低帧率以查看我在说什么:

bad collision

要解决此问题,您需要将球“弹回”到不再与矩形相交的位置。这样你知道它不会在下一帧中发生碰撞。

问题2:您不应单独对每一方进行碰撞。而是在整个圆和整个矩形之间进行碰撞,然后一次检查一个运动轴。

一次检查一侧会导致很多麻烦,包括一次击中多方的问题。我还打赌你的代码没有按照你的想法行事:尝试在你的所有println()语句中添加if语句,以确保它们在他们认为是执行时执行。

要解决此问题,我会创建一个collides()函数,该函数接受球的下一个位置的参数,并返回球是否会与任意<发生碰撞/ strong>矩形的一侧。然后传递下一个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:您是否尝试在Google或Stack Overflow搜索中搜索您的问题? This question几乎与你的问题完全重复,我非常确定你在同一个班级!

答案 1 :(得分:0)

我以前实现这一目标的一种快速肮脏的方法是首先在每一侧添加边界框并以一种方式定位它们,如果球碰撞到例如右上角,我将有一个条件:

如果球拦截了界限和界限:做到这一点;

我希望这有帮助!