为什么我的球不能从一个区块反弹?

时间:2014-12-24 01:53:16

标签: math processing collision game-physics

我无法弄清楚我做错了什么。我检查球击中了哪一侧并适当地改变了x / y分量,但它直接穿过了盒子。有帮助吗?谢谢。

PVector p = new PVector(0, 0); //position
PVector v = new PVector(5, 10); //velocity

void setup()
{
  size(600, 600);
}

void draw()
{
  background(0);
  rect(250, 250, 200, 100);
  ellipse(p.x, p.y, 20, 20);
  p.add(v);
  if (p.x < 0 || p.x > width) // ball hit sides of window
  {
    v.x = -v.x;
  }
  if (p.y < 0 || p.y > height) // ball hit top/bottom of window
  {
    v.y = -v.y;
  }
  if (p.x > 250 && p.x < 450 && p.y > 250 && p.y < 350) // ball is inside box
  {
    if (p.y - v.y <= 250 || p.y + v.y >= 350) // ball came from above/below
    {
      v.y = -v.y;
    } 
    if (p.x - v.x <= 250 || p.x + v.x >= 450) // ball came from sides
    {
      v.x = -v.x;
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您的初始设置实际上几乎是完美的。我只改变了第三个if语句中的两个东西(处理与矩形冲突的if语句)。

- 将点的宽度/高度增加/减去点的x / y。因此,您不仅可以使用点的中心进行碰撞检测,还可以使用整点。

-Changed&gt;或者&lt;在&gt; =&lt; =中,因为您使用5和10的增量工作,几乎可以肯定该点的X与250或450相同。对于Y,相同。

这是我的完整脚本版本,希望它有所帮助!

PVector p = new PVector(0, 0); //position
PVector v = new PVector(5, 10); //velocity

void setup()
{
  size(600, 600);
}

void draw()
{
  background(0);
  rect(250, 250, 200, 100);
  ellipse(p.x, p.y, 20, 20);
  p.add(v);
  if (p.x < 0 || p.x > width) // ball hit sides of window
  {
    v.x = -v.x;
  }
  if (p.y < 0 || p.y > height) // ball hit top/bottom of window
  {
    v.y = -v.y;
  }
  if (p.x + 10 >= 250 && p.x - 10 <= 450 && p.y + 10 >= 250 && p.y - 10 <= 350) // ball is inside box
  {
    if (p.y  <= 250 || p.y  >= 350) // ball came from above 
    {
      v.y = -v.y;
    } 
    if (p.x <= 250 || p.x >= 450) // ball came from sides
    {
      v.x = -v.x;
    }
  }
}