我正在进行一项小练习,我必须初始化一系列以随机速度在屏幕上移动的球对象。我需要球在相互碰撞时反转速度。问题是我只能将每个球与自身进行比较,以便它们不断“交叉”并来回晃动。我很好地感觉问题是在if下面的if语句中,因为我将ball [i]与ball [i]进行比较,其中“i”同时是相同的数字。当我通过交叉函数传递球[i]时,我需要将每个元素与除自身之外的所有其他元素进行比较。我尝试了一些方法,但它们没有用,而且是多余的。
// for draw()
中的循环 for(int i = 0; i < balls.length; i++){
//balls[i].drawBalls();
//balls[i].moveBalls();
***if (balls[i].intersect(balls[i])) {
balls[i].moveIntersectingBalls();
}***
}
//球交叉方法
boolean intersect(Ball b) {
float distance = dist(bXpos,bYpos,b.bXpos,b.bYpos);
if (distance < bRadius + b.bRadius) {
return true;
} else {
return false;
}
}
//如果相交方法球移动
void moveIntersectingBalls(){
bXspd *= -1;
bYspd *= -1;
}
答案 0 :(得分:1)
要将每个球与所有其他球进行比较,您需要两个for循环:
for (int i = 0; i < balls.length; i++)
{
for (int j = 0; j < balls.length; j++)
{
// Check first that you are not comparing a ball to itself.
if (i != j)
if (balls[i].intersect(balls[j]))
balls[i].moveIntersectingBalls();
}
}
答案 1 :(得分:0)
我的意思是,这段代码似乎没有多大意义:
if (balls[i].intersect(balls[i])) {
balls[i].moveIntersectingBalls();
}
但是我想你自己指出了这一点。
您正在寻找类似的东西:
for(int i = 0; i < balls.length; i++){
for(int j = (i+1); j < balls.length; j++){
if (balls[i].intersect(balls[j])) {
balls[i].moveIntersectingBalls();
// Maybe also add:
balls[j].moveIntersectingBalls();
}
}
}
你可以在i
而不是0开始内循环,因为你已经“检查过”那些。
事实上,如果你从0开始,你将检查每个球对两次(例如(1,3)和(3,1)再次)可能导致你抽搐'我描述过。
答案 2 :(得分:-1)
这里你需要的是一个双循环:
for(int i = 0; i < balls.length; i++){
for(int j = 0; j < balls.length; j++){
if (balls[i].intersect(balls[j]) && i != j) {
balls[i].moveIntersectingBalls();
}
}
}
使用双循环将每个球(第一个循环)与所有其他球(第二个循环)进行比较,如果你击中一个,则调用moveIntersecingBalls();第一球。
这个算法可能会被优化,因为当两个球碰撞时再次检查它们是没用的,但这是一个好的开始。