【发布时间】: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);
}
所以我在这里问是否有人可以给我一个建议,告诉我如果我的球碰到两块砖,如何避免多次碰撞。
谢谢大家(如果我在英语方面犯了一些错误,请见谅)。
【问题讨论】: