我无法弄清楚我做错了什么。我检查球击中了哪一侧并适当地改变了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;
}
}
}
答案 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;
}
}
}