我有一种方法可以将球反射到墙上,也可以互相反射。每个球的半径是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 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();
}
}
}
}
}
第一部分(墙壁反射)完美无缺。但是,球不会碰撞;他们只是穿过对方。我尝试了很多不同的方法,但也许我缺少某种数学方法。我的算法基于毕达哥拉斯定理,其中X坐标和Y坐标之间的差异各自是平方的,它们的总和是中心之间的距离。
答案 0 :(得分:1)
这是你的问题 - 你发现球与球j碰撞而你翻转它。然后你发现球j与球碰撞并再次翻转。结果没有发生碰撞。如果j> 1,则仅执行碰撞检查。我和所有人都应该没事。
答案 1 :(得分:1)
你可能只是翻转两次,因为你的循环会发现每次碰撞两次。
最好确保不要翻转,而是让对象彼此移动远离。最后,让他们从墙上移开远离。否则,在直接在墙上发生碰撞时,你最终可能会将球移到外面!
作为快速解决方法,您可以更改
for(int j = i+1; j < 2; j++){
请注意i+1
。这是“每个以后球”。