Java 如何检测矩形的哪一侧被击中
How to detect which side has been hit of a Rectangle in Java
我正在 Java 中制作 Breakout 游戏,我已经到了需要能够检测到 Ball 与 Brick 的哪一侧相交的地步。目前我正在使用 intersects 方法,但这只检测交叉点,而不是具体哪一侧被击中。这是方法(我在一些评论中添加了):
public boolean intersects(Rectangle r) {
// The width of the Brick as tw
int tw = this.width;
// The height of the Brick as th
int th = this.height;
// The width of the given Rectangle as rw
int rw = r.width;
// The height of the given Rectangle as rh
int rh = r.height;
// Check if the given Rectangle or Brick does not exist
if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
// If not, then return false because there is nothing to collide/intersect
return false;
}
// The x location of Brick as tx
int tx = this.brickLocation.x;
// The y location of Brick as ty
int ty = this.brickLocation.y;
// The x location of the given Rectangle as rx
int rx = r.x;
// The y location of the given Rectangle as ry
int ry = r.y;
// RW = RW + RX
rw += rx;
// RH = RH + RY
rh += ry;
// TW = TW + TX
tw += tx;
// TH = TH + TY
th += ty;
// overflow || intersect
return ((rw < rx || rw > tx) &&
(rh < ry || rh > ty) &&
(tw < tx || tw > rx) &&
(th < ty || th > ry));
}
我现在已将此方法放入我的 类 之一,并且正在对其进行自定义,但是我在制作它时遇到了麻烦,因此它无法检测哪一侧被击中,因为最后 return 语句是如此相互关联,你不能只取其中一条线,因为为了让它知道那一边结束的地方,它需要知道另一边,这就是它在这里所做的,如果它与所有的相交侧面(并且侧面的外展没有限制 - 虽然当然明显它们是有限的)那么它 return 是真的,如果不是那么不是并且它没有触及形状,否则它会已经完成了。
我想做的是让 if 语句决定什么是 returned(我将把它的 return 类型从 boolean 改为int),因此它击中了哪一侧,以便它可以以适当的方式反弹。但因为它们是如此相互依存,我不知道如何将它们分开:
// overflow || intersect
return ((rw < rx || rw > tx) &&
(rh < ry || rh > ty) &&
(tw < tx || tw > rx) &&
(th < ty || th > ry));
我在这里看到了很多类似的问题,但要么是用不同的语言,要么没有任何答案,要么没有任何答案可以回答问题并被接受。所以我想知道是否有人可以建议我如何将它们分开以便它可以检测到哪一侧被击中,因为我没有想法?
或者也许已经有一个 Java 方法可以为我做这件事而且我不必覆盖已经存在的方法?我有最新版本的Oracle JDK 8.
尽量让你的 intersects(Rectangle r) function return -1 在没有击中任何边的情况下,和 0-1-2-3 来确定你击中的边。根据增加的部分..
你可以做到这一点的一种方法是在移动球时我假设你会做这样的事情:
ball.x += speedX;
ball.y += speedY;
你可以把它变成这样:
ball.x += speedX;
if (intersects(ball, brick))
{
//Ball touched brick on left/right side (depending if speedX is positive or negative)
}
ball.y += speedY;
if (intersects(ball, brick))
{
//Ball touched brick on top/bottom side (depending if speedY is positive or negative)
}
我正在 Java 中制作 Breakout 游戏,我已经到了需要能够检测到 Ball 与 Brick 的哪一侧相交的地步。目前我正在使用 intersects 方法,但这只检测交叉点,而不是具体哪一侧被击中。这是方法(我在一些评论中添加了):
public boolean intersects(Rectangle r) { // The width of the Brick as tw int tw = this.width; // The height of the Brick as th int th = this.height; // The width of the given Rectangle as rw int rw = r.width; // The height of the given Rectangle as rh int rh = r.height; // Check if the given Rectangle or Brick does not exist if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) { // If not, then return false because there is nothing to collide/intersect return false; } // The x location of Brick as tx int tx = this.brickLocation.x; // The y location of Brick as ty int ty = this.brickLocation.y; // The x location of the given Rectangle as rx int rx = r.x; // The y location of the given Rectangle as ry int ry = r.y; // RW = RW + RX rw += rx; // RH = RH + RY rh += ry; // TW = TW + TX tw += tx; // TH = TH + TY th += ty; // overflow || intersect return ((rw < rx || rw > tx) && (rh < ry || rh > ty) && (tw < tx || tw > rx) && (th < ty || th > ry)); }
我现在已将此方法放入我的 类 之一,并且正在对其进行自定义,但是我在制作它时遇到了麻烦,因此它无法检测哪一侧被击中,因为最后 return 语句是如此相互关联,你不能只取其中一条线,因为为了让它知道那一边结束的地方,它需要知道另一边,这就是它在这里所做的,如果它与所有的相交侧面(并且侧面的外展没有限制 - 虽然当然明显它们是有限的)那么它 return 是真的,如果不是那么不是并且它没有触及形状,否则它会已经完成了。
我想做的是让 if 语句决定什么是 returned(我将把它的 return 类型从 boolean 改为int),因此它击中了哪一侧,以便它可以以适当的方式反弹。但因为它们是如此相互依存,我不知道如何将它们分开:
// overflow || intersect return ((rw < rx || rw > tx) && (rh < ry || rh > ty) && (tw < tx || tw > rx) && (th < ty || th > ry));
我在这里看到了很多类似的问题,但要么是用不同的语言,要么没有任何答案,要么没有任何答案可以回答问题并被接受。所以我想知道是否有人可以建议我如何将它们分开以便它可以检测到哪一侧被击中,因为我没有想法?
或者也许已经有一个 Java 方法可以为我做这件事而且我不必覆盖已经存在的方法?我有最新版本的Oracle JDK 8.
尽量让你的 intersects(Rectangle r) function return -1 在没有击中任何边的情况下,和 0-1-2-3 来确定你击中的边。根据增加的部分..
你可以做到这一点的一种方法是在移动球时我假设你会做这样的事情:
ball.x += speedX;
ball.y += speedY;
你可以把它变成这样:
ball.x += speedX;
if (intersects(ball, brick))
{
//Ball touched brick on left/right side (depending if speedX is positive or negative)
}
ball.y += speedY;
if (intersects(ball, brick))
{
//Ball touched brick on top/bottom side (depending if speedY is positive or negative)
}