我正在尝试使用以下代码片段使球与旋转的矩形碰撞:
for(int i = 0; i < barriers.length; i++) {
Vector2d tempPos = rotate(pos.getX(),
pos.getY(),
barriers[i].getAngle(),
barriers[i].getCenterX(),
barriers[i].getCenterY());
if (
tempPos.getX() > barriers[i].getBarrier().left &&
tempPos.getY() > barriers[i].getBarrier().top &&
tempPos.getX() < barriers[i].getBarrier().right &&
tempPos.getY() < barriers[i].getBarrier().bottom )
{
dead = true;
}
}
}
}
Vector2d rotate(float x1, float y1, float angle, float x2, float y2)
{
sinus = (float)Math.sin(angle);
cosinus = (float)Math.cos(angle);
float tempX = x2 - x1;
float tempY = y2 - y1;
x1 += ((tempX * cosinus) - (tempY * sinus));
y1 += ((tempX * sinus) + (tempY * cosinus));
Vector2d point = new Vector2d(x1, y1);
return point;
}
由于某种原因,即使数学应该是正确的,碰撞也会以稍微错误的角度发生。
在这里,我将角度设置为45度: Rectangles and collision set to 45 degrees
此处设置为90度:Rectangles and collision set to 90 degrees
在90度的图片中,角度更大了,看起来碰撞盒比应该的要小。
该角度取自Barrier类,该类保存每个矩形的Rect及其角度。与使用canvas.save-> rotate-> draw-> restore绘制矩形时使用的角度相同。
Vector2d类仅包含两个浮点数x和y,而pos则保留球的x和y。球没有碰撞盒,只有它的位置。
编辑:代码段中的角度以度为单位,但是即使使用Math.toRadians()将其设置为弧度,我也会遇到同样的问题。
答案 0 :(得分:0)
好吧,所以在玩了一会之后,我设法解决了它。这是我更改的代码:
Vector2d rotate(float x1, float y1, float angle, float x2, float y2)
{
sinus = (float)Math.sin(Math.toRadians(360 - angle));
cosinus = (float)Math.cos(Math.toRadians(360 - angle));
float tempX = x2 - x1;
float tempY = y2 - y1;
x2 += ((tempX * cosinus) - (tempY * sinus));
y2 += ((tempX * sinus) + (tempY * cosinus));
Vector2d point = new Vector2d(x2, y2);
return point;
}
似乎我必须得到反角,并将数学应用于矩形的x和y而不是点的。然后,我返回新的x和y进行碰撞检查...我很困惑,但是可以!