2013-09-22 187 views
1

我正在做一个小练习,我必须初始化一个以随机速度在屏幕上移动的球物体数组。当他们碰撞时,我需要球反转速度。问题是我只能将每个球与自己比较,以便它们不断“相交”并来回放松。我有一个很好的感觉,这个问题在if语句之下,因为我将球[i]与球[i]比较,其中“i”同时是相同的数字。当我通过交叉函数的球[我],我需要比较每个元素除了自身以外的其他元素。我尝试了一些方法,但他们没有工作,并且是多余的。for循环和阵列比较问题

//为平局内环路()

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; 
    } 
+2

'比较球[I]到球[I]其中“i”同时是相同的number' - 是什么那应该是什么意思? – alfasin

+0

好的,你似乎已经注意到了这个问题(“问题是我只能比较每个球本身,以便它们不断”相交“)。你能解释一下为什么你不能比较两个不同的球吗? – SJuan76

回答

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(); 
    } 
} 
+0

谢谢你的工作 –

+0

太棒了!听到那个消息很开心。 –

+0

我需要更多的代表才能做到这一点,但我觉得我会更频繁地访问这个论坛,以积累更多。再次感谢。 –

-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();为第一球。

这个算法可能可以优化,因为当两个球碰撞时再次检查它们是没有用的,但这是一个好的开始。

+1

嗯......它仍然需要球不能比较自己。 – SJuan76

+0

是啊我试过这个,但球比较自己,所以它仍然不起作用 –

+0

我修改了代码,并纠正了,你只需要确保我!= j – SegFault

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)),可能会导致你描述的抽搐。

+1

'j = i + 1'或者检查那'j!=我' – SJuan76

+0

好点,编辑相应。 – jedwards

+0

球[j]。moveIntersectingBalls();将无法工作,因为当j将在第一个循环中检查时,moveIntersectingBalls将在同一个球上执行第二次,它将取消第一次修改(* -1) – SegFault