Java 如何避免与libgdx的多次冲突?

Java 如何避免与libgdx的多次冲突?,java,libgdx,collision,Java,Libgdx,Collision,我正在用java和libgdx编写我的第一个2D游戏:一个砖块破坏者 我在处理多次碰撞时遇到一些困难 让我们来解释一下:我创建了一个砖块数组(砖块扩展为矩形)。所有这些砖块的参数都与矩形相同,但我添加了4个布尔值:左、右、上、下。 当ball.y>brick.y-->up=true且所有其他值均为false时。 当up为真时,若球和砖块重叠,则ball.y*=-1。(对于位置和速度,我使用Vector2)。对于其他3个布尔值,情况完全相同(对于左侧和右侧,我使用ball.x*=-1) 及 注:v

我正在用java和libgdx编写我的第一个2D游戏:一个砖块破坏者

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

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

注:vitb==球速(矢量2)

这部分工作得很好。但问题是:

我的球有10个像素的宽度和高度。因此,如果所有的砖块彼此之间至少有10个像素的距离,那么就可以了。但是如果它的数量少,球一次可以碰到两块砖。然后它就完全冻结了

我已经尝试了很多事情,我不知道该怎么办。我认为这是因为两个向量将球发送到两个不同的方向,所以我尝试了以下方法:

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();
        } 
所以我想问一下,如果我的球碰到两块砖头,是否有人能给我一个建议,如何避免多次碰撞


谢谢大家(如果我在英语方面犯了一些错误,请原谅)。

您只需更改速度一次

当前,如果球击中两块砖块并且
x*-1*-1=x
,则您将更改它两次,这意味着您根本不会更改它

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

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

此标志可以是枚举:

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

默认设置为
NONE
,这样你就可以检查球是否已经击中了什么东西。

非常感谢。听起来不错,我会试试,但它不会让两块砖块同时消失吗?我不擅长砖块破坏游戏,但这不正常吗?另一方面,如果球还没有击中,检查球旗。
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();
        } 
if(ball.overlaps(briques.get(r))) {
            briques.get(r).setRes(briques.get(r).getRes()-1);

        }

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

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