【问题标题】:How to avoid multiple collision with libgdx?如何避免与 libgdx 的多次冲突?
【发布时间】:2015-10-19 14:43:05
【问题描述】:

我正在使用 java 和 libgdx 编写我的第一个 2D 游戏:破砖机。

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

让我们来解释一下:我创建了一个积木数组(积木扩展了矩形)。所有这些砖块都具有与矩形相同的参数,但我添加了 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;   
            }
        }

NB : 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 == 球的位置 // posbr == 砖的位置 // nb_br_par_ligne 是找到向上或向下“r”的砖的方法(这里的 nb_br_par_ligne = 13,因为我每行有 13 个砖)。

在这段代码中,我试图说“如果球接触 2 块砖,则选择最近的,如果距离相同,则选择左边的那个。对于另一个,将所有布尔值设置为 false 以避免碰撞。”我还添加了一些东西,使砖块只有在与球重叠并且是已选择的砖块时才会消失,但它不起作用。

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

以下两个示例运行良好,但我不确定我是否在多次碰撞中正确使用它们:我试图将它们放入测试是否存在多次碰撞的循环中,然后我试图将其排除在外循环...

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

        }

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

        }

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

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

【问题讨论】:

    标签: java libgdx collision


    【解决方案1】:

    你只需要改变一次速度。

    目前你改了两次,如果球碰到了两块砖和x * -1 * -1 = x,就说明你根本不改。

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

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

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

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

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

    【讨论】:

    • 非常感谢,听起来不错,我试试,但不会让两块砖同时消失吗?
    • 我不是打砖块游戏的专业人士,但这不正常吗?否则,检查球旗是否尚未击中。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多