Java 如何避免与libgdx的多次冲突?
我正在用java和libgdx编写我的第一个2D游戏:一个砖块破坏者 我在处理多次碰撞时遇到一些困难 让我们来解释一下:我创建了一个砖块数组(砖块扩展为矩形)。所有这些砖块的参数都与矩形相同,但我添加了4个布尔值:左、右、上、下。 当ball.y>brick.y-->up=true且所有其他值均为false时。 当up为真时,若球和砖块重叠,则ball.y*=-1。(对于位置和速度,我使用Vector2)。对于其他3个布尔值,情况完全相同(对于左侧和右侧,我使用ball.x*=-1) 及 注:vitb==球速(矢量2) 这部分工作得很好。但问题是: 我的球有10个像素的宽度和高度。因此,如果所有的砖块彼此之间至少有10个像素的距离,那么就可以了。但是如果它的数量少,球一次可以碰到两块砖。然后它就完全冻结了 我已经尝试了很多事情,我不知道该怎么办。我认为这是因为两个向量将球发送到两个不同的方向,所以我尝试了以下方法:Java 如何避免与libgdx的多次冲突?,java,libgdx,collision,Java,Libgdx,Collision,我正在用java和libgdx编写我的第一个2D游戏:一个砖块破坏者 我在处理多次碰撞时遇到一些困难 让我们来解释一下:我创建了一个砖块数组(砖块扩展为矩形)。所有这些砖块的参数都与矩形相同,但我添加了4个布尔值:左、右、上、下。 当ball.y>brick.y-->up=true且所有其他值均为false时。 当up为真时,若球和砖块重叠,则ball.y*=-1。(对于位置和速度,我使用Vector2)。对于其他3个布尔值,情况完全相同(对于左侧和右侧,我使用ball.x*=-1) 及 注:v
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();
}
所以我想问一下,如果我的球碰到两块砖头,是否有人能给我一个建议,如何避免多次碰撞
谢谢大家(如果我在英语方面犯了一些错误,请原谅)。您只需更改速度一次 当前,如果球击中两块砖块并且
x*-1*-1=x
,则您将更改它两次,这意味着您根本不会更改它
只需添加一个球需要改变方向的标志,每个帧(或模拟步骤)只能设置一次
然后在碰撞检查后,检查此标志(必要时重置),并相应地操纵速度
此标志可以是枚举:
public enum Hit
{
TOP, BOT, LEFT, RIGHT, NONE;
}
默认设置为
NONE
,这样你就可以检查球是否已经击中了什么东西。非常感谢。听起来不错,我会试试,但它不会让两块砖块同时消失吗?我不擅长砖块破坏游戏,但这不正常吗?另一方面,如果球还没有击中,检查球旗。
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();
}
if(ball.overlaps(briques.get(r))) {
briques.get(r).setRes(briques.get(r).getRes()-1);
}
if(briques.get(i).getRes() == 0) {
briques.removeIndex(i);
}
public enum Hit
{
TOP, BOT, LEFT, RIGHT, NONE;
}