Java 球之间的碰撞
我有一种方法,可以将球反射到墙上,也可以相互反射。每个球的半径是50Java 球之间的碰撞,java,collision-detection,Java,Collision Detection,我有一种方法,可以将球反射到墙上,也可以相互反射。每个球的半径是50 public void reflectBalls(){ for(int j = 0; j < 2; j++){ if(ball[j].getY() <= NWall) ball[j].flipVertical(); else if(ball[j].getY() >= (SWall - 50)) ball[j].flipVertical(); else i
public void reflectBalls(){
for(int j = 0; j < 2; j++){
if(ball[j].getY() <= NWall) ball[j].flipVertical();
else if(ball[j].getY() >= (SWall - 50)) ball[j].flipVertical();
else if(ball[j].getX() <= WWall) ball[j].flipHorizontal();
else if(ball[j].getX() >= (EWall - 50)) ball[j].flipHorizontal();
}
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++){
if(i == j){
continue;
}else{
double ax = (double)ball[i].getX();
double ay = (double)ball[i].getY();
double bx = (double)ball[j].getX();
double by = (double)ball[j].getY();
double distx = (ax-bx)*(ax-bx);
double disty = (ay-by)*(ay-by);
double distance = Math.sqrt(distx + disty);
if(Math.floor(distance) <= 100){
ball[i].flipHorizontal();
ball[j].flipVertical();
ball[i].flipVertical();
ball[j].flipHorizontal();
}
}
}
}
}
public void reflectBalls(){
对于(int j=0;j<2;j++){
如果(ball[j].getY()=(SWall-50))ball[j].flipVertical();
如果(ball[j].getX()=(EWall-50))ball[j].flipHorizontal();
}
对于(int i=0;i<2;i++){
对于(int j=0;j<2;j++){
如果(i==j){
继续;
}否则{
双ax=(双)球[i].getX();
双ay=(双)球[i].getY();
双bx=(双)球[j].getX();
double by=(双)球[j].getY();
双距离=(ax-bx)*(ax-bx);
双倍距离=(按日期)*(按日期);
双距离=数学sqrt(distx+disty);
if(数学楼层(距离)这是您的问题-您发现球i与球j碰撞,然后将其翻转。然后您发现球j与球i碰撞,然后再次翻转它们。因此,不会发生碰撞。仅在球j>i时执行碰撞检查,并且一切正常。您可能只翻转两次,因为您的循环将发现每次碰撞两次
最好确保不要翻转,而是让对象彼此远离。最后,让它们远离墙。否则,在与墙直接碰撞时,可能会导致球实际向外移动
作为快速解决方案,您可以更改
for(int j = i+1; j < 2; j++){
for(int j=i+1;j<2;j++){
注意i+1
。这是“以后的每一个球”这正是问题所在。球没有在正确的时间碰撞,但这很可能是我的数学错误。