如何避免与 libgdx 的多次碰撞?
How to avoid multiple collision with libgdx?
我正在使用 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 个向量在 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 == ball position // posbr == brick position // nb_br_par_ligne 是找到向上或向下的砖块的方法 "r" (nb_br_par_ligne =这里是 13,因为我每行有 13 块砖)。
在这段代码中,我试图说 "If the ball touches 2 bricks, choose the nearest, if it's the same distance, then choose the one on the left. For the other one, set all booleans to false to avoid collision." 我还添加了一些东西,使砖块仅在与球重叠并且是已选择的砖块时消失,但它不起作用。
我也试过其他的东西,但我不知道哪里出了问题。
以下两个示例工作得很好,但我不确定我是否正确地使用了它们与多重碰撞:我试图将它们放在循环中以测试是否存在多重碰撞,然后我尝试将其放入脱离循环...
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
,这样您就可以检查球是否已经击中某物。
我正在使用 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 个向量在 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 == ball position // posbr == brick position // nb_br_par_ligne 是找到向上或向下的砖块的方法 "r" (nb_br_par_ligne =这里是 13,因为我每行有 13 块砖)。
在这段代码中,我试图说 "If the ball touches 2 bricks, choose the nearest, if it's the same distance, then choose the one on the left. For the other one, set all booleans to false to avoid collision." 我还添加了一些东西,使砖块仅在与球重叠并且是已选择的砖块时消失,但它不起作用。
我也试过其他的东西,但我不知道哪里出了问题。
以下两个示例工作得很好,但我不确定我是否正确地使用了它们与多重碰撞:我试图将它们放在循环中以测试是否存在多重碰撞,然后我尝试将其放入脱离循环...
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
,这样您就可以检查球是否已经击中某物。