我有一个方法,可以把球反射到墙上,也可以互相反射。每个球的半径是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坐标之间的差都是平方,它们的和是中心之间的距离。
发布于 2012-05-11 15:18:58
这就是你的问题-你发现球i和球j相撞,然后你翻转它。然后你发现球j和球i相撞,并再次翻转它们。因此,不会发生冲突。仅当j>i且一切正常时才执行碰撞检查。
发布于 2012-05-11 15:19:40
您可能只需要翻转两次,因为您的循环将发现每个collission两次。
最好确保让对象彼此远离,而不是翻转。然后在最后,让他们离开墙。否则,在拼贴直接在墙上,你可能会结束一个球实际上移动到外面!
作为一种快速修复方法,您可以更改
for(int j = i+1; j < 2; j++){请注意i+1。这就是“每次晚些时候的球”。
https://stackoverflow.com/questions/10547053
复制相似问题