如何避免与libgdx发生多次冲突?

时间:2015-10-19 14:43:06

标签: java libgdx collision

我正在使用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个向量在两个不同的方向发送球,所以我试过这个:

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();
        } 

注意:posb ==球位置// posbr ==砖块位置// nb_br_par_ligne是找到向上或向下“r”的砖块的方法(nb_br_par_ligne = 13,因为我每行有13块砖块)。< / p>

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

我也尝试过其他事情,我无法弄清楚出了什么问题。

以下两个示例完美地运行但我不确定我是否正确使用它们与多重碰撞:我试图将它们放入测试是否存在多次碰撞的循环中,然后我试图将它放在循环......

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块砖,有人可以就如何避免多次碰撞给我一个建议。

非常感谢(如果我用英语犯了一些错误,那就很抱歉。)

1 个答案:

答案 0 :(得分:0)

你只需要改变一次速度。

目前你改变它两次,如果球击中两个砖和x * -1 * -1 = x,这意味着你根本不改变它。

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

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

此标志可以是枚举:

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

默认值为NONE,以便您可以检查球是否已击中某些东西。