我在一个简单的2D游戏,Arkanoid游戏中做了一个项目。
我几乎所有事情都正常工作,但是我遇到了球与砖块的碰撞,也就是说,在碰撞时,应该像墙一样,扭转球的方向。
问题出现在水平或垂直方向上是否发生碰撞,例如,如果与砖块发生碰撞,则应仅投资X轴方向而不改变Y轴,反之亦然。
我无法找到检查给我的代码。
public void detectCollisionWithBricks() {
for (int i = 0; i < brickGroup.length; i++) {
for (int j = 0; j < brickGroup[i].length; j++) {
if (brickExists[i][j]) {
if (getEllipse().intersects(
brickGroup.brick[i][j]
.getRectangle())) {
incY*=-1;
incX*=-1;
brickExists[i][j] = false;
}
}
}
}
}
代码:
-brickGroup: bidimensional array of bricks
-brick: class painting a brick in the panel
-brickExist: bidimensional array whit se same size as brickGroup, if false, doesn't paint the brick.
-getEllipse(): returns an Ellipse2D.Double, with the coordinates of the ball.
-getRectangle(): returns an Rectangle2D.Double, with the coordinates of the brick.
-incX: increases the X position of the ball.
-incY: increases the Y position of the ball.
询问您是否不理解某些代码。
对不起我的英文:(
提前致谢
答案 0 :(得分:0)
您不能总是同时反转这两个尺寸:
incY*=-1;
incX*=-1;
您必须独立处理每个维度。 尝试使用向量,请参阅:2d collision response between circles
在您的情况下,它可能更简单,它将取决于incX或incY的现有价值。如果incX非零并且incY为零,则表示您正在水平移动。我建议不要使用1 / -1,而是使用一些可变速度并将其反转:
incY = -incY;
incX = -incX;
答案 1 :(得分:0)
我建议采用以下方法;
首先将砖块表示为2d数组
bricks = new int[width][height];
您可以根据需要更改网格的大小。通过这样做,您可以根据球在给定时间的位置检查碰撞,这意味着不会有耗时的检查循环
if (bricks[ballx/brickwidth][bally/brickheight] > 0) {
//we have a collision
}
接下来,您可以根据具有容差的游戏网格线位置检查是水平碰撞还是垂直碰撞
if (bricks[ballx/brickwidth][bally/brickheight] > 0) {
if (ballx % gridwidth < tolerance) {
incx*=-1;
}
if (bally % gridheight < tolerance) {
incy*=-1;
}
}
这也应该处理砖块角落的碰撞
答案 2 :(得分:0)
如果你测量球和砖的中心之间的线的角度(使用Math.atan2()
很容易计算),你可以用它来确定球应该移动到的方向。
此外,这将允许您以浮点精度而不是仅+1或-1更改方向。