Processing 圆与矩形碰撞

Processing 圆与矩形碰撞,processing,collision-detection,Processing,Collision Detection,我有一个程序处理弹跳球和一个矩形。我可以正确地得到矩形边的碰撞,但是我不知道如何得到角。这就是我到目前为止所做的: int半径=20; 浮圈,浮圈//位置 浮动vx=3,vy=3//速度浮动boxW,boxH//蝙蝠尺寸 无效设置(){ 尺寸(400400); 椭圆模型(半径); 矩形模式(半径); circleX=宽度/4; 圆圈=高度/4; boxW=50; boxH=20; } 作废提款(){ 背景(0); circleX+=vx; circleY+=vy; //从侧面弹跳 如果(圈+半径

我有一个程序处理弹跳球和一个矩形。我可以正确地得到矩形边的碰撞,但是我不知道如何得到角。这就是我到目前为止所做的:

int半径=20;
浮圈,浮圈//位置
浮动vx=3,vy=3//速度浮动boxW,boxH//蝙蝠尺寸
无效设置(){
尺寸(400400);
椭圆模型(半径);
矩形模式(半径);
circleX=宽度/4;
圆圈=高度/4;
boxW=50;
boxH=20;
}
作废提款(){
背景(0);
circleX+=vx;
circleY+=vy;
//从侧面弹跳
如果(圈+半径>宽度| |圈<半径){vx*=-1;}//左右
如果(圆+半径>高度| |圆<半径){vy*=-1;}//顶部和底部
如果(圆圈+半径>高度){
圆环=(高度半径)-(圆环-(高度半径));}//底部校正
//从球棒上弹跳
如果(circleY+radius>mouseY-boxH&&circleX>mouseX-boxW&&circleXmouseY-boxH&&circleYmouseY+boxH&&circleX>mouseX-boxW&&circleXmouseY-boxH&&circleY

我不知道在if语句中放入什么来检测角碰撞。

问题不在于您需要检测角碰撞。问题在于,当检测到碰撞时,当前碰撞检测不会将球移动到一侧

setup()
函数中调用
frameRate(5)
,以更好地查看发生了什么:

请注意,球与长方体顶部相交,因此将
vy
变量乘以
-1
。这会导致圆开始向上移动。但在下一帧中,圆仍然与矩形碰撞,因为它还没有向上移动足够的距离。因此,您的代码检测到碰撞,再次将
vy
乘以
-1
,球向下移动。下一帧同样的事情发生,直到球最终停止与矩形碰撞

要解决此问题,当检测到碰撞时,需要移动球,使其在下一帧中不再与矩形碰撞

下面是一个如何在顶部执行此操作的示例:

if (circleY + radius > mouseY - boxH && circleX > mouseX - boxW && circleX < mouseX + boxW) { 
    vy *= -1; //top
    circleY = mouseY-boxH-radius;
}

这将取代您的四个独立的
if
语句,并解决上述问题。

问题不在于您需要检测拐角碰撞。问题在于,当检测到碰撞时,当前碰撞检测不会将球移动到一侧

setup()
函数中调用
frameRate(5)
,以更好地查看发生了什么:

请注意,球与长方体顶部相交,因此将
vy
变量乘以
-1
。这会导致圆开始向上移动。但在下一帧中,圆仍然与矩形碰撞,因为它还没有向上移动足够的距离。因此,您的代码检测到碰撞,再次将
vy
乘以
-1
,球向下移动。下一帧同样的事情发生,直到球最终停止与矩形碰撞

要解决此问题,当检测到碰撞时,需要移动球,使其在下一帧中不再与矩形碰撞

下面是一个如何在顶部执行此操作的示例:

if (circleY + radius > mouseY - boxH && circleX > mouseX - boxW && circleX < mouseX + boxW) { 
    vy *= -1; //top
    circleY = mouseY-boxH-radius;
}

这将取代四个独立的
if
语句,同时也解决了上述问题。

您需要重新思考您对几何体的“印象”。第一:圆在物理上不可能碰到拐角。第二:你没有撞到一个角落,你同时撞到了两边。你需要重写你的逻辑,让你可以同时击中多个方向。只要粗略地看一下你们的前两个if语句就可以了。你们有并没有把它整理好?你们需要重新思考你们对几何的“印象”。第一:圆在物理上不可能碰到拐角。第二:你没有撞到一个角落,你同时撞到了两边。你需要重写你的逻辑,让你可以同时击中多个方向。只要粗略地看一下你的前两个if语句就可以了。你有没有把它整理好?
  if (collides(circleX + vx, circleY)) {
    vx*=-1;
  } 
  else {
    circleX += vx;
  }
  if (collides(circleX, circleY + vy)) {
    vy*=-1;
  } 
  else {
    circleY += vy;
  }