如何避免与 libgdx 的多次碰撞?

How to avoid multiple collision with libgdx?

我正在使用 java 和 libgdx 编码我的第一个 2D 游戏:一个打砖块。

我在处理多重碰撞时遇到一些困难。

让我们来解释一下:我创建了一个砖块数组(Brick extends Rectangle)。所有这些砖块都具有与矩形相同的参数,但我添加了 4 个布尔值:左、右、上、下。 当 ball.y > brick.y --> up = true 和所有其他 = false。 当 up 为真时,如果球与砖块重叠,则 ball.y *= -1。 (对于位置和速度,我使用的是 Vector2)。其他 3 个布尔值完全相同(我当然使用 ball.x *=-1)。

if(briques.get(r).up_b == true || briques.get(r).down_b == true) {
            if(ball.overlaps(briques.get(r))) {
                vitb.y *= -1;   
            }
        }    

if(briques.get(r).left_b == true || briques.get(r).right_b == true) {
            if(ball.overlaps(briques.get(r))) {
                vitb.x *= -1;   
            }
        }

注意:vitb == 球速 (Vector2)。

这部分工作完美。但问题是:

我的球的宽度和高度均为 10 像素。所以,如果所有积木彼此之间的距离至少为 10 像素,就可以了。但如果它更少,球一次可以接触到 2 个砖块。它只是冻结然后完全错误...

我尝试了很多东西,我不知道该怎么做。我认为这是因为 2 个向量在 2 个不同的方向发送球,所以我试过这个:

try {
        if(ball.overlaps(briques.get(r)) && ball.overlaps(briques.get(r+1))) {

            if(((posb.dst(posbr.get(r))) < (posb.dst(posbr.get(r+1)))) || ((posb.dst(posbr.get(r))) == (posb.dst(posbr.get(r+1))))){
                briques.get(r+1).up_b = false;
                briques.get(r+1).down_b = false;
                briques.get(r+1).right_b = false;
                briques.get(r+1).left_b = false;
            }
        }

        if(ball.overlaps(briques.get(r)) && ball.overlaps(briques.get(r + nb_br_par_ligne))) {
            if((posb.dst(posbr.get(r))) < (posb.dst(posbr.get(r+nb_br_par_ligne))) || (posb.dst(posbr.get(r))) == (posb.dst(posbr.get(r+nb_br_par_ligne)))){
                briques.get(r+nb_br_par_ligne).up_b = false;
                briques.get(r+nb_br_par_ligne).down_b = false;
                briques.get(r+nb_br_par_ligne).right_b = false;
                briques.get(r+nb_br_par_ligne).left_b = false;
            }
        }
        } catch(IndexOutOfBoundsException e){
            e.printStackTrace();
        } 

NB : posb == ball position // posbr == brick position // nb_br_par_ligne 是找到向上或向下的砖块的方法 "r" (nb_br_par_ligne =这里是 13,因为我每行有 13 块砖)。

在这段代码中,我试图说 "If the ball touches 2 bricks, choose the nearest, if it's the same distance, then choose the one on the left. For the other one, set all booleans to false to avoid collision." 我还添加了一些东西,使砖块仅在与球重叠并且是已选择的砖块时消失,但它不起作用。

我也试过其他的东西,但我不知道哪里出了问题。

以下两个示例工作得很好,但我不确定我是否正确地使用了它们与多重碰撞:我试图将它们放在循环中以测试是否存在多重碰撞,然后我尝试将其放入脱离循环...

if(ball.overlaps(briques.get(r))) {
            briques.get(r).setRes(briques.get(r).getRes()-1);

        }

if(briques.get(i).getRes() == 0) {
            briques.removeIndex(i);

        }

所以我来这里是想问一下,如果我的球碰到 2 个砖块,是否有人可以给我一个如何避免多次碰撞的建议。

谢谢大家(如果我在英语上犯了一些错误,抱歉)。

您只需更改一次速度。

目前你改了两次,如果球撞到两块砖x * -1 * -1 = x,这意味着你根本不改。

只需添加一个球需要改变方向的标志,每帧(或模拟步骤)只能设置一次。

然后在碰撞检查之后,检查这个标志(并在必要时重置它)并相应地操纵速度。

这个标志可以是一个枚举:

public enum Hit
{
     TOP, BOT, LEFT, RIGHT, NONE;
}

默认值为 NONE,这样您就可以检查球是否已经击中某物。