繁体   English   中英

如何避免与libgdx多次冲突?

[英]How to avoid multiple collision with libgdx?

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

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

让我们来解释一下:我创建了一个砖块数组(Brick扩展了Rectangle)。 所有这些积木具有与矩形相同的参数,但我添加了4个布尔值:左,右,上,下。 当ball.y> brick.y-> up = true时,所有其他= false。 当up为true时,如果球与砖重叠,则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块砖。 它只是冻结然后完全是错误...

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

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块砖块)。

在这段代码中,我试图说:“如果球碰到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);

        }

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

谢谢大家(对不起,如果我在英语方面犯了一些错误)。

您只需要更改一次速度。

当前,如果球击中了两个积木并且x * -1 * -1 = x ,则将其更改两次,这意味着您根本不会更改它。

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

然后,在碰撞检查之后,检查该标志(并在必要时将其重置)并相应地控制速度。

此标志可能是枚举:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM